IGameObject* gkGameObjectSystem::CreateStaticGeoGameObject( CRapidXmlParseNode* node ) { if (node) { // transform Vec3 trans(0,0,0); Quat rot(1,0,0,0); Vec3 scale(1,1,1); node->GetTranslation(trans); node->GetOrientation(rot); node->GetScale(scale); IGameObject* statObj = CreateStaticGeoGameObject(node->GetAttribute(_T("Name")), node->GetAttribute(_T("MeshName")), trans, rot); if (statObj) { IGameObjectRenderLayer* pRenderLayer = statObj->getRenderLayer(); if (pRenderLayer) { gkLogMessage(_T("Load Material")); pRenderLayer->setMaterialName(node->GetAttribute(_T("MaterialName"))); gkLogMessage(_T("Material Loaded")); } statObj->setPosition(trans); statObj->setOrientation(rot); statObj->setScale(scale); #ifdef OS_WIN32 if (node->GetAttribute(_T("Physical")) && !_tcsicmp(node->GetAttribute(_T("Physical")), _T("true"))) { IGameObjectPhysicLayer* pPhysicLayer = gEnv->pPhysics->CreatePhysicLayer(); statObj->setGameObjectLayer(pPhysicLayer); pPhysicLayer->createStatic(); } else if (node->GetAttribute(_T("Physical")) && !_tcsicmp(node->GetAttribute(_T("Physical")), _T("rigidsphere"))) { IGameObjectPhysicLayer* pPhysicLayer = gEnv->pPhysics->CreatePhysicLayer(); statObj->setGameObjectLayer(pPhysicLayer); pPhysicLayer->createDynamic(IGameObjectPhysicLayer::ePDT_Sphere); } #endif } return statObj; } return NULL; }
void gkSceneBuilder::parseSceneObject( CRapidXmlParseNode* firstnode, IGameObject* parent ) { for ( ; firstnode != NULL; firstnode = firstnode->getNextSiblingNode(_T("gkObject")) ) { IGameObject* pCreated = NULL; pCreated = gEnv->pGameObjSystem->CreateGameObjectFromXml( firstnode ); if (m_bBuiltInPak) { pCreated->setGameObjectSuperClass(eGOClass_SYSTEM); } if (pCreated) { IGameObjectRenderLayer* pRenderLayer = pCreated->getRenderLayer(); //pRenderLayer->setRenderLayer(m_uRenderLayer); // if has parent, attach if (parent) { parent->attachChild(pCreated); } addExistEntity2List(pCreated); if (ms_nAllNodeCount != 0) gEnv->pSystem->updateProgress( ++ms_nLoadedNodeCount * 100 / ms_nAllNodeCount); // if we got child CRapidXmlParseNode* childNode = firstnode->getChildNode(_T("gkObject")); if (childNode) { parseSceneObject(childNode, pCreated); } } } }
IGameObject* gkGameObject::clone( const gkStdString& newName ) const { IGameObject* ret = NULL; if ( m_pRenderLayer ) { Vec3 pos = getPosition(); Quat rot = getOrientation(); static int name_gen = 0; TCHAR new_name[255]; _tcscpy(new_name, getName().c_str()); _stprintf( new_name, _T("%s_%d"), new_name, name_gen++ ); ret = gEnv->pGameObjSystem->CreateStaticGeoGameObject( new_name, m_pRenderLayer->getMesh()->getName(), pos, rot ); ret->setScale( m_pRenderLayer->getScale() ); ret->getRenderLayer()->setMaterialName( getMaterialName() ); } return ret; }