SceneGraphComponent::~SceneGraphComponent() { if (m_hordeID != 0 && h3dGetNodeType(m_hordeID) != H3DNodeTypes::Undefined) h3dRemoveNode(m_hordeID); SceneGraphManager::instance()->removeComponent(this); unloadTerrainGeoRes(); }
void SceneGraphComponent::getMeshData(MeshData* data) { if (m_hordeID > 0) { H3DRes geoResource = 0; int vertexOffset = 0; int indexOffset = 0; switch(h3dGetNodeType(m_hordeID)) { case H3DNodeTypes::Mesh: geoResource = h3dGetNodeParamI(h3dGetNodeParent(m_hordeID), H3DModel::GeoResI); data->NumVertices = h3dGetNodeParamI(m_hordeID, H3DMesh::VertREndI) - h3dGetNodeParamI(m_hordeID, H3DMesh::VertRStartI) + 1; data->NumTriangleIndices = h3dGetNodeParamI(m_hordeID, H3DMesh::BatchCountI); data->VertRStart = h3dGetNodeParamI(m_hordeID, H3DMesh::VertRStartI); vertexOffset = h3dGetNodeParamI(m_hordeID, H3DMesh::VertRStartI) * 3; indexOffset = h3dGetNodeParamI(m_hordeID, H3DMesh::BatchStartI); break; case H3DNodeTypes::Model: geoResource = h3dGetNodeParamI(m_hordeID, H3DModel::GeoResI); data->NumVertices = h3dGetResParamI(geoResource, H3DGeoRes::GeometryElem, 0, H3DGeoRes::GeoVertexCountI); data->NumTriangleIndices = h3dGetResParamI(geoResource, H3DGeoRes::GeometryElem, 0, H3DGeoRes::GeoIndexCountI); break; case H3DEXT_NodeType_Terrain: unloadTerrainGeoRes(); geoResource = h3dextCreateTerrainGeoRes( m_hordeID, h3dGetNodeParamStr( m_hordeID, H3DNodeParams::NameStr ), h3dGetNodeParamF( m_hordeID, H3DEXTTerrain::MeshQualityF, 0) ); data->NumVertices = h3dGetResParamI(geoResource, H3DGeoRes::GeometryElem, 0, H3DGeoRes::GeoVertexCountI); data->NumTriangleIndices = h3dGetResParamI(geoResource, H3DGeoRes::GeometryElem, 0, H3DGeoRes::GeoIndexCountI); m_terrainGeoRes = geoResource; break; } float* vb = (float*)h3dMapResStream(geoResource, H3DGeoRes::GeometryElem, 0, H3DGeoRes::GeoVertPosStream, true, false); data->VertexBase = new float[(data->NumVertices*3)]; memcpy(data->VertexBase, vb+vertexOffset, sizeof(float)*data->NumVertices*3); h3dUnmapResStream(geoResource); //Triangle indices, must cope with 16 bit and 32 bit if (h3dGetResParamI(geoResource, H3DGeoRes::GeometryElem, 0, H3DGeoRes::GeoIndices16I)) { unsigned short* tb = (unsigned short*)h3dMapResStream(geoResource, H3DGeoRes::GeometryElem, 0, H3DGeoRes::GeoIndexStream, true, false); data->TriangleBase16 = new unsigned short[data->NumTriangleIndices]; memcpy(data->TriangleBase16, tb+indexOffset, sizeof(unsigned short)*data->NumTriangleIndices); h3dUnmapResStream(geoResource); } else { unsigned int* tb = (unsigned int*)h3dMapResStream(geoResource, H3DGeoRes::GeometryElem, 0, H3DGeoRes::GeoIndexStream, true, false); data->TriangleBase32 = new unsigned int[data->NumTriangleIndices]; memcpy(data->TriangleBase32, tb+indexOffset, sizeof(unsigned int)*data->NumTriangleIndices); h3dUnmapResStream(geoResource); } //data->TriangleMode = Horde3D::getResourceParami(geoResource, GeometryResParams::TriangleMode); } }
QSceneNode::~QSceneNode() { qDeleteAll(m_childItems); if (m_hordeID != 0 && h3dGetNodeType(m_hordeID) != H3DNodeTypes::Undefined) h3dRemoveNode(m_hordeID); m_hordeID = 0; QDomElement attachment = m_xmlNode.firstChildElement("Attachment"); SceneTreeModel* model = static_cast<SceneTreeModel*>(m_model); if( model && !attachment.isNull()) { AttachmentPlugIn* plugIn = model->nodeFactory()->attachmentPlugIn(); if (plugIn != 0) plugIn->destroyNodeAttachment(this); } h3dReleaseUnusedResources(H3DResTypes::Undefined); m_childItems.clear(); }
////////////////////////// //Instance funcitons Joint::Joint(H3DNode id) : m_horde_id(id), m_dofr( DOFRestrictions::FULL_FREEDOM ), m_model_hID(0) { #if defined PLATFORM_WIN memcpy_s(m_name, 32, h3dGetNodeParamStr( id, H3DNodeParams::NameStr ), 32); #else memcpy(m_name, h3dGetNodeParamStr( id, H3DNodeParams::NameStr ), 32); #endif //find joint's model (agent) H3DNode node = m_horde_id; while(h3dGetNodeType(node) != H3DNodeTypes::Model) node = h3dGetNodeParent(node); m_model_hID = node; m_model_eID = GameEngine::sceneGraphEntityID(m_model_hID); update(); }
void SceneGraphComponent::executeEvent(GameEvent *event) { switch (event->id()) { case GameEvent::E_SET_TRANSFORMATION: setTransformation(static_cast<const float*>(event->data())); break; case GameEvent::E_TRANSFORMATION: memcpy(static_cast<float*>(event->data()), m_transformation, sizeof(float) * 16); break; case GameEvent::E_SET_TRANSLATION: { Vec3f* translation = static_cast<Vec3f*>(event->data()); m_transformation[12] = translation->x; m_transformation[13] = translation->y; m_transformation[14] = translation->z; sendTransformation(); } break; case GameEvent::E_SET_SCALE: setScale(static_cast<Vec3f*>(event->data())); break; case GameEvent::E_MESH_DATA: getMeshData(static_cast<MeshData*>(event->data())); break; case GameEvent::E_TRANSLATE_LOCAL: translateLocal(static_cast<Vec3f*>(event->data())); break; case GameEvent::E_TRANSLATE_GLOBAL: translateGlobal(static_cast<Vec3f*>(event->data())); break; case GameEvent::E_ROTATE_LOCAL: rotate(static_cast<Vec3f*>(event->data())); break; case GameEvent::E_SET_ROTATION: setRotation(static_cast<Vec3f*>(event->data())); break; case GameEvent::E_ATTACH: attach(static_cast<Attach*>(event->data())); break; case GameEvent::E_SET_NODE_PARENT: setParentNode(static_cast<Attach*>(event->data())); break; case GameEvent::E_MORPH_TARGET: if (m_hordeID > 0) { h3dSetModelMorpher(m_hordeID, static_cast<MorphTarget*>(event->data())->Name, static_cast<MorphTarget*>(event->data())->Value); h3dUpdateModel(m_hordeID, H3DModelUpdateFlags::Geometry ); } break; case GameEvent::E_ACTIVATE_CAM: if (m_hordeID > 0 && h3dGetNodeType(m_hordeID) == H3DNodeTypes::Camera) SceneGraphManager::instance()->setActiveCam( m_hordeID ); break; case GameEvent::E_SET_ANIM_FRAME: { if (m_hordeID > 0) { const SetAnimFrame* const data = static_cast<SetAnimFrame*>(event->data()); h3dSetModelAnimParams(m_hordeID, data->Stage, data->Time, data->Weight); h3dUpdateModel(m_hordeID, H3DModelUpdateFlags::Animation | H3DModelUpdateFlags::Geometry ); } } break; case GameEvent::E_SET_ENABLED: setEnabled(*static_cast<bool*>(event->data())); break; case GameEvent::E_GET_VISIBILITY: { bool* visible = static_cast<bool*>(event->data()); if (visible) *visible = getVisibility(); } break; case GameEvent::E_GET_PROJECTION_MATRIX: { float* mat = static_cast<float*>(event->data()); SceneGraphManager::instance()->getCameraProjectionMatrix(mat); } break; case GameEvent::E_GET_ACTIVE_CAM: if (SceneGraphManager::instance()->getActiveCam() == m_hordeID) { unsigned int* id = static_cast<unsigned int*>(event->data()); if (id) *id = m_owner->worldId(); } break; case GameEvent::E_GET_SCENEGRAPH_ID: { int* id = static_cast<int*>(event->data()); if (id) *id = m_hordeID; } break; } }