|
@@ -37,6 +37,57 @@ M3Datei::~M3Datei()
|
|
|
modelPos->release();
|
|
|
}
|
|
|
|
|
|
+void M3Datei::saveKnochen( Knochen *k, Datei *zDat )
|
|
|
+{
|
|
|
+ bool c = k != 0;
|
|
|
+ zDat->schreibe( (char *)& c, 1 );
|
|
|
+ if( c )
|
|
|
+ {
|
|
|
+ int id = k->getId();
|
|
|
+ zDat->schreibe( (char *)& id, 4 );
|
|
|
+ float f = k->getPosition().x;
|
|
|
+ zDat->schreibe( (char *)& f, 4 );
|
|
|
+ f = k->getPosition().y;
|
|
|
+ zDat->schreibe( (char *)& f, 4 );
|
|
|
+ f = k->getPosition().z;
|
|
|
+ zDat->schreibe( (char *)& f, 4 );
|
|
|
+ f = k->getDrehung().x;
|
|
|
+ zDat->schreibe( (char *)& f, 4 );
|
|
|
+ f = k->getDrehung().y;
|
|
|
+ zDat->schreibe( (char *)& f, 4 );
|
|
|
+ f = k->getDrehung().z;
|
|
|
+ zDat->schreibe( (char *)& f, 4 );
|
|
|
+ saveKnochen( k->zGeschwister(), zDat );
|
|
|
+ saveKnochen( k->zKind(), zDat );
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+Knochen *Framework::M3Datei::readKnochen( Datei *zDat ) const
|
|
|
+{
|
|
|
+ bool c;
|
|
|
+ zDat->lese( (char *)& c, 1 );
|
|
|
+ if( c )
|
|
|
+ {
|
|
|
+ int id;
|
|
|
+ zDat->lese( (char *)& id, 4 );
|
|
|
+ Knochen *k = new Knochen( id );
|
|
|
+ Vec3< float > pos;
|
|
|
+ zDat->lese( (char *)& pos.x, 4 );
|
|
|
+ zDat->lese( (char *)& pos.y, 4 );
|
|
|
+ zDat->lese( (char *)& pos.z, 4 );
|
|
|
+ k->setPosition( pos );
|
|
|
+ Vec3< float > rot;
|
|
|
+ zDat->lese( (char *)& rot.x, 4 );
|
|
|
+ zDat->lese( (char *)& rot.y, 4 );
|
|
|
+ zDat->lese( (char *)& rot.z, 4 );
|
|
|
+ k->setDrehung( rot );
|
|
|
+ k->addGeschwisterKnochen( readKnochen( zDat ) );
|
|
|
+ k->addKind( id, readKnochen( zDat ) );
|
|
|
+ return k;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
|
|
|
|
|
@@ -63,7 +114,7 @@ void M3Datei::leseDaten()
|
|
|
if( !d.open( Datei::Style::lesen ) )
|
|
|
return;
|
|
|
unsigned char anz = 0;
|
|
|
- d.lese( (char*)&anz, 1 );
|
|
|
+ d.lese( (char *)& anz, 1 );
|
|
|
for( int i = 0; i < anz; i++ )
|
|
|
{
|
|
|
char len = 0;
|
|
@@ -74,7 +125,7 @@ void M3Datei::leseDaten()
|
|
|
modelName->add( new Text( n ) );
|
|
|
delete[] n;
|
|
|
__int64 p = 0;
|
|
|
- d.lese( (char*)&p, 8 );
|
|
|
+ d.lese( (char *)& p, 8 );
|
|
|
modelPos->add( p );
|
|
|
}
|
|
|
d.close();
|
|
@@ -134,7 +185,7 @@ bool M3Datei::saveModel( Model3DData *zMdr, const char *name )
|
|
|
neu.schreibe( &len, 1 );
|
|
|
neu.schreibe( modelName->z( i )->getText(), len );
|
|
|
__int64 pos = modelPos->get( i );
|
|
|
- neu.schreibe( (char*)&pos, 8 );
|
|
|
+ neu.schreibe( (char *)& pos, 8 );
|
|
|
}
|
|
|
if( d.existiert() )
|
|
|
{
|
|
@@ -150,33 +201,47 @@ bool M3Datei::saveModel( Model3DData *zMdr, const char *name )
|
|
|
}
|
|
|
}
|
|
|
d.close();
|
|
|
-
|
|
|
- neu.schreibe( &pAnz, 1 );
|
|
|
+ int vAnz = zMdr->getVertexAnzahl();
|
|
|
+ neu.schreibe( (char *)& vAnz, 4 );
|
|
|
+ for( int i = 0; i < vAnz; i++ )
|
|
|
+ {
|
|
|
+ neu.schreibe( (char *)& zMdr->zVertexBuffer()[ i ].knochenId, 4 );
|
|
|
+ neu.schreibe( (char *)& zMdr->zVertexBuffer()[ i ].pos.x, 4 );
|
|
|
+ neu.schreibe( (char *)& zMdr->zVertexBuffer()[ i ].pos.y, 4 );
|
|
|
+ neu.schreibe( (char *)& zMdr->zVertexBuffer()[ i ].pos.z, 4 );
|
|
|
+ neu.schreibe( (char *)& zMdr->zVertexBuffer()[ i ].tPos.x, 4 );
|
|
|
+ neu.schreibe( (char *)& zMdr->zVertexBuffer()[ i ].tPos.y, 4 );
|
|
|
+ }
|
|
|
+ int pAnz = zMdr->getPolygonAnzahl();
|
|
|
+ neu.schreibe( (char *)& pAnz, 4 );
|
|
|
for( int p = 0; p < pAnz; p++ )
|
|
|
{
|
|
|
Polygon3D *pol = zMdr->getPolygon( p );
|
|
|
int anz = pol->indexAnz;
|
|
|
- int vAnz = pol.vertex->getEintragAnzahl();
|
|
|
- char textur = 1;
|
|
|
- for( int i = 0; i < vAnz; i++ )
|
|
|
- textur &= (char)zMdr->polygons->get( p ).tKordinaten->hat( i );
|
|
|
- neu.schreibe( &textur, 1 );
|
|
|
- neu.schreibe( (char*)&vAnz, 4 );
|
|
|
- for( int i = 0; i < vAnz; i++ )
|
|
|
- {
|
|
|
- float v = zMdr->polygons->get( p ).vertex->get( i ).x;
|
|
|
- neu.schreibe( (char*)&v, 4 );
|
|
|
- v = zMdr->polygons->get( p ).vertex->get( i ).y;
|
|
|
- neu.schreibe( (char*)&v, 4 );
|
|
|
- if( textur )
|
|
|
- {
|
|
|
- int t = zMdr->polygons->get( p ).tKordinaten->get( i ).x;
|
|
|
- neu.schreibe( (char*)&t, 4 );
|
|
|
- t = zMdr->polygons->get( p ).tKordinaten->get( i ).y;
|
|
|
- neu.schreibe( (char*)&t, 4 );
|
|
|
- }
|
|
|
- }
|
|
|
- }*/
|
|
|
+ neu.schreibe( (char *)& anz, 4 );
|
|
|
+ neu.schreibe( (char *)pol->indexList, anz * 4 );
|
|
|
+ }
|
|
|
+ float factor = zMdr->getAmbientFactor();
|
|
|
+ neu.schreibe( (char *)& factor, 4 );
|
|
|
+ factor = zMdr->getDiffusFactor();
|
|
|
+ neu.schreibe( (char *)& factor, 4 );
|
|
|
+ factor = zMdr->getSpecularFactor();
|
|
|
+ neu.schreibe( (char *)& factor, 4 );
|
|
|
+ Skelett *skelet = zMdr->copySkelett();
|
|
|
+ if( skelet )
|
|
|
+ {
|
|
|
+ bool b = 1;
|
|
|
+ neu.schreibe( (char*)&b, 1 );
|
|
|
+ int nId = skelet->zNextKnochenId();
|
|
|
+ neu.schreibe( (char *)& nId, 4 );
|
|
|
+ saveKnochen( skelet->zKnochen(), &neu );
|
|
|
+ skelet->release();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ bool b = 0;
|
|
|
+ neu.schreibe( (char *)& b, 1 );
|
|
|
+ }
|
|
|
d.remove();
|
|
|
neu.close();
|
|
|
neu.umbenennen( pfad );
|
|
@@ -189,7 +254,9 @@ bool M3Datei::saveModel( Model3DData *zMdr, const char *name )
|
|
|
|
|
|
bool M3Datei::removeModel( Text *name )
|
|
|
{
|
|
|
- return 0;
|
|
|
+ bool res = removeModel( name->getText() );
|
|
|
+ name->release();
|
|
|
+ return res;
|
|
|
}
|
|
|
|
|
|
|
|
@@ -197,6 +264,7 @@ bool M3Datei::removeModel( Text *name )
|
|
|
|
|
|
bool M3Datei::removeModel( const char *name )
|
|
|
{
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -205,7 +273,9 @@ bool M3Datei::removeModel( const char *name )
|
|
|
|
|
|
Model3DData *M3Datei::ladeModel( Text *name ) const
|
|
|
{
|
|
|
- return 0;
|
|
|
+ Model3DData *d = ladeModel( name->getText() );
|
|
|
+ name->release();
|
|
|
+ return d;
|
|
|
}
|
|
|
|
|
|
|
|
@@ -213,6 +283,70 @@ Model3DData *M3Datei::ladeModel( Text *name ) const
|
|
|
|
|
|
Model3DData *M3Datei::ladeModel( const char *name ) const
|
|
|
{
|
|
|
+ __int64 pos = -1;
|
|
|
+ auto p = modelPos->getIterator();
|
|
|
+ for( auto n = modelName->getIterator(); n && p; n++, p++ )
|
|
|
+ {
|
|
|
+ if( n->istGleich( name ) )
|
|
|
+ {
|
|
|
+ pos = p;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if( pos > 0 )
|
|
|
+ {
|
|
|
+ Datei d;
|
|
|
+ d.setDatei( pfad );
|
|
|
+ if( !d.open( Datei::Style::lesen ) )
|
|
|
+ {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ d.setLPosition( pos, 0 );
|
|
|
+ Model3DData *model = new Model3DData();
|
|
|
+ int vAnz;
|
|
|
+ d.lese( (char *)& vAnz, 4 );
|
|
|
+ Vertex3D *vertices = new Vertex3D[ vAnz ];
|
|
|
+ for( int i = 0; i < vAnz; i++ )
|
|
|
+ {
|
|
|
+ d.lese( (char *)& vertices[ i ].knochenId, 4 );
|
|
|
+ d.lese( (char *)& vertices[ i ].pos.x, 4 );
|
|
|
+ d.lese( (char *)& vertices[ i ].pos.y, 4 );
|
|
|
+ d.lese( (char *)& vertices[ i ].pos.z, 4 );
|
|
|
+ d.lese( (char *)& vertices[ i ].tPos.x, 4 );
|
|
|
+ d.lese( (char *)& vertices[ i ].tPos.y, 4 );
|
|
|
+ }
|
|
|
+ model->setVertecies( vertices, vAnz );
|
|
|
+ int pAnz;
|
|
|
+ d.lese( (char *)& pAnz, 4 );
|
|
|
+ for( int i = 0; i < pAnz; i++ )
|
|
|
+ {
|
|
|
+ Polygon3D *p = new Polygon3D();
|
|
|
+ d.lese( (char *)& p->indexAnz, 4 );
|
|
|
+ p->indexList = new int[ p->indexAnz ];
|
|
|
+ d.lese( (char *)p->indexList, pAnz * 4 );
|
|
|
+ model->addPolygon( p );
|
|
|
+ }
|
|
|
+ float factor;
|
|
|
+ d.lese( (char *)& factor, 4 );
|
|
|
+ model->setAmbientFactor( factor );
|
|
|
+ d.lese( (char *)& factor, 4 );
|
|
|
+ model->setDiffusFactor( factor );
|
|
|
+ d.lese( (char *)& factor, 4 );
|
|
|
+ model->setSpecularFactor( factor );
|
|
|
+ bool b;
|
|
|
+ d.lese( (char *)& b, 1 );
|
|
|
+ if( b )
|
|
|
+ {
|
|
|
+ Skelett *s = new Skelett();
|
|
|
+ int nId;
|
|
|
+ d.lese( (char *)& nId, 4 );
|
|
|
+ s->setNextKnochenId( nId );
|
|
|
+ s->addKnochen( readKnochen( &d ) );
|
|
|
+ model->setSkelettZ( s );
|
|
|
+ }
|
|
|
+ d.close();
|
|
|
+ return model;
|
|
|
+ }
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -221,13 +355,18 @@ Model3DData *M3Datei::ladeModel( const char *name ) const
|
|
|
|
|
|
bool M3Datei::hatModel( const char *name ) const
|
|
|
{
|
|
|
+ for( auto n = modelName->getIterator(); n; n++ )
|
|
|
+ {
|
|
|
+ if( n->istGleich( name ) )
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
|
|
|
int M3Datei::getModelAnzahl() const
|
|
|
{
|
|
|
- return 0;
|
|
|
+ return modelName->getEintragAnzahl();
|
|
|
}
|
|
|
|
|
|
|
|
@@ -235,19 +374,22 @@ int M3Datei::getModelAnzahl() const
|
|
|
|
|
|
Text *M3Datei::zModelName( int i ) const
|
|
|
{
|
|
|
- return 0;
|
|
|
+ return modelName->z( i );
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
M3Datei *M3Datei::getThis()
|
|
|
{
|
|
|
- return 0;
|
|
|
+ ref++;
|
|
|
+ return this;
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
M3Datei *M3Datei::release()
|
|
|
{
|
|
|
+ if( !--ref )
|
|
|
+ delete this;
|
|
|
return 0;
|
|
|
}
|