<div dir="ltr"><span style="font-size:12.8px">Alright, it works. Sort off. Except for that ugly mesh deformation issue. I wonder if somebody could set me in the right direction from here.</span><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">Here's how it's done:</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">I load position and orientation controllers for every animation node, which pretty much does it for the skeleton (also heads, since they're attached to the headhook).</div><div style="font-size:12.8px">I load bone mapping from skin mesh header and per vertex bone data from MDX (as described <a href="https://github.com/xoreos/xoreos-docs/blob/master/specs/kotor_mdl.html" target="_blank">here</a>).</div><div style="font-size:12.8px">When animation gets updated I iterate through model's skinned nodes and for every vertex do the following:</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">I iterate over nodes (bones) that affect the vertex and create each node's global transformation matrix (relative to the root node). Then I multiply initial vertex coordinates by the transformation matrix and multiply that by the bone weight. Resulting vertex coordinates are calculated as a sum of four transformed vertices. There are some optimizations in place so it isn't quite as bad as it sounds.</div><div style="font-size:12.8px"><br></div><div><div style="font-size:12.8px"> <span style="white-space:pre-wrap">           </span>for (uint32 i = 0; i < vertexCount; ++i) {</div><div style="font-size:12.8px"><div> <span style="white-space:pre-wrap">                    </span>v[0] = 0;</div><div> <span style="white-space:pre-wrap">                      </span>v[1] = 0;</div><div> <span style="white-space:pre-wrap">                      </span>v[2] = 0;</div><div> <span style="white-space:pre-wrap">                      </span>for (uint8 j = 0; j < 4; ++j) {</div><div> <span style="white-space:pre-wrap">                             </span>int index = static_cast<int>(b[4 + j]);</div><div> <span style="white-space:pre-wrap">                          </span>if (index != -1) {</div><div> <span style="white-space:pre-wrap">                                     </span>float rv[3];</div><div> <span style="white-space:pre-wrap">                                   </span>transform = transArr + (index * 16);</div><div> <span style="white-space:pre-wrap">                                   </span>transform.multiply(iv, rv);</div><div> <span style="white-space:pre-wrap">                                    </span>v[0] += rv[0] * b[j];</div><div> <span style="white-space:pre-wrap">                                  </span>v[1] += rv[1] * b[j];</div><div> <span style="white-space:pre-wrap">                                  </span>v[2] += rv[2] * b[j];</div><div> <span style="white-space:pre-wrap">                          </span>}</div><div> <span style="white-space:pre-wrap">                      </span>}</div><div> <span style="white-space:pre-wrap">                      </span>v += stride;</div><div> <span style="white-space:pre-wrap">                   </span>iv += 3;</div><div> <span style="white-space:pre-wrap">                       </span>b += 8;</div><div> <span style="white-space:pre-wrap">                </span>}</div></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">Now, the problem is that weird stretching issue. I have no idea what could cause that at the moment.</div><div style="font-size:12.8px"><a href="goog_555208919"><br></a></div><div><span style="font-size:12.8px"><a href="https://yadi.sk/i/0hnd2a0M3MMYJR">https://yadi.sk/i/0hnd2a0M3MMYJR</a></span><br></div></div><div><span style="font-size:12.8px"><a href="https://yadi.sk/i/jdiTSrXZ3MMYL3">https://yadi.sk/i/jdiTSrXZ3MMYL3</a></span><br></div><div><span style="font-size:12.8px"><a href="https://yadi.sk/i/Vm3kRTVf3MMYKQ">https://yadi.sk/i/Vm3kRTVf3MMYKQ</a></span><br></div><div><span style="font-size:12.8px"><br></span></div></div>