// $Header: /cvs/gled-1.2/TADemo/Glasses/TA_SubUnit.cxx,v 1.1.1.1 2005/05/19 14:15:27 matevz Exp $
#include "TA_SubUnit.h"
#include "TA_Unit.h"
#include "TA_SubUnit.c7"
#include "TA_TextureContainer.h"
#include <Glasses/ZQueen.h>
ClassImp(TA_SubUnit)
struct o3dVert { long x, y, z; };
struct o3dPrim {
long Unknown_0;
long NumberOfVertexIndexes;
long Always_0;
long OffsetToVertexIndexArray;
long OffsetToTextureName;
long Unknown_1;
long Unknown_2;
long Unknown_3;
};
struct o3dInfo {
long VersionSignature;
long NumberOfVertexes;
long NumberOfPrimitives;
long UnknownFlag;
long XFromParent;
long YFromParent;
long ZFromParent;
long OffsetToObjectName;
long Always_0;
long OffsetToVertexArray;
long OffsetToPrimitiveArray;
long OffsetToSiblingObject;
long OffsetToChildObject;
};
void
_TA_Prim::calc_normal(float* v0, float* v1, float* v2) {
float d0[3], d1[3];
d0[0] = v1[0] - v0[0]; d1[0] = v2[0] - v0[0];
d0[1] = v1[1] - v0[1]; d1[1] = v2[1] - v0[1];
d0[2] = v1[2] - v0[2]; d1[2] = v2[2] - v0[2];
fNormal[0] = d0[1]*d1[2] - d0[2]*d1[1];
fNormal[1] = d0[2]*d1[0] - d0[0]*d1[2];
fNormal[2] = d0[0]*d1[1] - d0[1]*d1[0];
float s = sqrt(fNormal[0]*fNormal[0] + fNormal[1]*fNormal[1] + fNormal[2]*fNormal[2]);
fNormal[0] /= s; fNormal[1] /= s; fNormal[2] /= s;
}
/**************************************************************************/
namespace {
float SAFR = 1e-6;
}
void
TA_SubUnit::build(TA_Unit* u, o3dInfo* i, char* data)
{
// Build from raw data.
// Transform to Gled coordinate system: x-forward, y-left, z-up.
mUnit = u; mInfo = i;
mName = (char*)(data + mInfo->OffsetToObjectName);
mXoff = -SAFR * mInfo->ZFromParent;
mYoff = -SAFR * mInfo->XFromParent;
mZoff = SAFR * mInfo->YFromParent;
MoveLF(1, mXoff); MoveLF(2, mYoff); MoveLF(3, mZoff);
// Vertex Array
mNVert = mInfo->NumberOfVertexes; pVert = new float[3*mNVert];
for(int i=0; i<mNVert; ++i) {
int o = 3*i;
o3dVert* v = (o3dVert*)(data + mInfo->OffsetToVertexArray + i*sizeof(o3dVert));
pVert[o] = -v->z*SAFR; pVert[o+1] = -v->x*SAFR; pVert[o+2] = v->y*SAFR;
}
// Primitives & Normals
mNPrim = mInfo->NumberOfPrimitives;
o3dPrim* p_beg = (o3dPrim*)(data + mInfo->OffsetToPrimitiveArray);
for(int i=0; i<mNPrim; ++i) {
o3dPrim* p = p_beg + i;
unsigned short* x = (unsigned short*)(data + p->OffsetToVertexIndexArray);
char* tname = p->OffsetToTextureName ? data + p->OffsetToTextureName : 0;
_TA_Prim ta_prim(tname, p->NumberOfVertexIndexes);
if(p->NumberOfVertexIndexes >= 3) {
ta_prim.calc_normal(&pVert[3*x[0]], &pVert[3*x[1]], &pVert[3*x[2]]);
}
for(int j=0; j<ta_prim.fN; ++j) ta_prim.fIndices[j] = x[j];
mPrims.push_back(ta_prim);
}
// Family business
if(mInfo->OffsetToChildObject) {
o3dInfo* ci = (o3dInfo*)(data + mInfo->OffsetToChildObject);
do {
TA_SubUnit* child = new TA_SubUnit;
mQueen->CheckIn(child);
Add(child);
child->build(mUnit, ci, data);
ci = ci->OffsetToSiblingObject ?
(o3dInfo*)(data + ci->OffsetToSiblingObject) : 0;
} while(ci);
}
Stamp();
}
ROOT page - Home page - Class index - Class Hierarchy - Top of the page
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.