00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "OctTreeComponent.h"
00019 #include "../../core/GameManager.h"
00020
00021
00022
00023
00024 OctTreeComponent::OctTreeComponent(Entity *parent, s32 minPolysPerNode)
00025 : MeshComponent(parent, true)
00026 {
00027 if(pParent != NULL)
00028 init(minPolysPerNode);
00029 }
00030
00031
00032 OctTreeComponent::OctTreeComponent(Entity *parent, const std::string &fileName, s32 minPolysPerNode)
00033 : MeshComponent(parent, true)
00034 {
00035 if(pParent != NULL)
00036 {
00037 init(minPolysPerNode);
00038 setMesh(fileName);
00039 }
00040 }
00041
00042
00043 OctTreeComponent::OctTreeComponent(Entity *parent, IMesh *mesh, s32 minPolysPerNode)
00044 : MeshComponent(parent, true)
00045 {
00046 if(pParent != NULL)
00047 {
00048 init(minPolysPerNode);
00049 setMesh(mesh);
00050 }
00051 }
00052
00053
00054 OctTreeComponent::OctTreeComponent(Entity *parent, IAnimatedMesh *mesh, s32 minPolysPerNode)
00055 : MeshComponent(parent, true)
00056 {
00057 if(pParent != NULL)
00058 {
00059 init(minPolysPerNode);
00060 setMesh(mesh);
00061 }
00062 }
00063
00064
00065 OctTreeComponent::~OctTreeComponent()
00066 {
00067 }
00068
00069
00070 void OctTreeComponent::init(s32 minPolysPerNode)
00071 {
00072
00073 ISceneManager *pSceneMgr = GameManager::Instance()->getSceneManager();
00074
00075
00076 mMeshSN = pSceneMgr->addOctTreeSceneNode((IMesh*)0, 0, pParent->getID(), minPolysPerNode, true);
00077 mSceneNode = mMeshSN;
00078 mSceneNode->setPosition(pParent->getAbsolutePosition());
00079 mSceneNode->setRotation(pParent->getAbsoluteRotation());
00080
00081
00082 mMinPolysPerNode = minPolysPerNode;
00083
00084
00085 mLocalMetaSelector = pSceneMgr->createMetaTriangleSelector();
00086 mTriSelector = mLocalMetaSelector;
00087 mMetaSelector = pSceneMgr->createMetaTriangleSelector();
00088 }
00089
00090
00091 void OctTreeComponent::setMesh(const std::string &fileName)
00092 {
00093
00094 AssetGroup *assets = pParent->getAssetGroup();
00095 IMesh *mesh = 0;
00096
00097
00098 if(assets != NULL)
00099 {
00100
00101 assets->disconnectEventSignal(std::string("meshes/") + mMeshFileName, this);
00102
00103
00104 MeshProcessor *processor = static_cast<MeshProcessor*>(assets->getAssetProcessor("meshes"));
00105 mesh = processor->getMesh(fileName);
00106
00107 if(mesh)
00108 {
00109 assets->connectEventSignal(std::string("meshes/") + fileName, this,
00110 &OctTreeComponent::onMesh);
00111 mMeshFileName = fileName;
00112 }
00113 }
00114
00115 else
00116 mesh = GameManager::Instance()->getSceneManager()->getMesh(fileName.c_str());
00117
00118
00119 mLocalMetaSelector->removeTriangleSelector(mOctTreeSelector);
00120
00121
00122 mMeshSN->setMesh(mesh);
00123
00124
00125 mOctTreeSelector = GameManager::Instance()->getSceneManager()->
00126 createTriangleSelector(mesh, mMeshSN);
00127 mLocalMetaSelector->addTriangleSelector(mOctTreeSelector);
00128 }
00129
00130
00131 void OctTreeComponent::setMesh(IMesh *mesh)
00132 {
00133
00134 AssetGroup *assets = pParent->getAssetGroup();
00135
00136 if(assets != NULL)
00137 {
00138 assets->disconnectEventSignal(std::string("meshes/") + mMeshFileName, this);
00139 mMeshFileName = "";
00140 }
00141
00142
00143 mLocalMetaSelector->removeTriangleSelector(mOctTreeSelector);
00144
00145
00146 mMeshSN->setMesh(mesh);
00147
00148
00149 mOctTreeSelector = GameManager::Instance()->getSceneManager()->
00150 createOctTreeTriangleSelector(mesh, mMeshSN, mMinPolysPerNode);
00151 mLocalMetaSelector->addTriangleSelector(mOctTreeSelector);
00152 }
00153
00154
00155 void OctTreeComponent::onMesh(void *p)
00156 {
00157
00158 IMesh *mesh = reinterpret_cast<IMesh*>(p);
00159
00160
00161 mLocalMetaSelector->removeTriangleSelector(mOctTreeSelector);
00162
00163
00164 mMeshSN->setMesh(mesh);
00165
00166
00167 mOctTreeSelector = GameManager::Instance()->getSceneManager()->
00168 createOctTreeTriangleSelector(mesh, mMeshSN, mMinPolysPerNode);
00169 mLocalMetaSelector->addTriangleSelector(mOctTreeSelector);
00170 }
00171
00172
00173 bool OctTreeComponent::parseXML(IXMLReader *file, Entity *entity)
00174 {
00175
00176 OctTreeComponent *component = NULL;
00177
00178
00179 if(file->getNodeType() == io::EXN_ELEMENT)
00180 {
00181 if(stringw("OctTreeComponent") == file->getNodeName())
00182 {
00183
00184 s32 minPolysPerNode = file->getAttributeValueAsInt(L"minPolysPerNode");
00185
00186
00187 component = new OctTreeComponent(entity, minPolysPerNode);
00188 }
00189 }
00190
00191 if(component == NULL)
00192 return false;
00193
00194
00195 while(file->read())
00196 {
00197 switch(file->getNodeType())
00198 {
00199
00200 if(!MeshComponent::parseBaseXML(file, component))
00201 SceneComponent::parseBaseXML(file, component);
00202
00203 break;
00204
00205 case io::EXN_ELEMENT_END:
00206
00207
00208 if(stringw("OctTreeComponent") == file->getNodeName())
00209 return true;
00210
00211 break;
00212
00213 default:
00214
00215 break;
00216 }
00217
00218 }
00219
00220
00221 return false;
00222 }
00223
00224