mirror of
https://github.com/OpenMW/openmw.git
synced 2025-03-03 15:09:39 +00:00
Debug terrain chunks
This commit is contained in:
parent
e2d0e86020
commit
98a0819d52
7 changed files with 47 additions and 8 deletions
|
@ -9,6 +9,7 @@
|
|||
#include "../esm/loadland.hpp"
|
||||
|
||||
#include <components/resource/scenemanager.hpp>
|
||||
#include <components/terrain/storage.hpp>
|
||||
|
||||
namespace Terrain
|
||||
{
|
||||
|
@ -21,13 +22,14 @@ CellBorder::CellBorder(Terrain::World *world, osg::Group *root, int borderMask,
|
|||
{
|
||||
}
|
||||
|
||||
void CellBorder::createCellBorderGeometry(int x, int y)
|
||||
osg::ref_ptr<osg::Geode> CellBorder::createBorderGeometry(float x, float y, float size, Terrain::Storage* terrain, Resource::SceneManager* sceneManager, int mask)
|
||||
{
|
||||
const int cellSize = ESM::Land::REAL_SIZE;
|
||||
const int borderSegments = 40;
|
||||
const float offset = 10.0;
|
||||
|
||||
osg::Vec3 cellCorner = osg::Vec3(x * cellSize,y * cellSize,0);
|
||||
size *= cellSize;
|
||||
|
||||
osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array;
|
||||
osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array;
|
||||
|
@ -35,16 +37,16 @@ void CellBorder::createCellBorderGeometry(int x, int y)
|
|||
|
||||
normals->push_back(osg::Vec3(0.0f,-1.0f, 0.0f));
|
||||
|
||||
float borderStep = cellSize / ((float) borderSegments);
|
||||
float borderStep = size / ((float)borderSegments);
|
||||
|
||||
for (int i = 0; i <= 2 * borderSegments; ++i)
|
||||
{
|
||||
osg::Vec3f pos = i < borderSegments ?
|
||||
osg::Vec3(i * borderStep,0.0f,0.0f) :
|
||||
osg::Vec3(cellSize,(i - borderSegments) * borderStep,0.0f);
|
||||
osg::Vec3(size, (i - borderSegments) * borderStep,0.0f);
|
||||
|
||||
pos += cellCorner;
|
||||
pos += osg::Vec3f(0,0,mWorld->getHeightAt(pos) + offset);
|
||||
pos += osg::Vec3f(0,0, terrain->getHeightAt(pos) + offset);
|
||||
|
||||
vertices->push_back(pos);
|
||||
|
||||
|
@ -76,10 +78,15 @@ void CellBorder::createCellBorderGeometry(int x, int y)
|
|||
polygonmode->setMode(osg::PolygonMode::FRONT_AND_BACK, osg::PolygonMode::LINE);
|
||||
stateSet->setAttributeAndModes(polygonmode,osg::StateAttribute::ON);
|
||||
|
||||
mSceneManager->recreateShaders(borderGeode, "debug");
|
||||
sceneManager->recreateShaders(borderGeode, "debug");
|
||||
borderGeode->setNodeMask(mask);
|
||||
|
||||
borderGeode->setNodeMask(mBorderMask);
|
||||
return borderGeode;
|
||||
}
|
||||
|
||||
void CellBorder::createCellBorderGeometry(int x, int y)
|
||||
{
|
||||
auto borderGeode = createBorderGeometry(x, y, 1.f, mWorld->getStorage(), mSceneManager, mBorderMask);
|
||||
mRoot->addChild(borderGeode);
|
||||
|
||||
mCellBorderNodes[std::make_pair(x,y)] = borderGeode;
|
||||
|
|
|
@ -11,6 +11,7 @@ namespace Resource
|
|||
|
||||
namespace Terrain
|
||||
{
|
||||
class Storage;
|
||||
class World;
|
||||
|
||||
/**
|
||||
|
@ -31,6 +32,8 @@ namespace Terrain
|
|||
*/
|
||||
void destroyCellBorderGeometry();
|
||||
|
||||
static osg::ref_ptr<osg::Geode> createBorderGeometry(float x, float y, float size, Storage* terrain, Resource::SceneManager* sceneManager, int mask);
|
||||
|
||||
protected:
|
||||
Terrain::World *mWorld;
|
||||
Resource::SceneManager* mSceneManager;
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
#include <osg/Texture2D>
|
||||
#include <osg/ClusterCullingCallback>
|
||||
#include <osg/Material>
|
||||
#include <osg/MatrixTransform>
|
||||
|
||||
#include <osgUtil/IncrementalCompileOperation>
|
||||
|
||||
|
@ -12,12 +13,14 @@
|
|||
#include <components/resource/scenemanager.hpp>
|
||||
|
||||
#include <components/sceneutil/lightmanager.hpp>
|
||||
#include <components/settings/settings.hpp>
|
||||
|
||||
#include "terraindrawable.hpp"
|
||||
#include "material.hpp"
|
||||
#include "storage.hpp"
|
||||
#include "texturemanager.hpp"
|
||||
#include "compositemaprenderer.hpp"
|
||||
#include <components/misc/constants.hpp>
|
||||
|
||||
namespace Terrain
|
||||
{
|
||||
|
@ -32,6 +35,7 @@ ChunkManager::ChunkManager(Storage *storage, Resource::SceneManager *sceneMgr, T
|
|||
, mCompositeMapSize(512)
|
||||
, mCompositeMapLevel(1.f)
|
||||
, mMaxCompGeometrySize(1.f)
|
||||
, mDebugChunks(Settings::Manager::getBool("debug chunks", "Terrain"))
|
||||
{
|
||||
mMultiPassRoot = new osg::StateSet;
|
||||
mMultiPassRoot->setRenderingHint(osg::StateSet::OPAQUE_BIN);
|
||||
|
@ -234,7 +238,19 @@ osg::ref_ptr<osg::Node> ChunkManager::createChunk(float chunkSize, const osg::Ve
|
|||
}
|
||||
geometry->setNodeMask(mNodeMask);
|
||||
|
||||
return geometry;
|
||||
osg::ref_ptr<osg::Group> result(new osg::Group);
|
||||
result->addChild(geometry);
|
||||
if (mDebugChunks)
|
||||
{
|
||||
auto chunkBorder = CellBorder::createBorderGeometry(chunkCenter.x() - chunkSize / 2.f, chunkCenter.y() - chunkSize / 2.f, chunkSize, mStorage, mSceneManager, getNodeMask());
|
||||
osg::Vec3f center = { chunkCenter.x(), chunkCenter.y(), 0 };
|
||||
osg::ref_ptr<osg::MatrixTransform> trans = new osg::MatrixTransform(osg::Matrixf::translate(-center*Constants::CellSizeInUnits));
|
||||
trans->setDataVariance(osg::Object::STATIC);
|
||||
trans->addChild(chunkBorder);
|
||||
result->addChild(trans);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -72,6 +72,7 @@ namespace Terrain
|
|||
unsigned int mCompositeMapSize;
|
||||
float mCompositeMapLevel;
|
||||
float mMaxCompGeometrySize;
|
||||
bool mDebugChunks = false;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -367,7 +367,7 @@ void updateWaterCullingView(HeightCullCallback* callback, ViewData* vd, osgUtil:
|
|||
for (unsigned int i=0; i<vd->getNumEntries(); ++i)
|
||||
{
|
||||
ViewData::Entry& entry = vd->getEntry(i);
|
||||
osg::BoundingBox bb = static_cast<TerrainDrawable*>(entry.mRenderingNode->asGroup()->getChild(0))->getWaterBoundingBox();
|
||||
osg::BoundingBox bb = static_cast<TerrainDrawable*>(entry.mRenderingNode->asGroup()->getChild(0)->asGroup()->getChild(0))->getWaterBoundingBox();
|
||||
if (!bb.valid())
|
||||
continue;
|
||||
osg::Vec3f ofs (entry.mNode->getCenter().x()*cellworldsize, entry.mNode->getCenter().y()*cellworldsize, 0.f);
|
||||
|
|
|
@ -100,6 +100,15 @@ max composite geometry size
|
|||
Controls the maximum size of simple composite geometry chunk in cell units. With small values there will more draw calls and small textures,
|
||||
but higher values create more overdraw (not every texture layer is used everywhere).
|
||||
|
||||
debug chunks
|
||||
------------
|
||||
|
||||
:Type: boolean
|
||||
:Range: True/False
|
||||
:Default: False
|
||||
|
||||
This debug setting allows you to see the borders of each chunks of the world by drawing lines arround them (as with toggleborder).
|
||||
|
||||
object paging
|
||||
-------------
|
||||
|
||||
|
|
|
@ -139,6 +139,9 @@ composite map resolution = 512
|
|||
# Controls the maximum size of composite geometry, should be >= 1.0. With low values there will be many small chunks, with high values - lesser count of bigger chunks.
|
||||
max composite geometry size = 4.0
|
||||
|
||||
# Draw lines arround chunks.
|
||||
debug chunks = false
|
||||
|
||||
# Use object paging for non active cells
|
||||
object paging = true
|
||||
|
||||
|
|
Loading…
Reference in a new issue