Reverted some stuff od the optimized .x splitting back to working version from Luke. Simplified some mesh loader parts in several formats.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@920 dfc29bdd-3216-0410-991c-e03cc46cb475
master
hybrid 2007-09-07 14:18:47 +00:00
parent 04ed098fe8
commit b299e9c4ea
5 changed files with 82 additions and 101 deletions

View File

@ -77,7 +77,6 @@ CAnimatedMeshMD3::~CAnimatedMeshMD3()
{
if ( Mesh )
Mesh->drop ();
}
@ -199,19 +198,18 @@ IMeshBuffer * CAnimatedMeshMD3::createMeshBuffer ( const SMD3MeshBuffer * source
return dest;
}
//! build final mesh's vertices from frames frameA and frameB with linear interpolation.
void CAnimatedMeshMD3::buildVertexArray ( u32 frameA, u32 frameB, f32 interpolate,
const SMD3MeshBuffer * source,
SMeshBuffer * dest
)
{
u32 i;
u32 frameOffsetA = frameA * source->MeshHeader.numVertices;
u32 frameOffsetB = frameB * source->MeshHeader.numVertices;
const u32 frameOffsetA = frameA * source->MeshHeader.numVertices;
const u32 frameOffsetB = frameB * source->MeshHeader.numVertices;
const f32 scale = ( 1.f/ 64.f );
for ( i = 0; i!= (u32)source->MeshHeader.numVertices; ++i )
for (s32 i = 0; i != source->MeshHeader.numVertices; ++i)
{
video::S3DVertex &v = dest->Vertices [ i ];
@ -239,11 +237,10 @@ void CAnimatedMeshMD3::buildVertexArray ( u32 frameA, u32 frameB, f32 interpolat
//! build final mesh's tag from frames frameA and frameB with linear interpolation.
void CAnimatedMeshMD3::buildTagArray ( u32 frameA, u32 frameB, f32 interpolate )
{
u32 i;
u32 frameOffsetA = frameA * Mesh->MD3Header.numTags;
u32 frameOffsetB = frameB * Mesh->MD3Header.numTags;
const u32 frameOffsetA = frameA * Mesh->MD3Header.numTags;
const u32 frameOffsetB = frameB * Mesh->MD3Header.numTags;
for ( i = 0; i!= (u32)Mesh->MD3Header.numTags; ++i )
for ( s32 i = 0; i != Mesh->MD3Header.numTags; ++i )
{
SMD3QuaterionTag &d = TagListIPol [ i ];
@ -269,8 +266,6 @@ bool CAnimatedMeshMD3::loadModelFile( u32 modelIndex, io::IReadFile* file)
if (!file)
return false;
file->seek(0);
//! Check MD3Header
{
file->read( &Mesh->MD3Header, sizeof(SMD3Header) );
@ -291,7 +286,7 @@ bool CAnimatedMeshMD3::loadModelFile( u32 modelIndex, io::IReadFile* file)
SMD3Tag import;
SMD3QuaterionTag exp;
u32 i,g;
u32 i;
file->seek( Mesh->MD3Header.tagStart );
for (i = 0; i != totalTags; ++i )
@ -340,7 +335,7 @@ bool CAnimatedMeshMD3::loadModelFile( u32 modelIndex, io::IReadFile* file)
//! read skins (shaders)
file->seek( offset + buf->MeshHeader.offset_shaders );
for ( g = 0; g != (u32)buf->MeshHeader.numShader; ++g )
for ( s32 g = 0; g != buf->MeshHeader.numShader; ++g )
{
file->read( &skin, sizeof(skin) );
buf->Shader.push_back ( skin.name );

View File

@ -49,7 +49,8 @@ COCTLoader::~COCTLoader()
// Doesn't really belong here, but it's jammed in for now.
void COCTLoader::OCTLoadLights(irr::io::IReadFile* file, irr::scene::ISceneManager * scene, irr::scene::ISceneNode * parent, f32 radius, f32 intensityScale, bool rewind)
{
if (rewind) file->seek(0);
if (rewind)
file->seek(0);
octHeader header;
file->read(&header, sizeof(octHeader));
@ -64,14 +65,9 @@ void COCTLoader::OCTLoadLights(irr::io::IReadFile* file, irr::scene::ISceneManag
//TODO: Skip past my extended data just for good form
u32 i;
for (i = 0; i < header.numLights; i++)
for (u32 i = 0; i < header.numLights; i++)
{
f32 intensity;
intensity = lights[i].intensity * intensityScale;
//irr::scene::ISceneNode* node = scene->addCubeSceneNode(30,parent,-1, core::vector3df(lights[i].pos[0], lights[i].pos[2], lights[i].pos[1]));
//node->getMaterial(0).AmbientColor = video::SColorf(lights[i].color[0] * intensity, lights[i].color[1] * intensity, lights[i].color[2] * intensity).toSColor();
const f32 intensity = lights[i].intensity * intensityScale;
scene->addLightSceneNode(parent, core::vector3df(lights[i].pos[0], lights[i].pos[2], lights[i].pos[1]),
video::SColorf(lights[i].color[0] * intensity, lights[i].color[1] * intensity, lights[i].color[2] * intensity, 1.0f),
@ -81,27 +77,8 @@ void COCTLoader::OCTLoadLights(irr::io::IReadFile* file, irr::scene::ISceneManag
//! given three points representing a face, return a face normal
void COCTLoader::GetFaceNormal(f32 a[3], f32 b[3], f32 c[3], f32 out[3]) {
f32 v1[3], v2[3];
v1[0] = a[0] - b[0];
v1[1] = a[1] - b[1];
v1[2] = a[2] - b[2];
v2[0] = b[0] - c[0];
v2[1] = b[1] - c[1];
v2[2] = b[2] - c[2];
out[0] = (v1[1] * v2[2]) - (v1[2] * v2[1]);
out[1] = (v1[2] * v2[0]) - (v1[0] * v2[2]);
out[2] = (v1[0] * v2[1]) - (v1[1] * v2[0]);
f32 dist = (f32)sqrt((out[0] * out[0]) + (out[1] * out[1]) + (out[2] * out[2]));
if (dist == 0.0f) dist = 0.001f;
out[0] /= dist;
out[1] /= dist;
out[2] /= dist;
core::vector3df COCTLoader::GetFaceNormal(f32 a[3], f32 b[3], f32 c[3]) {
return core::plane3df(core::vector3df(a[0],a[1],a[2]), core::vector3df(b[0],c[1],c[2]), core::vector3df(c[0],c[1],c[2])).Normal;
}
@ -154,40 +131,41 @@ IAnimatedMesh* COCTLoader::createMesh(irr::io::IReadFile* file)
scene::SMeshBufferLightMap* buffer = new scene::SMeshBufferLightMap();
buffer->Material.MaterialType = video::EMT_LIGHTMAP;
buffer->Material.Wireframe = false;
buffer->Material.Lighting = false;
Mesh->addMeshBuffer(buffer);
buffer->drop();
}
// Build the mesh buffers
for (i = 0; i < header.numFaces; i++) {
if (faces[i].numVerts < 3) continue;
for (i = 0; i < header.numFaces; i++)
{
if (faces[i].numVerts < 3)
continue;
f32 normal[3];
GetFaceNormal(verts[faces[i].firstVert].pos,verts[faces[i].firstVert+1].pos,verts[faces[i].firstVert+2].pos, normal);
const core::vector3df normal =
GetFaceNormal(verts[faces[i].firstVert].pos,
verts[faces[i].firstVert+1].pos,
verts[faces[i].firstVert+2].pos);
u32 textureID = core::min_(s32(faces[i].textureID), s32(header.numTextures - 1)) + 1;
u32 lightmapID = core::min_(s32(faces[i].lightmapID),s32(header.numLightmaps - 1)) + 1;
const u32 textureID = core::min_(s32(faces[i].textureID), s32(header.numTextures - 1)) + 1;
const u32 lightmapID = core::min_(s32(faces[i].lightmapID),s32(header.numLightmaps - 1)) + 1;
SMeshBufferLightMap * meshBuffer = (SMeshBufferLightMap*)Mesh->getMeshBuffer(lightmapID * (header.numTextures + 1) + textureID);
u32 base = meshBuffer->Vertices.size();
const u32 base = meshBuffer->Vertices.size();
// Add this face's verts
u32 v;
for (v = 0; v < faces[i].numVerts; v++)
for (v = 0; v < faces[i].numVerts; ++v)
{
octVert * vv = &verts[faces[i].firstVert + v];
video::S3DVertex2TCoords vert = video::S3DVertex2TCoords();
video::S3DVertex2TCoords vert;
vert.Pos.set(vv->pos[0], vv->pos[1], vv->pos[2]);
vert.Color = irr::video::SColor(0,255,255,255);
vert.Normal.set(normal[0], normal[1], normal[2]);
vert.Normal.set(normal);
if (textureID == 0)
{
// No texure -- just a lightmap. Thus, use lightmap coords for texture 1.
// No texture -- just a lightmap. Thus, use lightmap coords for texture 1.
// (the actual texture will be swapped later)
vert.TCoords.set(vv->lc[0], vv->lc[1]);
}
@ -204,15 +182,21 @@ IAnimatedMesh* COCTLoader::createMesh(irr::io::IReadFile* file)
// This weird loop turns convex polygons into triangle strips.
// I do it this way instead of a simple fan because it usually looks a lot better in wireframe, for example.
u32 h = faces[i].numVerts - 1, l = 0, c; // High, Low, Center
for (v = 0; v < faces[i].numVerts - 2; v++)
for (v = 0; v < faces[i].numVerts - 2; ++v)
{
if (v & 1) c = h - 1; else c = l + 1;
if (v & 1)
c = h - 1;
else
c = l + 1;
meshBuffer->Indices.push_back(base + h);
meshBuffer->Indices.push_back(base + l);
meshBuffer->Indices.push_back(base + c);
if (v & 1) h--; else l++;
if (v & 1)
--h;
else
++l;
}
}
@ -311,17 +295,17 @@ IAnimatedMesh* COCTLoader::createMesh(irr::io::IReadFile* file)
// attach materials
u32 j;
for (i = 0; i < header.numLightmaps + 1; i++)
{
for (j = 0; j < header.numTextures + 1; j++)
for (u32 j = 0; j < header.numTextures + 1; j++)
{
u32 mb = i * (header.numTextures + 1) + j;
SMeshBufferLightMap * meshBuffer = (SMeshBufferLightMap*)Mesh->getMeshBuffer(mb);
meshBuffer->Material.Textures[0] = tex[j];
meshBuffer->Material.Textures[1] = lig[i];
if (meshBuffer->Material.Textures[0] == 0) {
if (meshBuffer->Material.Textures[0] == 0)
{
// This material has no texture, so we'll just show the lightmap if there is one.
// We swapped the texture coordinates earlier.
meshBuffer->Material.Textures[0] = meshBuffer->Material.Textures[1];
@ -352,14 +336,15 @@ IAnimatedMesh* COCTLoader::createMesh(irr::io::IReadFile* file)
}
else
{
i++;
++i;
}
}
// create bounding box
for (i = 0; i < Mesh->MeshBuffers.size(); i++) {
((SMeshBufferLightMap*)Mesh->MeshBuffers[i])->recalculateBoundingBox();
for (i = 0; i < Mesh->MeshBuffers.size(); ++i)
{
Mesh->MeshBuffers[i]->recalculateBoundingBox();
}
Mesh->recalculateBoundingBox();
@ -387,3 +372,4 @@ bool COCTLoader::isALoadableFileExtension(const c8* filename)
} // end namespace irr
#endif // _IRR_COMPILE_WITH_OCT_LOADER_

View File

@ -78,7 +78,7 @@ namespace scene
virtual IAnimatedMesh* createMesh(irr::io::IReadFile* file);
private:
void GetFaceNormal(f32 a[3], f32 b[3], f32 c[3], f32 out[3]);
core::vector3df GetFaceNormal(f32 a[3], f32 b[3], f32 c[3]);
struct octHeader {
u32 numVerts;

View File

@ -110,11 +110,16 @@ bool CXMeshFileLoader::load(io::IReadFile* file)
//the same vertex can be used in many different meshbuffers, but it's slow to work out
core::array< core::array< u32 > > verticesLink;
verticesLink.set_used(mesh->Vertices.size());
verticesLink.reallocate(mesh->Vertices.size());
core::array< core::array< u32 > > verticesLinkBuffer;
verticesLinkBuffer.set_used(mesh->Vertices.size());
verticesLinkBuffer.reallocate(mesh->Vertices.size());
for (i=0;i<mesh->Vertices.size();++i)
{
verticesLink.push_back( core::array< u32 >() );
verticesLinkBuffer.push_back( core::array< u32 >() );
}
for (i=0;i<mesh->FaceIndices.size();++i)
for (i=0;i<mesh->FaceMaterialIndices.size();++i)
{
for (u32 id=i*3+0;id<=i*3+2;++id)
{
@ -123,7 +128,7 @@ bool CXMeshFileLoader::load(io::IReadFile* file)
for (u32 j=0; j < Array.size(); ++j)
{
if (Array[j]==mesh->FaceIndices[i])
if (Array[j]==mesh->FaceMaterialIndices[i])
{
found=true;
break;
@ -131,7 +136,7 @@ bool CXMeshFileLoader::load(io::IReadFile* file)
}
if (!found)
Array.push_back( mesh->FaceIndices[i] );
Array.push_back( mesh->FaceMaterialIndices[i] );
}
}
@ -153,9 +158,9 @@ bool CXMeshFileLoader::load(io::IReadFile* file)
}
}
for (i=0;i<mesh->FaceIndices.size();++i)
for (i=0;i<mesh->FaceMaterialIndices.size();++i)
{
scene::SSkinMeshBuffer *buffer=mesh->Buffers[ mesh->FaceIndices[i] ];
scene::SSkinMeshBuffer *buffer=mesh->Buffers[ mesh->FaceMaterialIndices[i] ];
for (u32 id=i*3+0;id<=i*3+2;++id)
{
@ -163,7 +168,7 @@ bool CXMeshFileLoader::load(io::IReadFile* file)
for (u32 j=0;j< Array.size() ;++j)
{
if ( Array[j]== mesh->FaceIndices[i] )
if ( Array[j]== mesh->FaceMaterialIndices[i] )
buffer->Indices.push_back( verticesLink[ mesh->Indices[id] ][j] );
}
}
@ -189,10 +194,10 @@ bool CXMeshFileLoader::load(io::IReadFile* file)
{
for (u32 k=1; k < verticesLinkBuffer[id].size(); ++k)
{
ISkinnedMesh::SWeight& WeightClone=AnimatedMesh->createWeight(Joint);
WeightClone.strength = Weight.strength;
WeightClone.vertex_id = verticesLink[id][k];
WeightClone.buffer_id = verticesLinkBuffer[id][k];
ISkinnedMesh::SWeight* WeightClone = AnimatedMesh->createWeight(Joint);
WeightClone->strength = Weight.strength;
WeightClone->vertex_id = verticesLink[id][k];
WeightClone->buffer_id = verticesLinkBuffer[id][k];
}
}
}
@ -212,11 +217,11 @@ bool CXMeshFileLoader::load(io::IReadFile* file)
verticesLink[i]=0;
}
for (i=0;i<mesh->FaceIndices.size();++i)
for (i=0;i<mesh->FaceMaterialIndices.size();++i)
{
for (u32 id=i*3+0;id<=i*3+2;++id)
{
verticesLinkBuffer[ mesh->Indices[id] ] = mesh->FaceIndices[i];
verticesLinkBuffer[ mesh->Indices[id] ] = mesh->FaceMaterialIndices[i];
}
}
@ -228,9 +233,9 @@ bool CXMeshFileLoader::load(io::IReadFile* file)
buffer->Vertices_Standard.push_back( mesh->Vertices[i] );
}
for (i=0;i<mesh->FaceIndices.size();++i)
for (i=0;i<mesh->FaceMaterialIndices.size();++i)
{
scene::SSkinMeshBuffer *buffer=mesh->Buffers[ mesh->FaceIndices[i] ];
scene::SSkinMeshBuffer *buffer=mesh->Buffers[ mesh->FaceMaterialIndices[i] ];
for (u32 id=i*3+0;id<=i*3+2;++id)
{
@ -1178,20 +1183,10 @@ bool CXMeshFileLoader::parseDataObjectMeshMaterialList(SXMesh &mesh)
}
// read material count
readInt();
mesh.Materials.reallocate(readInt());
// read non triangulated face material index count
s32 nFaceIndices = readInt();
// read non triangulated face indices
core::array<s32> nonTriFaceIndices;
nonTriFaceIndices.set_used(nFaceIndices);
for (s32 i=0; i<nFaceIndices; ++i)
nonTriFaceIndices[i] = readInt();
// create triangulated face indices
const s32 nFaceIndices = readInt();
if (nFaceIndices != (s32)mesh.IndexCountPerFace.size())
{
@ -1199,11 +1194,16 @@ bool CXMeshFileLoader::parseDataObjectMeshMaterialList(SXMesh &mesh)
return false;
}
mesh.FaceIndices.set_used( mesh.Indices.size() / 3);
s32 triangulatedindex = 0;
// read non triangulated face indices and create triangulated ones
mesh.FaceMaterialIndices.set_used( mesh.Indices.size() / 3);
s32 triangulatedindex = -1;
for (s32 tfi=0; tfi<nFaceIndices; ++tfi)
for (s32 k=0; k<mesh.IndexCountPerFace[tfi]/3; ++k)
mesh.FaceIndices[triangulatedindex++] = nonTriFaceIndices[tfi];
{
const s32 ind = readInt();
const s32 fc = mesh.IndexCountPerFace[tfi]/3;
for (s32 k=0; k<fc; ++k)
mesh.FaceMaterialIndices[++triangulatedindex] = ind;
}
// in version 03.02, the face indices end with two semicolons.
// commented out version check, as version 03.03 exported from blender also has 2 semicolons
@ -1221,7 +1221,7 @@ bool CXMeshFileLoader::parseDataObjectMeshMaterialList(SXMesh &mesh)
if (objectName.size() == 0)
{
os::Printer::log("Unexpected ending found in Mesh Material list in x file.", ELL_WARNING);
os::Printer::log("Unexpected ending found in Mesh Material list in .x file.", ELL_WARNING);
return false;
}
else

View File

@ -64,7 +64,7 @@ public:
core::array<u32> Indices;
core::array<u32> FaceIndices; // index of material for each face
core::array<u32> FaceMaterialIndices; // index of material for each face
core::array<video::SMaterial> Materials; // material array
};