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
00027 ISceneManager *pSceneMgr = GameManager::Instance()->getSceneManager();
00028
00029
00030 mTerrainSN = pSceneMgr->addTerrainSceneNode("", 0, parent->getID(), vector3df(0.0f, 0.0f, 0.0f),
00031 vector3df(0.0f, 0.0f, 0.0f),
00032 vector3df(1.0f, 1.0f, 1.0f),
00033 SColor(255, 255, 255, 255), 5, ETPS_17, 0, true);
00034 mSceneNode = mTerrainSN;
00035
00036
00037 mTriSelector = pSceneMgr->createTerrainTriangleSelector(mTerrainSN);
00038 mMetaSelector = pSceneMgr->createMetaTriangleSelector();
00039 }
00040
00041
00042 TerrainComponent::TerrainComponent(Entity *parent, const std::string &fileName,
00043 const vector3df &rotation, const vector3df &scale,
00044 const SColor &vertexColor, s32 maxLOD, s32 smoothFactor)
00045 : SceneComponent(parent, true)
00046 {
00047
00048 ISceneManager *pSceneMgr = GameManager::Instance()->getSceneManager();
00049
00050
00051 mTerrainSN = pSceneMgr->addTerrainSceneNode(fileName.c_str(), 0, parent->getID(),
00052 parent->getPosition(), rotation, scale,
00053 vertexColor, maxLOD, ETPS_17, smoothFactor, true);
00054 mSceneNode = mTerrainSN;
00055
00056
00057 mTriSelector = pSceneMgr->createTerrainTriangleSelector(mTerrainSN);
00058 mMetaSelector = pSceneMgr->createMetaTriangleSelector();
00059 }
00060
00061
00062 TerrainComponent::~TerrainComponent()
00063 {
00064 mTerrainSN->remove();
00065 mSceneNode = NULL;
00066 }
00067
00068
00069 TerrainComponent* TerrainComponent::refFactory(Entity *parent)
00070 {
00071 return new TerrainComponent(parent);
00072 }
00073
00074
00075 TerrainComponent* TerrainComponent::refFactory(Entity *parent, const std::string &fileName,
00076 const vector3df &rotation, const vector3df &scale,
00077 const SColor &vertexColor, s32 maxLOD,
00078 s32 smoothFactor)
00079 {
00080 return new TerrainComponent(parent, fileName, rotation, scale, vertexColor, maxLOD, smoothFactor);
00081 }
00082
00083
00084 ITerrainSceneNode* TerrainComponent::getTerrainSceneNode()
00085 {
00086 return mTerrainSN;
00087 }
00088
00089
00090 const aabbox3df& TerrainComponent::getBoundingBox() const
00091 {
00092 return mTerrainSN->getBoundingBox();
00093 }
00094
00095
00096 const aabbox3df& TerrainComponent::getBoundingBox(s32 patchX, s32 patchZ) const
00097 {
00098 return mTerrainSN->getBoundingBox(patchX, patchZ);
00099 }
00100
00101
00102 f32 TerrainComponent::getHeight(f32 x, f32 y)
00103 {
00104 return mTerrainSN->getHeight(x, y);
00105 }
00106
00107
00108 IMesh* TerrainComponent::getMesh()
00109 {
00110 return mTerrainSN->getMesh();
00111 }
00112
00113
00114 const vector3df& TerrainComponent::getTerrainCenter() const
00115 {
00116 return mTerrainSN->getTerrainCenter();
00117 }
00118
00119
00120 bool TerrainComponent::loadHeightMap(const std::string &fileName, const SColor &vertexColor,
00121 s32 smoothFactor)
00122 {
00123 IReadFile *file = GameManager::Instance()->getDevice()->getFileSystem()->
00124 createAndOpenFile(fileName.c_str());
00125
00126 bool result = mTerrainSN->loadHeightMap(file, vertexColor, smoothFactor);
00127 file->drop();
00128
00129 return result;
00130 }
00131
00132
00133 void TerrainComponent::scaleTexture(f32 scale, f32 scale2)
00134 {
00135 mTerrainSN->scaleTexture(scale, scale2);
00136 }
00137
00138
00139
00140 void bindTerrainComponent(asIScriptEngine *engine)
00141 {
00142
00143 int r;
00144
00145
00146 r = engine->RegisterObjectType("TerrainComponent", sizeof(TerrainComponent), asOBJ_REF); assert(r >= 0);
00147
00148
00149 bindSceneComponentBase<TerrainComponent>(engine, "TerrainComponent");
00150
00151
00152 r = engine->RegisterObjectBehaviour("TerrainComponent", asBEHAVE_FACTORY, "TerrainComponent@ f(Entity @)",
00153 asFUNCTIONPR(TerrainComponent::refFactory, (Entity*), TerrainComponent*),
00154 asCALL_CDECL); assert(r >= 0);
00155 r = engine->RegisterObjectBehaviour("TerrainComponent", asBEHAVE_FACTORY, "TerrainComponent@ f(Entity @, " \
00156 "const string &, const vector3df &in, const vector3df &in," \
00157 "const SColor &in, s32, s32)", asFUNCTIONPR(TerrainComponent::refFactory,
00158 (Entity*, const std::string &, const vector3df &, const vector3df &,
00159 const SColor &, s32, s32), TerrainComponent*), asCALL_CDECL); assert(r >= 0);
00160
00161
00162 r = engine->RegisterObjectMethod("TerrainComponent", "const aabbox3df& getBoundingBox(s32, s32)",
00163 asMETHODPR(TerrainComponent, getBoundingBox, (s32, s32) const, const aabbox3df&),
00164 asCALL_THISCALL); assert(r >= 0);
00165 r = engine->RegisterObjectMethod("TerrainComponent", "f32 getHeight(f32, f32)",
00166 asMETHOD(TerrainComponent, getHeight), asCALL_THISCALL); assert(r >= 0);
00167 r = engine->RegisterObjectMethod("TerrainComponent", "const vector3df& getTerrainCenter()",
00168 asMETHOD(TerrainComponent, getTerrainCenter), asCALL_THISCALL); assert(r >= 0);
00169 r = engine->RegisterObjectMethod("TerrainComponent", "bool loadHeightMap(const string &, const SColor &in, s32)",
00170 asMETHOD(TerrainComponent, loadHeightMap), asCALL_THISCALL); assert(r >= 0);
00171 r = engine->RegisterObjectMethod("TerrainComponent", "void scaleTexture(f32, f32)",
00172 asMETHOD(TerrainComponent, scaleTexture), asCALL_THISCALL); assert(r >= 0);
00173 }
00174
00175