From 7fb6807e653a8d1258bb8104791ffbc29b17482a Mon Sep 17 00:00:00 2001 From: Aesylwinn Date: Wed, 2 Mar 2016 15:02:06 -0500 Subject: [PATCH 1/3] cell border markers --- apps/opencs/CMakeLists.txt | 2 +- apps/opencs/view/render/cell.cpp | 3 + apps/opencs/view/render/cell.hpp | 2 + apps/opencs/view/render/cellborder.cpp | 97 ++++++++++++++++++++++++++ apps/opencs/view/render/cellborder.hpp | 54 ++++++++++++++ 5 files changed, 157 insertions(+), 1 deletion(-) create mode 100644 apps/opencs/view/render/cellborder.cpp create mode 100644 apps/opencs/view/render/cellborder.hpp diff --git a/apps/opencs/CMakeLists.txt b/apps/opencs/CMakeLists.txt index 74f311c5f..f78c411d2 100644 --- a/apps/opencs/CMakeLists.txt +++ b/apps/opencs/CMakeLists.txt @@ -90,7 +90,7 @@ opencs_units (view/render opencs_units_noqt (view/render lighting lightingday lightingnight - lightingbright object cell terrainstorage tagbase cellarrow cellmarker + lightingbright object cell terrainstorage tagbase cellarrow cellmarker cellborder ) opencs_hdrs_noqt (view/render diff --git a/apps/opencs/view/render/cell.cpp b/apps/opencs/view/render/cell.cpp index 641aeb088..5348f4683 100644 --- a/apps/opencs/view/render/cell.cpp +++ b/apps/opencs/view/render/cell.cpp @@ -93,6 +93,9 @@ CSVRender::Cell::Cell (CSMWorld::Data& data, osg::Group* rootNode, const std::st mTerrain.reset(new Terrain::TerrainGrid(mCellNode, data.getResourceSystem().get(), NULL, new TerrainStorage(mData), Mask_Terrain)); mTerrain->loadCell(esmLand.mX, esmLand.mY); + + mCellBorder.reset(new CellBorder(mCellNode, mCoordinates)); + mCellBorder->buildShape(esmLand); } } } diff --git a/apps/opencs/view/render/cell.hpp b/apps/opencs/view/render/cell.hpp index 22f9872e3..54f5bea1e 100644 --- a/apps/opencs/view/render/cell.hpp +++ b/apps/opencs/view/render/cell.hpp @@ -16,6 +16,7 @@ #include "object.hpp" #include "cellarrow.hpp" #include "cellmarker.hpp" +#include "cellborder.hpp" class QModelIndex; @@ -44,6 +45,7 @@ namespace CSVRender CSMWorld::CellCoordinates mCoordinates; std::auto_ptr mCellArrows[4]; std::auto_ptr mCellMarker; + std::auto_ptr mCellBorder; bool mDeleted; /// Ignored if cell does not have an object with the given ID. diff --git a/apps/opencs/view/render/cellborder.cpp b/apps/opencs/view/render/cellborder.cpp new file mode 100644 index 000000000..fd0492e5d --- /dev/null +++ b/apps/opencs/view/render/cellborder.cpp @@ -0,0 +1,97 @@ +#include "cellborder.hpp" + +#include +#include +#include +#include +#include + +#include + +#include "mask.hpp" + +#include "../../model/world/cellcoordinates.hpp" + +const int CSVRender::CellBorder::CellSize = ESM::Land::REAL_SIZE; +const int CSVRender::CellBorder::VertexCount = (ESM::Land::LAND_SIZE * 4) - 3; + + +CSVRender::CellBorder::CellBorder(osg::Group* cellNode, const CSMWorld::CellCoordinates& coords) + : mParentNode(cellNode) +{ + mBaseNode = new osg::PositionAttitudeTransform(); + mBaseNode->setNodeMask(Mask_CellBorder); + mBaseNode->setPosition(osg::Vec3f(coords.getX() * CellSize, coords.getY() * CellSize, 10)); + + mParentNode->addChild(mBaseNode); +} + +CSVRender::CellBorder::~CellBorder() +{ + mParentNode->removeChild(mBaseNode); +} + +void CSVRender::CellBorder::buildShape(const ESM::Land& esmLand) +{ + const ESM::Land::LandData* landData = esmLand.getLandData(ESM::Land::DATA_VHGT); + + if (!landData) + return; + + osg::ref_ptr geometry = new osg::Geometry(); + + // Vertices + osg::ref_ptr vertices = new osg::Vec3Array(); + + int x = 0, y = 0; + for (; x < ESM::Land::LAND_SIZE; ++x) + vertices->push_back(osg::Vec3f(scaleToWorld(x), scaleToWorld(y), landData->mHeights[landIndex(x, y)])); + + x = ESM::Land::LAND_SIZE - 1; + for (; y < ESM::Land::LAND_SIZE; ++y) + vertices->push_back(osg::Vec3f(scaleToWorld(x), scaleToWorld(y), landData->mHeights[landIndex(x, y)])); + + y = ESM::Land::LAND_SIZE - 1; + for (; x >= 0; --x) + vertices->push_back(osg::Vec3f(scaleToWorld(x), scaleToWorld(y), landData->mHeights[landIndex(x, y)])); + + x = 0; + for (; y >= 0; --y) + vertices->push_back(osg::Vec3f(scaleToWorld(x), scaleToWorld(y), landData->mHeights[landIndex(x, y)])); + + geometry->setVertexArray(vertices); + + // Color + osg::ref_ptr colors = new osg::Vec4Array(); + colors->push_back(osg::Vec4f(0.f, 0.5f, 0.f, 1.f)); + + geometry->setColorArray(colors); + geometry->setColorBinding(osg::Geometry::BIND_PER_PRIMITIVE_SET); + + // Primitive + osg::ref_ptr primitives = + new osg::DrawElementsUShort(osg::PrimitiveSet::LINE_STRIP, VertexCount+1); + + for (size_t i = 0; i < VertexCount; ++i) + primitives->setElement(i, i); + + primitives->setElement(VertexCount, 0); + + geometry->addPrimitiveSet(primitives); + geometry->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF); + + + osg::ref_ptr geode = new osg::Geode(); + geode->addDrawable(geometry); + mBaseNode->addChild(geode); +} + +size_t CSVRender::CellBorder::landIndex(int x, int y) +{ + return y * ESM::Land::LAND_SIZE + x; +} + +float CSVRender::CellBorder::scaleToWorld(int value) +{ + return (CellSize + 128) * (float)value / ESM::Land::LAND_SIZE; +} diff --git a/apps/opencs/view/render/cellborder.hpp b/apps/opencs/view/render/cellborder.hpp new file mode 100644 index 000000000..c91aa46c6 --- /dev/null +++ b/apps/opencs/view/render/cellborder.hpp @@ -0,0 +1,54 @@ +#ifndef OPENCS_VIEW_CELLBORDER_H +#define OPENCS_VIEW_CELLBORDER_H + +#include + +#include + +namespace osg +{ + class Group; + class PositionAttitudeTransform; +} + +namespace ESM +{ + struct Land; +} + +namespace CSMWorld +{ + class CellCoordinates; +} + +namespace CSVRender +{ + + class CellBorder + { + public: + + CellBorder(osg::Group* cellNode, const CSMWorld::CellCoordinates& coords); + ~CellBorder(); + + void buildShape(const ESM::Land& esmLand); + + private: + + static const int CellSize; + static const int VertexCount; + + size_t landIndex(int x, int y); + float scaleToWorld(int val); + + // unimplemented + CellBorder(const CellBorder&); + CellBorder& operator=(const CellBorder&); + + osg::Group* mParentNode; + osg::ref_ptr mBaseNode; + + }; +} + +#endif From fa1bd72bc0e13b094d3366d52ce9b518a32033c3 Mon Sep 17 00:00:00 2001 From: Aesylwinn Date: Wed, 2 Mar 2016 15:48:05 -0500 Subject: [PATCH 2/3] fix usage of deprecated function --- apps/opencs/view/render/cellborder.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/opencs/view/render/cellborder.cpp b/apps/opencs/view/render/cellborder.cpp index fd0492e5d..6073807ce 100644 --- a/apps/opencs/view/render/cellborder.cpp +++ b/apps/opencs/view/render/cellborder.cpp @@ -65,8 +65,7 @@ void CSVRender::CellBorder::buildShape(const ESM::Land& esmLand) osg::ref_ptr colors = new osg::Vec4Array(); colors->push_back(osg::Vec4f(0.f, 0.5f, 0.f, 1.f)); - geometry->setColorArray(colors); - geometry->setColorBinding(osg::Geometry::BIND_PER_PRIMITIVE_SET); + geometry->setColorArray(colors, osg::Array::BIND_PER_PRIMITIVE_SET); // Primitive osg::ref_ptr primitives = From 9d985d883b7abdbe31c17148955937a1912b6455 Mon Sep 17 00:00:00 2001 From: Aesylwinn Date: Wed, 2 Mar 2016 20:45:04 -0500 Subject: [PATCH 3/3] added grid icon --- apps/opencs/view/render/pagedworldspacewidget.cpp | 2 +- files/opencs/grid-view-small.png | Bin 0 -> 472 bytes files/opencs/grid-view.png | Bin 0 -> 210 bytes files/opencs/resources.qrc | 2 ++ 4 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 files/opencs/grid-view-small.png create mode 100644 files/opencs/grid-view.png diff --git a/apps/opencs/view/render/pagedworldspacewidget.cpp b/apps/opencs/view/render/pagedworldspacewidget.cpp index d71446d0b..60c5d1a23 100644 --- a/apps/opencs/view/render/pagedworldspacewidget.cpp +++ b/apps/opencs/view/render/pagedworldspacewidget.cpp @@ -564,7 +564,7 @@ CSVWidget::SceneToolToggle *CSVRender::PagedWorldspaceWidget::makeControlVisibil mControlElements->addButton (":placeholder", Mask_CellMarker, ":placeholder", "Cell marker"); mControlElements->addButton (":placeholder", Mask_CellArrow, ":placeholder", "Cell arrows"); - mControlElements->addButton (":placeholder", Mask_CellBorder, ":placeholder", "Cell border"); + mControlElements->addButton (":scenetoolbar/grid", Mask_CellBorder, ":scenetoolbar/grid-small", "Cell border"); mControlElements->setSelectionMask (0xffffffff); diff --git a/files/opencs/grid-view-small.png b/files/opencs/grid-view-small.png new file mode 100644 index 0000000000000000000000000000000000000000..6a874f21b0601285bdb1834f5362f74f97f8974e GIT binary patch literal 472 zcmV;}0Vn>6P)LD;)H7tqmU*2g2SKQ&-84189VR>Aez_PF; zke>;oev0!FXf^85q0xA&?ca| z21&wq%tFOrg8Z>M?PlcbimFjaOy@_OG-zA$9o2lIC1LTXD#)3{p+z6P&Hat~Qvmsn z1fK{H-gf$Lr%M!cTXEq{cdIUMAF(X@vr+evd|j~!yU!oEy8DS5l!rvRXoQW^-hX{J z)UM`sG(+9|AGbu!`|7T`>cB5*&%5}S+J&_4SRRtA{Ug8(yjFWjPA`7rbl%n-(?wf- zj@wSip0K0ZBROICc$%=V5vo2hs?=jAgCp@r@M O0000PcU;ZX% ze0bRW|ETJ6A+~cOZ2SkV&%DilyRKA!&he_(cW(bTbpqMaFZ9-FR)jD!keQLB%#t9! tiJK9~zR_y3QOyjbV%80AhCe(3jGNC{Y^xHSFbOEc;OXk;vd$@?2>|IcL5lzY literal 0 HcmV?d00001 diff --git a/files/opencs/resources.qrc b/files/opencs/resources.qrc index 1bcd3ab4f..973f414fb 100644 --- a/files/opencs/resources.qrc +++ b/files/opencs/resources.qrc @@ -80,6 +80,8 @@ flying eye.png orbit2.png scene-play.png + grid-view.png + grid-view-small.png scene-view-references.png scene-view-terrain.png scene-view-water.png