Merged from 1.5 branch, revisions 2297:2318. Fixed collada loader for very old files, and fixed 3ds shininess.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@2319 dfc29bdd-3216-0410-991c-e03cc46cb475
master
hybrid 2009-03-31 17:59:11 +00:00
parent 1918be71ca
commit 9d1b940494
4 changed files with 61 additions and 16 deletions

View File

@ -662,14 +662,36 @@ Changes in version 1.6, TA
-------------------------------------
Changes in version 1.5.1 (??.?? 2009)
- Update to libpng 1.2.35
- Fix loading of Collada files from irrEdit 1.2
- Update to libpng 1.2.35, fixed issues on 64bit machines with system's libpng.
- Remove texture pointers after texture clear.
- Fix ALPHA_CHANNEL_REF to a fixed check for alpha==127 as expected.
- Fixed OSX device bug where screen size was not set in fullscreen mode.
- OpenGL version calculation fixed.
- OSX device now supports shift and ctrl keys.
- Fixed ambient light issues in bruningsvideo.
- device reset for d3d fixed when using VBOs.
- MD2 mesh loader: Now uses much less memory, reduced number of allocations when loading meshes.
- OpenGL render state (texture wrongly cached) fixed.
- Fixed animator removal.
- Fix terrain to use 32bit only when necessary, make terrain use hw buffers. Heightmap loading and height calculation fixed.
- Some mem leaks fixed
- FPS camera resets the cursor better
-----------------------------------
Changes in version 1.5 (15.12.2008)

View File

