bool operator==(const Matrix3<U>& m1, const Matrix3<U>& m2) { return APPROX_EQ(m1.m[0][0], m2.m[0][0], 0.00001f) && APPROX_EQ(m1.m[0][1], m2.m[0][1], 0.00001f) && APPROX_EQ(m1.m[0][2], m2.m[0][2], 0.00001f) && APPROX_EQ(m1.m[1][0], m2.m[1][0], 0.00001f) && APPROX_EQ(m1.m[1][1], m2.m[1][1], 0.00001f) && APPROX_EQ(m1.m[1][2], m2.m[1][2], 0.00001f) && APPROX_EQ(m1.m[2][0], m2.m[2][0], 0.00001f) && APPROX_EQ(m1.m[2][1], m2.m[2][1], 0.00001f) && APPROX_EQ(m1.m[2][2], m2.m[2][2], 0.00001f); }
bool CTerrainShapeForSpaceTree::createTerrainShape_test( PRootNode *pnodeRoot, PDatabase *pDatabase, PString szNameFileTerrain, float fScaleTerrain ) { PResult result; if(PLinkResolver::getDatabase(m_terrainDBID, szNameFileTerrain)!=PE_RESULT_NO_ERROR) { return PSSG_SET_LAST_ERROR(false,("Unable to get the default database for this sample.")); } if(PSSG::Extra::resolveAllLinks()!=PE_RESULT_NO_ERROR) { return PSSG_SET_LAST_ERROR(false,("Unable to resolve all outstanding links")); } // Database File을 읽어온다. PDatabaseWriteLock modelWriteLock(m_terrainDBID); PDatabase *databaseShapeTerr = modelWriteLock.getDatabase(); if(!databaseShapeTerr) { return PSSG_SET_LAST_ERROR(false,("Unable to lock model database")); } // Bundle Node : 즉 Model Node를 뽑아낸다. PListIterator modelScenes(databaseShapeTerr->getSceneList()); PNode *pnodeRootShapeTerr = (PNode*)modelScenes.data(); PTraversalFindNodeByType findBUndleNode(PSSG_TYPE(PBundleNode)); findBUndleNode.traverseDepthFirst(*pnodeRootShapeTerr); PNode *pnodeRenderBundle = (PNode*)findBUndleNode.getFoundNode(); if(!pnodeRenderBundle) { PTraversalFindNodeByType findRenderNode(PSSG_TYPE(PRenderNode)); findRenderNode.traverseDepthFirst(*pnodeRootShapeTerr); pnodeRenderBundle = (PNode*)findRenderNode.getFoundNode(); if(!pnodeRenderBundle) { return PSSG_SET_LAST_ERROR(false, ("Unable to find the model node because model has not rendernode.")); } } PNode *pmodelNode_clone = (PNode*)pnodeRenderBundle->clone(pDatabase, &result); bool bNeedTransform = !APPROX_EQ(1.0f,fScaleTerrain); Matrix4 matTMforTree; if( true==bNeedTransform ) { Matrix4 &mat = pmodelNode_clone->m_matrix; matTMforTree = matTMforTree.identity(); float fscaleMul = 0.0f; for(int i=0; i<3; ++i) { fscaleMul = mat.getElem(i,i)*fScaleTerrain; mat.setElem( i,i, fscaleMul ); matTMforTree.setElem( i,i,fscaleMul ); } } pnodeRoot->addChild( *pmodelNode_clone ); PSegmentSet *segmentSet; PDatabaseListableIterator<PSegmentSet> it1(*databaseShapeTerr); while (it1) { segmentSet = &(*it1); for(unsigned int i = 0 ; i < segmentSet->getSegmentCount() ; i++) { PRenderDataSource *renderdatasource = segmentSet->getSegment(i); if(true==bNeedTransform) { m_pContainerTri->constructAllTriangles( renderdatasource, &matTMforTree, true ); } else { m_pContainerTri->constructAllTriangles( renderdatasource, NULL, true ); } } ++it1; } m_pSpcTree->constructTree( m_pContainerTri ); return true; }