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: http://svn.code.sf.net/p/irrlicht/code/trunk@920 dfc29bdd-3216-0410-991c-e03cc46cb475
This commit is contained in:
parent
a42c5f1ab3
commit
796428b8ae
@ -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 );
|
||||
|
@ -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_
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user