@ -372,6 +372,7 @@ bool C3DSMeshFileLoader::readMaterialChunk(io::IReadFile* file, ChunkData* paren
break;
case C3DS_MATSHININESS:
readPercentageChunk(file, &data, CurrentMaterial.Material.Shininess);
CurrentMaterial.Material.Shininess = (1.f-CurrentMaterial.Material.Shininess)*128.f;
break;
case C3DS_TRANSPARENCY:
{

View File

@ -118,6 +118,7 @@ namespace scene
const core::stringc falloffExponentNodeName = "falloff_exponent";
const core::stringc profileCOMMONSectionName = "profile_COMMON";
const core::stringc profileCOMMONAttributeName = "COMMON";
const char* const inputSemanticNames[] = {"POSITION", "VERTEX", "NORMAL", "TEXCOORD",
"UV", "TANGENT", "IMAGE", "TEXTURE", 0};
@ -367,7 +368,6 @@ IAnimatedMesh* CColladaFileLoader::createMesh(io::IReadFile* file)
if (!Version)
return 0;
// because this loader loads and creates a complete scene instead of
// a single mesh, return an empty dummy mesh to make the scene manager
// know that everything went well.
@ -375,6 +375,9 @@ IAnimatedMesh* CColladaFileLoader::createMesh(io::IReadFile* file)
DummyMesh = new SAnimatedMesh();
scene::IAnimatedMesh* returnMesh = DummyMesh;
if (Version < 10400)
instantiateNode(SceneManager->getRootSceneNode());
// add the first loaded mesh into the mesh cache too, if more than one
// meshes have been loaded from the file
if (LoadedMeshCount>1 && FirstLoadedMesh)
@ -422,7 +425,7 @@ void CColladaFileLoader::skipSection(io::IXMLReaderUTF8* reader, bool reportSkip
{
#ifdef COLLADA_READER_DEBUG
if (reportSkipping)
os::Printer::log("Skipping COLLADA unknown element:", core::stringc(reader->getNodeName()).c_str());
os::Printer::log("Skipping COLLADA unknown element", core::stringc(reader->getNodeName()).c_str());
#endif // COLLADA_READER_DEBUG
++tagCounter;
@ -441,7 +444,7 @@ void CColladaFileLoader::readColladaSection(io::IXMLReaderUTF8* reader)
return;
const f32 version = core::fast_atof(core::stringc(reader->getAttributeValue("version")).c_str());
Version = core::floor32(version)*10000+core::ceil32(core::fract(version)*1000.0f);
Version = core::floor32(version)*10000+core::floor32(core::fract(version)*1000.0f);
// Version 1.4 can be checked for by if (Version >= 10400)
while(reader->read())
@ -1074,9 +1077,9 @@ core::matrix4 CColladaFileLoader::readTranslateNode(io::IXMLReaderUTF8* reader)
}
//! reads any kind of <instance*> node and creates a scene node from it
void CColladaFileLoader::readInstanceNode(io::IXMLReaderUTF8* reader, scene::ISceneNode* parent,
scene::ISceneNode** outNode, CScenePrefab* p)
//! reads any kind of <instance*> node
void CColladaFileLoader::readInstanceNode(io::IXMLReaderUTF8* reader,
scene::ISceneNode* parent, scene::ISceneNode** outNode, CScenePrefab* p)
{
#ifdef COLLADA_READER_DEBUG
os::Printer::log("COLLADA reading instance");
@ -1103,10 +1106,20 @@ void CColladaFileLoader::readInstanceNode(io::IXMLReaderUTF8* reader, scene::ISc
break;
}
}
instantiateNode(parent, outNode, p, url);
}
void CColladaFileLoader::instantiateNode(scene::ISceneNode* parent,
scene::ISceneNode** outNode, CScenePrefab* p, const core::stringc& url)
{
#ifdef COLLADA_READER_DEBUG
os::Printer::log("COLLADA instantiate node");
#endif
for (u32 i=0; i<Prefabs.size(); ++i)
{
if (url == Prefabs[i]->getId())
if (url == "" || url == Prefabs[i]->getId())
{
if (p)
p->Childs.push_back(Prefabs[i]);
@ -1119,7 +1132,7 @@ void CColladaFileLoader::readInstanceNode(io::IXMLReaderUTF8* reader, scene::ISc
{
*outNode = newNode;
if (*outNode)
(*outNode)->setName(readId(reader));
(*outNode)->setName(url);
}
}
return;
@ -1724,12 +1737,15 @@ void CColladaFileLoader::readGeometry(io::IXMLReaderUTF8* reader)
}
else
// trifans, and tristrips missing
if (extraNodeName == reader->getNodeName())
if (extraNodeName == nodeName)
skipSection(reader, false);
else
if (techniqueCommonSectionName != nodeName) // techniqueCommon must not be skipped
// techniqueCommon or 'technique profile=common' must not be skipped
if ((techniqueCommonSectionName != nodeName) // Collada 1.4+
&& ((techniqueNodeName != nodeName) ||
(profileCOMMONAttributeName != reader->getAttributeValue("profile")))) // Collada 1.2/1.3
{
// os::Printer::log("COLLADA loader warning: Wrong tag usage found", reader->getNodeName(), ELL_WARNING);
os::Printer::log("COLLADA loader warning: Wrong tag usage found in geometry", reader->getNodeName(), ELL_WARNING);
skipSection(reader, true); // ignore all other sections
}
} // end if node type is element
@ -1957,10 +1973,9 @@ void CColladaFileLoader::readPolygonSection(io::IXMLReaderUTF8* reader,
}
else
{
for (u32 i = 0; i < vCounts.size(); i++)
{
int polyVCount = vCounts[i];
const int polyVCount = vCounts[i];
core::array<int> polyCorners;
@ -2395,7 +2410,10 @@ void CColladaFileLoader::readColladaInput(io::IXMLReaderUTF8* reader)
// get source
p.Source = reader->getAttributeValue("source");
if (reader->getAttributeValue("offset")) // Collada 1.4+
p.Offset = (u32)reader->getAttributeValueAsInt("offset");
else // Collada 1.2/1.3
p.Offset = (u32)reader->getAttributeValueAsInt("idx");
p.Set = (u32)reader->getAttributeValueAsInt("set");
// add input

View File

@ -246,10 +246,14 @@ private:
//! reads a <float> element
f32 readFloatNode(io::IXMLReaderUTF8* reader);
//! reads a <instance> node and creates a scene node from it
//! reads a <instance> node
void readInstanceNode(io::IXMLReaderUTF8* reader, scene::ISceneNode* parent,
scene::ISceneNode** outNode, CScenePrefab* p=0);
//! creates a scene node from Prefabs (with name given in 'url')
void instantiateNode(scene::ISceneNode* parent, scene::ISceneNode** outNode=0,
CScenePrefab* p=0, const core::stringc& url="");
//! reads a <light> element and stores it as prefab
void readLightPrefab(io::IXMLReaderUTF8* reader);