Commit b299e9c4 authored by hybrid's avatar hybrid

Reverted some stuff od the optimized .x splitting back to working version from...

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
parent 04ed098f
...@@ -77,7 +77,6 @@ CAnimatedMeshMD3::~CAnimatedMeshMD3() ...@@ -77,7 +77,6 @@ CAnimatedMeshMD3::~CAnimatedMeshMD3()
{ {
if ( Mesh ) if ( Mesh )
Mesh->drop (); Mesh->drop ();
} }
...@@ -199,19 +198,18 @@ IMeshBuffer * CAnimatedMeshMD3::createMeshBuffer ( const SMD3MeshBuffer * source ...@@ -199,19 +198,18 @@ IMeshBuffer * CAnimatedMeshMD3::createMeshBuffer ( const SMD3MeshBuffer * source
return dest; return dest;
} }
//! build final mesh's vertices from frames frameA and frameB with linear interpolation. //! build final mesh's vertices from frames frameA and frameB with linear interpolation.
void CAnimatedMeshMD3::buildVertexArray ( u32 frameA, u32 frameB, f32 interpolate, void CAnimatedMeshMD3::buildVertexArray ( u32 frameA, u32 frameB, f32 interpolate,
const SMD3MeshBuffer * source, const SMD3MeshBuffer * source,
SMeshBuffer * dest SMeshBuffer * dest
) )
{ {
u32 i; const u32 frameOffsetA = frameA * source->MeshHeader.numVertices;
u32 frameOffsetA = frameA * source->MeshHeader.numVertices; const u32 frameOffsetB = frameB * source->MeshHeader.numVertices;
u32 frameOffsetB = frameB * source->MeshHeader.numVertices;
const f32 scale = ( 1.f/ 64.f ); 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 ]; video::S3DVertex &v = dest->Vertices [ i ];
...@@ -239,11 +237,10 @@ void CAnimatedMeshMD3::buildVertexArray ( u32 frameA, u32 frameB, f32 interpolat ...@@ -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. //! build final mesh's tag from frames frameA and frameB with linear interpolation.
void CAnimatedMeshMD3::buildTagArray ( u32 frameA, u32 frameB, f32 interpolate ) void CAnimatedMeshMD3::buildTagArray ( u32 frameA, u32 frameB, f32 interpolate )
{ {
u32 i; const u32 frameOffsetA = frameA * Mesh->MD3Header.numTags;
u32 frameOffsetA = frameA * Mesh->MD3Header.numTags; const u32 frameOffsetB = frameB * Mesh->MD3Header.numTags;
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 ]; SMD3QuaterionTag &d = TagListIPol [ i ];
...@@ -269,8 +266,6 @@ bool CAnimatedMeshMD3::loadModelFile( u32 modelIndex, io::IReadFile* file) ...@@ -269,8 +266,6 @@ bool CAnimatedMeshMD3::loadModelFile( u32 modelIndex, io::IReadFile* file)
if (!file) if (!file)
return false; return false;
file->seek(0);
//! Check MD3Header //! Check MD3Header
{ {
file->read( &Mesh->MD3Header, sizeof(SMD3Header) ); file->read( &Mesh->MD3Header, sizeof(SMD3Header) );
...@@ -291,7 +286,7 @@ bool CAnimatedMeshMD3::loadModelFile( u32 modelIndex, io::IReadFile* file) ...@@ -291,7 +286,7 @@ bool CAnimatedMeshMD3::loadModelFile( u32 modelIndex, io::IReadFile* file)
SMD3Tag import; SMD3Tag import;
SMD3QuaterionTag exp; SMD3QuaterionTag exp;
u32 i,g; u32 i;
file->seek( Mesh->MD3Header.tagStart ); file->seek( Mesh->MD3Header.tagStart );
for (i = 0; i != totalTags; ++i ) for (i = 0; i != totalTags; ++i )
...@@ -340,7 +335,7 @@ bool CAnimatedMeshMD3::loadModelFile( u32 modelIndex, io::IReadFile* file) ...@@ -340,7 +335,7 @@ bool CAnimatedMeshMD3::loadModelFile( u32 modelIndex, io::IReadFile* file)
//! read skins (shaders) //! read skins (shaders)
file->seek( offset + buf->MeshHeader.offset_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) ); file->read( &skin, sizeof(skin) );
buf->Shader.push_back ( skin.name ); buf->Shader.push_back ( skin.name );
......
...@@ -49,7 +49,8 @@ COCTLoader::~COCTLoader() ...@@ -49,7 +49,8 @@ COCTLoader::~COCTLoader()
// Doesn't really belong here, but it's jammed in for now. // 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) 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; octHeader header;
file->read(&header, sizeof(octHeader)); file->read(&header, sizeof(octHeader));
...@@ -64,14 +65,9 @@ void COCTLoader::OCTLoadLights(irr::io::IReadFile* file, irr::scene::ISceneManag ...@@ -64,14 +65,9 @@ void COCTLoader::OCTLoadLights(irr::io::IReadFile* file, irr::scene::ISceneManag
//TODO: Skip past my extended data just for good form //TODO: Skip past my extended data just for good form
u32 i; for (u32 i = 0; i < header.numLights; i++)
for (i = 0; i < header.numLights; i++)
{ {
f32 intensity; const f32 intensity = lights[i].intensity * intensityScale;
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();
scene->addLightSceneNode(parent, core::vector3df(lights[i].pos[0], lights[i].pos[2], lights[i].pos[1]), 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), 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 ...@@ -81,27 +77,8 @@ void COCTLoader::OCTLoadLights(irr::io::IReadFile* file, irr::scene::ISceneManag
//! given three points representing a face, return a face normal //! 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]) { core::vector3df COCTLoader::GetFaceNormal(f32 a[3], f32 b[3], f32 c[3]) {
f32 v1[3], v2[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;
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;
} }
...@@ -154,40 +131,41 @@ IAnimatedMesh* COCTLoader::createMesh(irr::io::IReadFile* file) ...@@ -154,40 +131,41 @@ IAnimatedMesh* COCTLoader::createMesh(irr::io::IReadFile* file)
scene::SMeshBufferLightMap* buffer = new scene::SMeshBufferLightMap(); scene::SMeshBufferLightMap* buffer = new scene::SMeshBufferLightMap();
buffer->Material.MaterialType = video::EMT_LIGHTMAP; buffer->Material.MaterialType = video::EMT_LIGHTMAP;
buffer->Material.Wireframe = false;
buffer->Material.Lighting = false; buffer->Material.Lighting = false;
Mesh->addMeshBuffer(buffer); Mesh->addMeshBuffer(buffer);
buffer->drop(); buffer->drop();
} }
// Build the mesh buffers // Build the mesh buffers
for (i = 0; i < header.numFaces; i++) { for (i = 0; i < header.numFaces; i++)
if (faces[i].numVerts < 3) continue; {
if (faces[i].numVerts < 3)
continue;
f32 normal[3]; const core::vector3df normal =
GetFaceNormal(verts[faces[i].firstVert].pos,verts[faces[i].firstVert+1].pos,verts[faces[i].firstVert+2].pos, 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; const 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 lightmapID = core::min_(s32(faces[i].lightmapID),s32(header.numLightmaps - 1)) + 1;
SMeshBufferLightMap * meshBuffer = (SMeshBufferLightMap*)Mesh->getMeshBuffer(lightmapID * (header.numTextures + 1) + textureID); 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 // Add this face's verts
u32 v; 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]; 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.Pos.set(vv->pos[0], vv->pos[1], vv->pos[2]);
vert.Color = irr::video::SColor(0,255,255,255); 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) 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) // (the actual texture will be swapped later)
vert.TCoords.set(vv->lc[0], vv->lc[1]); vert.TCoords.set(vv->lc[0], vv->lc[1]);
} }
...@@ -204,15 +182,21 @@ IAnimatedMesh* COCTLoader::createMesh(irr::io::IReadFile* file) ...@@ -204,15 +182,21 @@ IAnimatedMesh* COCTLoader::createMesh(irr::io::IReadFile* file)
// This weird loop turns convex polygons into triangle strips. // 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. // 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 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 + h);
meshBuffer->Indices.push_back(base + l); meshBuffer->Indices.push_back(base + l);
meshBuffer->Indices.push_back(base + c); 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) ...@@ -311,17 +295,17 @@ IAnimatedMesh* COCTLoader::createMesh(irr::io::IReadFile* file)
// attach materials // attach materials
u32 j;
for (i = 0; i < header.numLightmaps + 1; i++) 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; u32 mb = i * (header.numTextures + 1) + j;
SMeshBufferLightMap * meshBuffer = (SMeshBufferLightMap*)Mesh->getMeshBuffer(mb); SMeshBufferLightMap * meshBuffer = (SMeshBufferLightMap*)Mesh->getMeshBuffer(mb);
meshBuffer->Material.Textures[0] = tex[j]; meshBuffer->Material.Textures[0] = tex[j];
meshBuffer->Material.Textures[1] = lig[i]; 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. // This material has no texture, so we'll just show the lightmap if there is one.
// We swapped the texture coordinates earlier. // We swapped the texture coordinates earlier.
meshBuffer->Material.Textures[0] = meshBuffer->Material.Textures[1]; meshBuffer->Material.Textures[0] = meshBuffer->Material.Textures[1];
...@@ -352,14 +336,15 @@ IAnimatedMesh* COCTLoader::createMesh(irr::io::IReadFile* file) ...@@ -352,14 +336,15 @@ IAnimatedMesh* COCTLoader::createMesh(irr::io::IReadFile* file)
} }
else else
{ {
i++; ++i;
} }
} }
// create bounding box // create bounding box
for (i = 0; i < Mesh->MeshBuffers.size(); i++) { for (i = 0; i < Mesh->MeshBuffers.size(); ++i)
((SMeshBufferLightMap*)Mesh->MeshBuffers[i])->recalculateBoundingBox(); {
Mesh->MeshBuffers[i]->recalculateBoundingBox();
} }
Mesh->recalculateBoundingBox(); Mesh->recalculateBoundingBox();
...@@ -387,3 +372,4 @@ bool COCTLoader::isALoadableFileExtension(const c8* filename) ...@@ -387,3 +372,4 @@ bool COCTLoader::isALoadableFileExtension(const c8* filename)
} // end namespace irr } // end namespace irr
#endif // _IRR_COMPILE_WITH_OCT_LOADER_ #endif // _IRR_COMPILE_WITH_OCT_LOADER_
...@@ -78,7 +78,7 @@ namespace scene ...@@ -78,7 +78,7 @@ namespace scene
virtual IAnimatedMesh* createMesh(irr::io::IReadFile* file); virtual IAnimatedMesh* createMesh(irr::io::IReadFile* file);
private: 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 { struct octHeader {
u32 numVerts; u32 numVerts;
......
...@@ -110,11 +110,16 @@ bool CXMeshFileLoader::load(io::IReadFile* 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 //the same vertex can be used in many different meshbuffers, but it's slow to work out
core::array< core::array< u32 > > verticesLink; core::array< core::array< u32 > > verticesLink;
verticesLink.set_used(mesh->Vertices.size()); verticesLink.reallocate(mesh->Vertices.size());
core::array< core::array< u32 > > verticesLinkBuffer; 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) for (u32 id=i*3+0;id<=i*3+2;++id)
{ {
...@@ -123,7 +128,7 @@ bool CXMeshFileLoader::load(io::IReadFile* file) ...@@ -123,7 +128,7 @@ bool CXMeshFileLoader::load(io::IReadFile* file)
for (u32 j=0; j < Array.size(); ++j) for (u32 j=0; j < Array.size(); ++j)
{ {
if (Array[j]==mesh->FaceIndices[i]) if (Array[j]==mesh->FaceMaterialIndices[i])
{ {
found=true; found=true;
break; break;
...@@ -131,7 +136,7 @@ bool CXMeshFileLoader::load(io::IReadFile* file) ...@@ -131,7 +136,7 @@ bool CXMeshFileLoader::load(io::IReadFile* file)
} }
if (!found) if (!found)
Array.push_back( mesh->FaceIndices[i] ); Array.push_back( mesh->FaceMaterialIndices[i] );
} }
} }
...@@ -153,9 +158,9 @@ bool CXMeshFileLoader::load(io::IReadFile* file) ...@@ -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) for (u32 id=i*3+0;id<=i*3+2;++id)
{ {
...@@ -163,7 +168,7 @@ bool CXMeshFileLoader::load(io::IReadFile* file) ...@@ -163,7 +168,7 @@ bool CXMeshFileLoader::load(io::IReadFile* file)
for (u32 j=0;j< Array.size() ;++j) 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] ); buffer->Indices.push_back( verticesLink[ mesh->Indices[id] ][j] );
} }
} }
...@@ -189,10 +194,10 @@ bool CXMeshFileLoader::load(io::IReadFile* file) ...@@ -189,10 +194,10 @@ bool CXMeshFileLoader::load(io::IReadFile* file)
{ {
for (u32 k=1; k < verticesLinkBuffer[id].size(); ++k) for (u32 k=1; k < verticesLinkBuffer[id].size(); ++k)
{ {
ISkinnedMesh::SWeight& WeightClone=AnimatedMesh->createWeight(Joint); ISkinnedMesh::SWeight* WeightClone = AnimatedMesh->createWeight(Joint);
WeightClone.strength = Weight.strength; WeightClone->strength = Weight.strength;
WeightClone.vertex_id = verticesLink[id][k]; WeightClone->vertex_id = verticesLink[id][k];
WeightClone.buffer_id = verticesLinkBuffer[id][k]; WeightClone->buffer_id = verticesLinkBuffer[id][k];
} }
} }
} }
...@@ -212,11 +217,11 @@ bool CXMeshFileLoader::load(io::IReadFile* file) ...@@ -212,11 +217,11 @@ bool CXMeshFileLoader::load(io::IReadFile* file)
verticesLink[i]=0; 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) 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) ...@@ -228,9 +233,9 @@ bool CXMeshFileLoader::load(io::IReadFile* file)
buffer->Vertices_Standard.push_back( mesh->Vertices[i] ); 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) for (u32 id=i*3+0;id<=i*3+2;++id)
{ {
...@@ -1178,20 +1183,10 @@ bool CXMeshFileLoader::parseDataObjectMeshMaterialList(SXMesh &mesh) ...@@ -1178,20 +1183,10 @@ bool CXMeshFileLoader::parseDataObjectMeshMaterialList(SXMesh &mesh)
} }
// read material count // read material count
readInt(); mesh.Materials.reallocate(readInt());
// read non triangulated face material index count // read non triangulated face material index count
s32 nFaceIndices = readInt(); const 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
if (nFaceIndices != (s32)mesh.IndexCountPerFace.size()) if (nFaceIndices != (s32)mesh.IndexCountPerFace.size())
{ {
...@@ -1199,11 +1194,16 @@ bool CXMeshFileLoader::parseDataObjectMeshMaterialList(SXMesh &mesh) ...@@ -1199,11 +1194,16 @@ bool CXMeshFileLoader::parseDataObjectMeshMaterialList(SXMesh &mesh)
return false; return false;
} }
mesh.FaceIndices.set_used( mesh.Indices.size() / 3); // read non triangulated face indices and create triangulated ones
s32 triangulatedindex = 0; mesh.FaceMaterialIndices.set_used( mesh.Indices.size() / 3);
s32 triangulatedindex = -1;
for (s32 tfi=0; tfi<nFaceIndices; ++tfi) 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. // 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 // commented out version check, as version 03.03 exported from blender also has 2 semicolons
...@@ -1221,7 +1221,7 @@ bool CXMeshFileLoader::parseDataObjectMeshMaterialList(SXMesh &mesh) ...@@ -1221,7 +1221,7 @@ bool CXMeshFileLoader::parseDataObjectMeshMaterialList(SXMesh &mesh)
if (objectName.size() == 0) 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; return false;
} }
else else
......
...@@ -64,7 +64,7 @@ public: ...@@ -64,7 +64,7 @@ public:
core::array<u32> Indices; 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 core::array<video::SMaterial> Materials; // material array
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment