diff --git a/TODO b/TODO
index dc6f1c8..ccc251f 100644
--- a/TODO
+++ b/TODO
@@ -14,22 +14,20 @@ Clump & related:
texcoord
- implement plugins:
Clump
- Collision
+ R* Collision
Frame
HAnim
Atomic
- Right To Render
- (Particles)
- Pipeline Set
+ ((Particles))
+ R* Pipeline Set
Geometry
-Native Data
- (Morph)
+ ((Morph))
-Skin
- 2dfx
+ R* 2dfx
Material
- Right To Render
- Reflection mat
- Specular Mat
+ R* Reflection mat
+ R* Specular Mat
UV Anim
Texture
(Sky Mipmap Val)
diff --git a/src/clump.cpp b/src/clump.cpp
index 1acfec9..3c9b4e6 100644
--- a/src/clump.cpp
+++ b/src/clump.cpp
@@ -15,6 +15,7 @@ namespace Rw {
Frame::Frame(void)
{
+ this->parent = NULL;
this->child = NULL;
this->next = NULL;
this->root = NULL;
@@ -24,6 +25,7 @@ Frame::Frame(void)
this->matrix[5] = 1.0f;
this->matrix[10] = 1.0f;
this->matrix[15] = 1.0f;
+ this->dirty = true;
constructPlugins();
}
@@ -98,6 +100,33 @@ Frame::count(void)
return count;
}
+void
+Frame::updateLTM(void)
+{
+ if(!this->dirty)
+ return;
+ Frame *parent = (Frame*)this->parent;
+ if(parent){
+ parent->updateLTM();
+#define L(i,j) this->ltm[i*4+j]
+#define A(i,j) parent->ltm[i*4+j]
+#define B(i,j) this->matrix[i*4+j]
+ for(int i = 0; i < 4; i++)
+ for(int j = 0; j < 4; j++)
+ L(i,j) = A(0,j)*B(i,0)
+ + A(1,j)*B(i,1)
+ + A(2,j)*B(i,2)
+ + A(3,j)*B(i,3);
+#undef L
+#undef A
+#undef B
+ this->dirty = false;
+ }else{
+ memcpy(this->ltm, this->matrix, 16*4);
+ this->dirty = false;
+ }
+}
+
static Frame*
sizeCB(Frame *f, void *size)
{
@@ -323,9 +352,9 @@ Clump::frameListStreamRead(Stream *stream, Frame ***flp, int32 *nf)
f->matrix[13] = buf.pos[1];
f->matrix[14] = buf.pos[2];
f->matrix[15] = 1.0f;
+ f->matflag = buf.matflag;
if(buf.parent >= 0)
frameList[buf.parent]->addChild(f);
- f->matflag = buf.matflag;
}
for(int32 i = 0; i < numFrames; i++)
frameList[i]->streamReadPlugins(stream);
@@ -447,12 +476,7 @@ Atomic::streamGetSize(void)
static void
readAtomicRights(Stream *stream, int32, void *, int32, int32)
{
-// uint32 version;
-//stream->seek(-4);
-//version = stream->readU32();
stream->read(atomicRights, 8);
-// printf("atomicrights: %s %X %X %X\n", DebugFile, LibraryIDUnpackVersion(version), buffer[0], buffer[1]);
-// printf("atomicrights: %X %X %X\n", LibraryIDUnpackVersion(version), buffer[0], buffer[1]);
}
static void
diff --git a/src/rwobjects.h b/src/rwobjects.h
index 3191908..4fa9ffa 100644
--- a/src/rwobjects.h
+++ b/src/rwobjects.h
@@ -27,6 +27,7 @@ struct Frame : PluginBase, Object
// temporary
int32 matflag;
+ bool dirty;
Frame(void);
Frame(Frame *f);
@@ -35,6 +36,7 @@ struct Frame : PluginBase, Object
Frame *removeChild(void);
Frame *forAllChildren(Callback cb, void *data);
int32 count(void);
+ void updateLTM(void);
};
struct Image