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