diff --git a/contrib/vmap_extractor_v2/vmapextract/model.cpp b/contrib/vmap_extractor_v2/vmapextract/model.cpp index 7dca7841d..31962a001 100644 --- a/contrib/vmap_extractor_v2/vmapextract/model.cpp +++ b/contrib/vmap_extractor_v2/vmapextract/model.cpp @@ -1,11 +1,7 @@ -//#include "common.h" #include "model.h" -//#include "world.h" #include #include -//int globalTime = 0; - Model::Model(std::string &filename) : filename(filename) { } @@ -24,43 +20,24 @@ bool Model::open() } memcpy(&header, f.getBuffer(), sizeof(ModelHeader)); - if(header.nBoundingTriangles > 0) { - -#if 0 - animated = isAnimated(f); - if(animated) + if(header.nBoundingTriangles > 0) + { + f.seek(0); + f.seekRelative(header.ofsBoundingVertices); + vertices = new Vec3D[header.nBoundingVertices]; + f.read(vertices,header.nBoundingVertices*12); + for (uint32 i=0; iofsIndex); - uint16 *triangles = (uint16*)(f.getBuffer() + view->ofsTris); - - nIndices = view->nTris; - indices = new uint16[nIndices]; - for (size_t i = 0; i0) { - ModelBoneDef &bb = bo[verts[i].bones[b]]; - if (bb.translation.type || bb.rotation.type || bb.scaling.type || (bb.flags&8)) { - if (bb.flags&8) { - // if we have billboarding, the model will need per-instance animation - ind = true; - } - animGeometry = true; - break; - } - } - } - } - - if (animGeometry) animBones = true; - else { - for (size_t i=0; i 0; - - bool animMisc = header.nCameras>0 || // why waste time, pretty much all models with cameras need animation - header.nLights>0 || // same here - header.nParticleEmitters>0 || - header.nRibbonEmitters>0; - - if (animMisc) animBones = true; - - // animated colors - if (header.nColors) { - ModelColorDef *cols = (ModelColorDef*)(f.getBuffer() + header.ofsColors); - for (size_t i=0; i0) + fwrite(&nIndexes, sizeof(uint32), 1, output); + if(nIndexes >0) { - fwrite(indices, sizeof(unsigned short), nIdexes, output); + fwrite(indices, sizeof(unsigned short), nIndexes, output); } fwrite("VERT",4, 1, output); wsize = sizeof(int) + sizeof(float) * 3 * nVertices; @@ -178,7 +86,7 @@ bool Model::ConvertToVMAPModel(char * outfilename) fwrite(&nVertices, sizeof(int), 1, output); if(nVertices >0) { - for(int vpos=0; vpos class Model; @@ -18,18 +17,14 @@ Vec3D fixCoordSystem(Vec3D v); class Model { public: + ModelHeader header; - ModelAnimation *anims; - int *globalSequences; public: - bool animGeometry,animTextures,animBones; - bool animated; - bool isAnimated(MPQFile &f); - ModelVertex *origVertices; - Vec3D *vertices, *normals; - uint16 *indices; + uint32 offsBB_vertices, offsBB_indices; + Vec3D *BB_vertices, *vertices; + uint16 *BB_indices, *indices; size_t nIndices; bool open(); @@ -38,12 +33,6 @@ public: public: bool ok; - bool ind; - - float rad; - float trans; - bool animcalc; - int anim, animtime; Model(std::string &filename); ~Model(); @@ -59,15 +48,9 @@ public: Model *model; int id; - Vec3D pos, rot; unsigned int d1, scale; - - float frot,w,sc; - - int light; - Vec3D ldir; - Vec3D lcol; + float w,sc; ModelInstance() {} ModelInstance(MPQFile &f,const char* ModelInstName,const char*MapName, FILE *pDirfile); diff --git a/contrib/vmap_extractor_v2/vmapextract/modelheaders.h b/contrib/vmap_extractor_v2/vmapextract/modelheaders.h index 7d5e800e7..c35b983c1 100644 --- a/contrib/vmap_extractor_v2/vmapextract/modelheaders.h +++ b/contrib/vmap_extractor_v2/vmapextract/modelheaders.h @@ -15,289 +15,67 @@ struct ModelHeader { uint8 version[4]; uint32 nameLength; uint32 nameOfs; - uint32 type; - + uint32 type; uint32 nGlobalSequences; uint32 ofsGlobalSequences; uint32 nAnimations; uint32 ofsAnimations; - uint32 nC; - uint32 ofsC; - uint32 nD; - uint32 ofsD; - uint32 nBones; - uint32 ofsBones; - uint32 nF; - uint32 ofsF; - + uint32 nAnimationLookup; + uint32 ofsAnimationLookup; + uint32 nBones; + uint32 ofsBones; + uint32 nKeyBoneLookup; + uint32 ofsKeyBoneLookup; uint32 nVertices; uint32 ofsVertices; uint32 nViews; - uint32 ofsViews; - uint32 nColors; uint32 ofsColors; - uint32 nTextures; uint32 ofsTextures; - - uint32 nTransparency; // H + uint32 nTransparency; uint32 ofsTransparency; - uint32 nI; // always unused ? - uint32 ofsI; - uint32 nTexAnims; // J - uint32 ofsTexAnims; - uint32 nK; - uint32 ofsK; - - uint32 nTexFlags; - uint32 ofsTexFlags; - uint32 nY; - uint32 ofsY; - - uint32 nTexLookup; - uint32 ofsTexLookup; - - uint32 nTexUnitLookup; // L - uint32 ofsTexUnitLookup; - uint32 nTransparencyLookup; // M - uint32 ofsTransparencyLookup; - uint32 nTexAnimLookup; - uint32 ofsTexAnimLookup; - - float floats[14]; - - uint32 nBoundingTriangles; - uint32 ofsBoundingTriangles; - uint32 nBoundingVertices; - uint32 ofsBoundingVertices; - uint32 nBoundingNormals; - uint32 ofsBoundingNormals; - - uint32 nO; - uint32 ofsO; - uint32 nP; - uint32 ofsP; - uint32 nQ; - uint32 ofsQ; - uint32 nLights; // R - uint32 ofsLights; - uint32 nCameras; // S - uint32 ofsCameras; - uint32 nT; - uint32 ofsT; - uint32 nRibbonEmitters; // U - uint32 ofsRibbonEmitters; - uint32 nParticleEmitters; // V - uint32 ofsParticleEmitters; - + uint32 nTextureanimations; + uint32 ofsTextureanimations; + uint32 nTexReplace; + uint32 ofsTexReplace; + uint32 nRenderFlags; + uint32 ofsRenderFlags; + uint32 nBoneLookupTable; + uint32 ofsBoneLookupTable; + uint32 nTexLookup; + uint32 ofsTexLookup; + uint32 nTexUnits; + uint32 ofsTexUnits; + uint32 nTransLookup; + uint32 ofsTransLookup; + uint32 nTexAnimLookup; + uint32 ofsTexAnimLookup; + float floats[14]; + uint32 nBoundingTriangles; + uint32 ofsBoundingTriangles; + uint32 nBoundingVertices; + uint32 ofsBoundingVertices; + uint32 nBoundingNormals; + uint32 ofsBoundingNormals; + uint32 nAttachments; + uint32 ofsAttachments; + uint32 nAttachLookup; + uint32 ofsAttachLookup; + uint32 nAttachments_2; + uint32 ofsAttachments_2; + uint32 nLights; + uint32 ofsLights; + uint32 nCameras; + uint32 ofsCameras; + uint32 nCameraLookup; + uint32 ofsCameraLookup; + uint32 nRibbonEmitters; + uint32 ofsRibbonEmitters; + uint32 nParticleEmitters; + uint32 ofsParticleEmitters; }; -// block B - animations -struct ModelAnimation { - uint32 animID; - uint32 timeStart; - uint32 timeEnd; - - float moveSpeed; - - uint32 loopType; - uint32 flags; - uint32 d1; - uint32 d2; - uint32 playSpeed; // note: this can't be play speed because it's 0 for some models - - Vec3D boxA, boxB; - float rad; - - int16 s[2]; -}; - - -// sub-block in block E - animation data -struct AnimationBlock { - int16 type; // interpolation type (0=none, 1=linear, 2=hermite) - int16 seq; // global sequence id or -1 - uint32 nRanges; - uint32 ofsRanges; - uint32 nTimes; - uint32 ofsTimes; - uint32 nKeys; - uint32 ofsKeys; -}; - -// block E - bones -struct ModelBoneDef { - int32 animid; - int32 flags; - int16 parent; // parent bone index - int16 geoid; - // new int added to the bone definitions. Added in WoW 2.0 - int32 unknown; - AnimationBlock translation; - AnimationBlock rotation; - AnimationBlock scaling; - Vec3D pivot; -}; - -struct ModelTexAnimDef { - AnimationBlock trans, rot, scale; -}; - -struct ModelVertex { - Vec3D pos; - uint8 weights[4]; - uint8 bones[4]; - Vec3D normal; - Vec2D texcoords; - int unk1, unk2; // always 0,0 so this is probably unused -}; - -struct ModelView { - uint32 nIndex, ofsIndex; // Vertices in this model (index into vertices[]) - uint32 nTris, ofsTris; // indices - uint32 nProps, ofsProps; // additional vtx properties - uint32 nSub, ofsSub; // materials/renderops/submeshes - uint32 nTex, ofsTex; // material properties/textures - int32 lod; // LOD bias? -}; - - -/// One material + render operation -struct ModelGeoset { - uint16 d1; // mesh part id? - uint16 d2; // ? - uint16 vstart; // first vertex - uint16 vcount; // num vertices - uint16 istart; // first index - uint16 icount; // num indices - uint16 d3; // number of bone indices - uint16 d4; // offset into bone index list - uint16 d5; // ? - uint16 d6; // root bone? - Vec3D v; - float unknown[4]; // Added in WoW 2.0? -}; - -/// A texture unit (sub of material) -struct ModelTexUnit{ - // probably the texture units - // size always >=number of materials it seems - uint16 flags; // Flags - uint16 order; // ? - uint16 op; // Material this texture is part of (index into mat) - uint16 op2; // Always same as above? - int16 colorIndex; // color or -1 - uint16 flagsIndex; // more flags... - uint16 texunit; // Texture unit (0 or 1) - uint16 d4; // ? (seems to be always 1) - uint16 textureid; // Texture id (index into global texture list) - uint16 texunit2; // copy of texture unit value? - uint16 transid; // transparency id (index into transparency list) - uint16 texanimid; // texture animation id -}; - -// block X - render flags -struct ModelRenderFlags { - uint16 flags; - uint16 blend; -}; - -// block G - color defs -struct ModelColorDef { - AnimationBlock color; - AnimationBlock opacity; -}; - -// block H - transp defs -struct ModelTransDef { - AnimationBlock trans; -}; - -struct ModelTextureDef { - uint32 type; - uint32 flags; - uint32 nameLen; - uint32 nameOfs; -}; - -struct ModelLightDef { - int16 type; - int16 bone; - Vec3D pos; - AnimationBlock ambColor; - AnimationBlock ambIntensity; - AnimationBlock color; - AnimationBlock intensity; - AnimationBlock attStart; - AnimationBlock attEnd; - AnimationBlock unk1; -}; - -struct ModelCameraDef { - int32 id; - float fov, farclip, nearclip; - AnimationBlock transPos; - Vec3D pos; - AnimationBlock transTarget; - Vec3D target; - AnimationBlock rot; -}; - - -struct ModelParticleParams { - float mid; - uint32 colors[3]; - float sizes[3]; - int16 d[10]; - float unk[3]; - float scales[3]; - float slowdown; - float rotation; - float f2[16]; -}; - -struct ModelParticleEmitterDef { - int32 id; - int32 flags; - Vec3D pos; - int16 bone; - int16 texture; - int32 nZero1; - int32 ofsZero1; - int32 nZero2; - int32 ofsZero2; - int16 blend; - int16 type; - int16 s1; - int16 s2; - int16 cols; - int16 rows; - AnimationBlock params[10]; - ModelParticleParams p; - AnimationBlock unk; -}; - - -struct ModelRibbonEmitterDef { - int32 id; - int32 bone; - Vec3D pos; - int32 nTextures; - int32 ofsTextures; - int32 nUnknown; - int32 ofsUnknown; - AnimationBlock color; - AnimationBlock opacity; - AnimationBlock above; - AnimationBlock below; - float res, length, unk; - int16 s1, s2; - AnimationBlock unk1; - AnimationBlock unk2; -}; - - #pragma pack(pop)