/* bool MeshUnloadTask::mainThreadUnload(String name) { Ogre::MeshManager::getSingleton().unload(name); // operationCompleted(Ogre::BackgroundProcessTicket(), Ogre::BackgroundProcessResult()); return false; } */ void MeshUnloadTask::doRun() { /*I REALLY wish this were true*/ // SequentialWorkQueue::getSingleton().queueWork(std::tr1::bind(&MeshUnloadTask::mainThreadUnload, this, mHash)); String hash = mHash; //CDNArchive::canonicalMhashName(mHash); Ogre::MeshManager* meshManager = Ogre::MeshManager::getSingletonPtr(); meshManager->remove(hash); Ogre::ResourcePtr meshResource = meshManager->getByName(hash); assert(meshResource.isNull()); SharedResourcePtr resource = mResource.lock(); if (resource) resource->unloaded(true, mEpoch); }
Mesh loadMesh(const std::string& meshName) { Mesh result; bool addedShared = false; size_t currentOffset = 0; size_t sharedOffset = 0; size_t nextOffset = 0; size_t indexOffset = 0; const v3 scale = v3::UNIT_SCALE; const v3 position = v3::ZERO; const qv4 orientation = qv4::IDENTITY; Ogre::MeshManager* mm = Ogre::MeshManager::getSingletonPtr(); if (! mm) { initOgreForMeshLoading(); mm = Ogre::MeshManager::getSingletonPtr(); } Ogre::MeshPtr mesh = mm->load(meshName, "General"); // Calculate how many result.mVertices and result.mIndices we're going to need for (unsigned short i=0; i < mesh->getNumSubMeshes(); ++i) { Ogre::SubMesh* subMesh = mesh->getSubMesh(i); // We only need to add the shared result.mVertices once if (subMesh->useSharedVertices) { if (!addedShared) { result.mVertexCount += mesh->sharedVertexData->vertexCount; addedShared = true; } } else { result.mVertexCount += subMesh->vertexData->vertexCount; } result.mIndexCount += subMesh->indexData->indexCount; } result.mVertices.reset(new v3[result.mVertexCount]); result.mIndices.reset(new u32[result.mIndexCount]); addedShared = false; // Run through the sub-meshes again, adding the data into the arrays for (unsigned short i=0; i < mesh->getNumSubMeshes(); ++i) { Ogre::SubMesh* subMesh = mesh->getSubMesh(i); Ogre::VertexData* vertexData = subMesh->useSharedVertices ? mesh->sharedVertexData : subMesh->vertexData; if((!subMesh->useSharedVertices) || (subMesh->useSharedVertices && !addedShared)) { if(subMesh->useSharedVertices) { addedShared = true; sharedOffset = currentOffset; } const Ogre::VertexElement* posElem = vertexData->vertexDeclaration->findElementBySemantic(Ogre::VES_POSITION); Ogre::HardwareVertexBufferSharedPtr vbuf = vertexData->vertexBufferBinding->getBuffer(posElem->getSource()); unsigned char* vertex = static_cast<unsigned char*>(vbuf->lock(Ogre::HardwareBuffer::HBL_READ_ONLY)); // There is _no_ baseVertexPointerToElement() which takes an Ogre::Real or a double // as second argument. So make it float, to avoid trouble when Ogre::Real will // be compiled/typedefed as double: float* pReal; for( size_t j = 0; j < vertexData->vertexCount; ++j, vertex += vbuf->getVertexSize()) { posElem->baseVertexPointerToElement(vertex, &pReal); v3 pt(pReal[0], pReal[1], pReal[2]); result.mVertices[currentOffset + j] = (orientation * (pt * scale)) + position; } vbuf->unlock(); nextOffset += vertexData->vertexCount; } Ogre::IndexData* index_data = subMesh->indexData; size_t numTris = index_data->indexCount / 3; Ogre::HardwareIndexBufferSharedPtr ibuf = index_data->indexBuffer; bool use32bitindexes = (ibuf->getType() == Ogre::HardwareIndexBuffer::IT_32BIT); unsigned long* pLong = static_cast<unsigned long*>(ibuf->lock(Ogre::HardwareBuffer::HBL_READ_ONLY)); unsigned short* pShort = reinterpret_cast<unsigned short*>(pLong); size_t offset = (subMesh->useSharedVertices)? sharedOffset : currentOffset; if (use32bitindexes) { for (size_t k = 0; k < numTris*3; ++k) { result.mIndices[indexOffset++] = pLong[k] + static_cast<unsigned long>(offset); } } else { for (size_t k = 0; k < numTris*3; ++k) { result.mIndices[indexOffset++] = static_cast<unsigned long>(pShort[k]) + static_cast<unsigned long>(offset); } } ibuf->unlock(); currentOffset = nextOffset; } return result; }
void ExteriorCellRender::insertMesh(const std::string &mesh, Ogre::Vector3 vec, Ogre::Vector3 axis, Ogre::Radian angle, std::string sceneNodeName, std::string sceneParent[], int elements, bool translateFirst){ assert (mInsert); //mInsert-> Ogre::SceneNode *parent = mInsert; for (int i = 0; i < elements; i++){ if(sceneParent[i] != "" && parent->getChild(sceneParent[i])) parent = dynamic_cast<Ogre::SceneNode*> (parent->getChild(sceneParent[i])); } mNpcPart = parent->createChildSceneNode(sceneNodeName); MeshPtr good2 = NifOgre::NIFLoader::load(mesh); MovableObject *ent = mScene.getMgr()->createEntity(mesh); if(translateFirst){ mNpcPart->translate(vec); mNpcPart->rotate(axis, angle); } else{ mNpcPart->rotate(axis, angle); mNpcPart->translate(vec); } mNpcPart->attachObject(ent); Ogre::MeshManager *m = MeshManager::getSingletonPtr(); const std::string beast1 ="meshes\\b\\B_N_Khajiit_F_Skins.nif"; const std::string beast2 ="meshes\\b\\B_N_Khajiit_M_Skins.nif"; const std::string beast3 ="meshes\\b\\B_N_Argonian_F_Skins.nif"; const std::string beast4 ="meshes\\b\\B_N_Argonian_M_Skins.nif"; const std::string beasttail1 ="tail\\b\\B_N_Khajiit_F_Skins.nif"; const std::string beasttail2 ="tail\\b\\B_N_Khajiit_M_Skins.nif"; const std::string beasttail3 ="tail\\b\\B_N_Argonian_F_Skins.nif"; const std::string beasttail4 ="tail\\b\\B_N_Argonian_M_Skins.nif"; const std::string beastfoot1 ="foot\\b\\B_N_Khajiit_F_Skins.nif"; const std::string beastfoot2 ="foot\\b\\B_N_Khajiit_M_Skins.nif"; const std::string beastfoot3 ="foot\\b\\B_N_Argonian_F_Skins.nif"; const std::string beastfoot4 ="foot\\b\\B_N_Argonian_M_Skins.nif"; if(mesh.compare(beast1) == 0 && m->getByName(beasttail1).isNull()) { //std::cout << "CLONINGKHAJIITF\n"; good2->reload(); MeshPtr tail = good2->clone(beasttail1); good2->reload(); MeshPtr foot = good2->clone(beastfoot1); good2->reload(); } else if(mesh.compare(beast2) == 0 && m->getByName(beasttail2).isNull()) { //std::cout << "CLONINGKHAJIITM\n"; good2->reload(); MeshPtr tail = good2->clone(beasttail2); good2->reload(); MeshPtr foot = good2->clone(beastfoot2); good2->reload(); } else if(mesh.compare(beast3) == 0 && m->getByName(beasttail3).isNull()) { //std::cout << "CLONINGARGONIANF\n"; good2->reload(); MeshPtr tail = good2->clone(beasttail3); good2->reload(); MeshPtr foot = good2->clone(beastfoot3); good2->reload(); } else if(mesh.compare(beast4) == 0 && m->getByName(beasttail4).isNull()) { //std::cout << "CLONINGARGONIANM\n"; good2->reload(); MeshPtr tail = good2->clone(beasttail4); good2->reload(); MeshPtr foot = good2->clone(beastfoot4); good2->reload(); } }