void TLSceneManager::setWorldGeometry(const String& sceneName)
{
if (!mTLSceneRoot)
mTLSceneRoot = getRootSceneNode()->createChildSceneNode("Terrain");
loadScene(sceneName+".scene");
//loadTerrain(sceneName+".terrain");
createMaterials();
createScene();
createStaticEntity();
//_createWCollisionEntity();
setAllEnv();
}
Light* TLSceneManager::createLight(const String &name, SSceneLight* light)
{
destroyLight(name);
Light* l = OctreeSceneManager::createLight(name);
l->setType(light->type);
l->setDiffuseColour(light->diffuse);
l->setSpecularColour(light->specular);
l->setPosition(light->position);
l->setDirection(light->direction);
l->setCastShadows(light->castShadows);
return l;
}
void TLSceneManager::setAllEnv()
{
setAmbientLight(mSceneInfo.env.ambient);
if (!mSceneInfo.skyDome.material.empty())
setSkyDome(true, "CloudySky");
setFog(mSceneInfo.env.fogMode, mSceneInfo.env.fogColour, 0.001,
mSceneInfo.env.fogLinearStart, mSceneInfo.env.fogLinearEnd);
mLight1 = createLight("Light1", &mSceneInfo.light1);
mLight2 = createLight("Light2", &mSceneInfo.light2);
}
void TLSceneManager::loadScene(const String& filename)
{
CSceneXmlFile file(&mSceneInfo);
if (!file.LoadFile(filename.c_str()))
{
OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "load scene file failed",
"TLSceneManager::loadScene");
}
loadTerrain(mSceneInfo.terrainFileName);
}
void TLSceneManager::loadTerrain(const String& filename)
{
CTerrainXmlFile file(&mTerrainInfo);
if (!file.LoadFile(filename.c_str()))
{
OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "load terrain file failed",
"TLSceneManager::loadTerrain");
}
mSceneLeft = -(mTerrainInfo.xsize * mTerrainInfo.scale.x) / 2;
mSceneTop = -(mTerrainInfo.zsize * mTerrainInfo.scale.z) / 2;
loadGridInfo(mTerrainInfo.gridinfoFileName);
loadHeight(mTerrainInfo.heightmapFileName);
}
void TLSceneManager::loadGridInfo(const String& filename)
{
DataStreamPtr stream =
ResourceGroupManager::getSingleton().openResource(
filename, ResourceGroupManager::getSingleton().getWorldResourceGroupName());
MemoryDataStreamPtr mem = MemoryDataStreamPtr(new MemoryDataStream(filename, stream));
mGridInfoFile = mem;
if (mem->size() < 17)
{
OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "gridinfo file size error",
"TLSceneManager::loadGridInfo");
}
uchar* pData = mem->getPtr();
pData += 8;
size_t width = *((size_t*)pData);
pData += 4;
size_t height = *((size_t*)pData);
pData += 4;
char longData = *((char*)pData);
pData += 1;
size_t nGridSize = 5;
if (longData)
{
nGridSize = 7;
}
if (mem->size() < 17 + (width * height * nGridSize))
{
OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "grid file size error.",
"TLSceneManager::loadGridInfo");
}
uchar* pGridData = (uchar*)pData;
mGridInfo.w = width;
mGridInfo.h = height;
mGridInfo.nGridSize = nGridSize;
mGridInfo.pGridData = pGridData;
}
void TLSceneManager::loadHeight(const String& filename)
{
DataStreamPtr stream =
ResourceGroupManager::getSingleton().openResource(
filename, ResourceGroupManager::getSingleton().getWorldResourceGroupName());
MemoryDataStreamPtr mem = MemoryDataStreamPtr(new MemoryDataStream(filename, stream));
mHeightmapFile = mem;
//MemoryDataStream mem(filename, stream);
if (mem->size() < 16)
{
OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "height file size error",
"TLSceneManager::loadHeight");
}
uchar* pData = mem->getPtr();
pData += 8;
size_t width = *((size_t*)pData);
pData += 4;
size_t height = *((size_t*)pData);
pData += 4;
if (mem->size() < 16 + (width * height * 4))
{
OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "height file size error.",
"TLSceneManager::loadHeight");
}
Real* pHeight = (Real*)pData;
mHeightInfo.w = width;
mHeightInfo.h = height;
mHeightInfo.pHeight = pHeight;
/* mOptions.sceneWidth = width;
mOptions.sceneHeight = height;
mOptions.scale = Vector3(100,100,100);
SceneNode* baseNode = mTLSceneRoot;
String name;
height = width = 30;
mTiles.resize(height);
for (size_t y = 0; y < height-1; y++)
{
mTiles[y].resize(width);
for (size_t x = 0; x < width-1; x++)
{
StringUtil::StrStreamType newName;
newName << "tile[" << (int)y << "][" << (int)x << "]";
name = newName.str();
SceneNode* c;
if (hasSceneNode(name))
{
c = getSceneNode(name);
}
else
{
c = baseNode->createChildSceneNode(name);
}
TLTerrainRenderable* tile = new TLTerrainRenderable(name);
tile->setOptions(&mOptions);
tile->setRenderQueueGroup(getWorldGeometryRenderQueue());
tile->initialise(x, y, pHeight);
c->attachObject(tile);
mTiles[y][x] = tile;
}
}*/
}
void TLSceneManager::createTileMaterial(const String& filename, bool isUpLayer)
{
String name = filename;
if (isUpLayer)
name += "up";
ResourcePtr res = MaterialManager::getSingleton().getByName(name);
if (!res.isNull())
return;
MaterialPtr mat = MaterialManager::getSingleton().create(name,
ResourceGroupManager::INTERNAL_RESOURCE_GROUP_NAME);
Technique* pTec = mat->getTechnique(0);
pTec->removeAllPasses();
Pass* pPass = pTec->createPass();
pPass->removeAllTextureUnitStates();
TextureUnitState* pTus = pPass->createTextureUnitState();
pTus->setTextureName(filename);
if (isUpLayer)
{
pPass->setSceneBlending(SBT_TRANSPARENT_ALPHA);
pPass->setAlphaRejectSettings(CMPF_GREATER_EQUAL, 0);
}
}
void TLSceneManager::createMaterials()
{
CTTVector::iterator it;
for (it = mTerrainInfo.TTextures.begin(); it != mTerrainInfo.TTextures.end(); it++)
{
const STerrainTexture& tt = *it;
createTileMaterial(tt.path, false);
createTileMaterial(tt.path, true);
}
}
void TLSceneManager::createPage1(size_t startx, size_t starty, size_t cx, size_t cy,
const String& name)
{
typedef std::vector<GridPosList> MatBucketList;
MatBucketList mbList(mTerrainInfo.TTextures.size());
MatBucketList mbupList(mTerrainInfo.TTextures.size());
for (size_t y = starty; y < starty+cy; y++)
{
for (size_t x = startx; x < startx+cx; x++)
{
const int gridPos = y * mGridInfo.w + x;
const uchar* pGd = mGridInfo.pGridData + (gridPos * mGridInfo.nGridSize);
int idx = getGridPixmapIndex(pGd);
const SPixmap& pm = mTerrainInfo.Pixmaps[idx];
GridPosInfo gp;
gp.gridPos = gridPos;
gp.triStart3 = 1;
mbList[pm.textureId].push_back(gp);
idx = getGridUpPixmapIndex(pGd);
if (idx < 0)
continue;
const SPixmap& pmup = mTerrainInfo.Pixmaps[idx];
mbupList[pmup.textureId].push_back(gp);
}
}
SceneNode* sn = mTLSceneRoot->createChildSceneNode(name + "node");
int i = 0;
MatBucketList::iterator it;
for (it = mbList.begin(); it != mbList.end(); it++, i++)
{
if (it->size() <= 0)
continue;
StringUtil::StrStreamType meshName;
meshName << name << " mesh " << i;
MeshPtr msh = createGridMesh(*it, meshName.str(), false);
msh->getSubMesh(0)->setMaterialName(mTerrainInfo.TTextures[i].path);
msh->load();
StringUtil::StrStreamType entName;
entName << name << " ent " << i;
Entity* e = createEntity(entName.str(), meshName.str());
e->setRenderQueueGroup(getWorldGeometryRenderQueue());
sn->attachObject(e);
}
i = 0;
for (it = mbupList.begin(); it != mbupList.end(); it++, i++)
{
if (it->size() <= 0)
continue;
StringUtil::StrStreamType meshName;
meshName << name << " meshUp " << i;
MeshPtr msh = createGridMesh(*it, meshName.str(), true);
msh->getSubMesh(0)->setMaterialName(mTerrainInfo.TTextures[i].path+"up");
msh->load();
StringUtil::StrStreamType entName;
entName << name << " entUp " << i;
Entity* e = createEntity(entName.str(), meshName.str());
e->setRenderQueueGroup(getWorldGeometryRenderQueue()+1);
sn->attachObject(e);
}
}
int TLSceneMan