mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-01-30 16:45:33 +00:00
Transparent object markers
This commit is contained in:
parent
801f2d42d5
commit
492b99b008
3 changed files with 40 additions and 6 deletions
|
@ -191,6 +191,7 @@ void CSMPrefs::State::declare()
|
||||||
setTooltip ("Acceleration factor during drag operations while holding down shift").
|
setTooltip ("Acceleration factor during drag operations while holding down shift").
|
||||||
setRange (0.001, 100.0);
|
setRange (0.001, 100.0);
|
||||||
declareDouble ("rotate-factor", "Free rotation factor", 0.007).setPrecision(4).setRange(0.0001, 0.1);
|
declareDouble ("rotate-factor", "Free rotation factor", 0.007).setPrecision(4).setRange(0.0001, 0.1);
|
||||||
|
declareDouble ("object-marker-alpha", "Object Marker Transparency", 0.5).setPrecision(2).setRange(0,1);
|
||||||
|
|
||||||
declareCategory ("Tooltips");
|
declareCategory ("Tooltips");
|
||||||
declareBool ("scene", "Show Tooltips in 3D scenes", true);
|
declareBool ("scene", "Show Tooltips in 3D scenes", true);
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
|
#include <osg/Depth>
|
||||||
#include <osg/Group>
|
#include <osg/Group>
|
||||||
#include <osg/PositionAttitudeTransform>
|
#include <osg/PositionAttitudeTransform>
|
||||||
|
|
||||||
|
@ -285,15 +286,15 @@ osg::ref_ptr<osg::Node> CSVRender::Object::makeMoveOrScaleMarker (int axis)
|
||||||
|
|
||||||
for (int i=0; i<8; ++i)
|
for (int i=0; i<8; ++i)
|
||||||
colours->push_back (osg::Vec4f (axis==0 ? 1.0f : 0.2f, axis==1 ? 1.0f : 0.2f,
|
colours->push_back (osg::Vec4f (axis==0 ? 1.0f : 0.2f, axis==1 ? 1.0f : 0.2f,
|
||||||
axis==2 ? 1.0f : 0.2f, 1.0f));
|
axis==2 ? 1.0f : 0.2f, mMarkerTransparency));
|
||||||
|
|
||||||
for (int i=8; i<8+4+1; ++i)
|
for (int i=8; i<8+4+1; ++i)
|
||||||
colours->push_back (osg::Vec4f (axis==0 ? 1.0f : 0.0f, axis==1 ? 1.0f : 0.0f,
|
colours->push_back (osg::Vec4f (axis==0 ? 1.0f : 0.0f, axis==1 ? 1.0f : 0.0f,
|
||||||
axis==2 ? 1.0f : 0.0f, 1.0f));
|
axis==2 ? 1.0f : 0.0f, mMarkerTransparency));
|
||||||
|
|
||||||
geometry->setColorArray (colours, osg::Array::BIND_PER_VERTEX);
|
geometry->setColorArray (colours, osg::Array::BIND_PER_VERTEX);
|
||||||
|
|
||||||
geometry->getOrCreateStateSet()->setMode (GL_LIGHTING, osg::StateAttribute::OFF);
|
setupCommonMarkerState(geometry);
|
||||||
|
|
||||||
osg::ref_ptr<osg::Geode> geode (new osg::Geode);
|
osg::ref_ptr<osg::Geode> geode (new osg::Geode);
|
||||||
geode->addDrawable (geometry);
|
geode->addDrawable (geometry);
|
||||||
|
@ -350,7 +351,11 @@ osg::ref_ptr<osg::Node> CSVRender::Object::makeRotateMarker (int axis)
|
||||||
vertices->at(index++) = getMarkerPosition(outerX, outerY, -MarkerShaftWidth / 2, axis);
|
vertices->at(index++) = getMarkerPosition(outerX, outerY, -MarkerShaftWidth / 2, axis);
|
||||||
}
|
}
|
||||||
|
|
||||||
colors->at(0) = osg::Vec4f (axis==0 ? 1.0f : 0.2f, axis==1 ? 1.0f : 0.2f, axis==2 ? 1.0f : 0.2f, 1.0f);
|
colors->at(0) = osg::Vec4f (
|
||||||
|
axis==0 ? 1.0f : 0.2f,
|
||||||
|
axis==1 ? 1.0f : 0.2f,
|
||||||
|
axis==2 ? 1.0f : 0.2f,
|
||||||
|
mMarkerTransparency);
|
||||||
|
|
||||||
for (size_t i = 0; i < SegmentCount; ++i)
|
for (size_t i = 0; i < SegmentCount; ++i)
|
||||||
{
|
{
|
||||||
|
@ -374,7 +379,7 @@ osg::ref_ptr<osg::Node> CSVRender::Object::makeRotateMarker (int axis)
|
||||||
geometry->setColorArray(colors, osg::Array::BIND_OVERALL);
|
geometry->setColorArray(colors, osg::Array::BIND_OVERALL);
|
||||||
geometry->addPrimitiveSet(primitives);
|
geometry->addPrimitiveSet(primitives);
|
||||||
|
|
||||||
geometry->getOrCreateStateSet()->setMode (GL_LIGHTING, osg::StateAttribute::OFF);
|
setupCommonMarkerState(geometry);
|
||||||
|
|
||||||
osg::ref_ptr<osg::Geode> geode = new osg::Geode();
|
osg::ref_ptr<osg::Geode> geode = new osg::Geode();
|
||||||
geode->addDrawable (geometry);
|
geode->addDrawable (geometry);
|
||||||
|
@ -382,6 +387,21 @@ osg::ref_ptr<osg::Node> CSVRender::Object::makeRotateMarker (int axis)
|
||||||
return geode;
|
return geode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CSVRender::Object::setupCommonMarkerState(osg::ref_ptr<osg::Geometry> geometry)
|
||||||
|
{
|
||||||
|
const int RenderBin = osg::StateSet::TRANSPARENT_BIN - 1;
|
||||||
|
|
||||||
|
osg::ref_ptr<osg::StateSet> state = geometry->getOrCreateStateSet();
|
||||||
|
state->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
|
||||||
|
state->setMode(GL_BLEND, osg::StateAttribute::ON);
|
||||||
|
|
||||||
|
osg::ref_ptr<osg::Depth> depth(new osg::Depth);
|
||||||
|
depth->setWriteMask(false);
|
||||||
|
state->setAttributeAndModes(depth, osg::StateAttribute::ON);
|
||||||
|
|
||||||
|
state->setRenderBinDetails(RenderBin, "RenderBin");
|
||||||
|
}
|
||||||
|
|
||||||
osg::Vec3f CSVRender::Object::getMarkerPosition (float x, float y, float z, int axis)
|
osg::Vec3f CSVRender::Object::getMarkerPosition (float x, float y, float z, int axis)
|
||||||
{
|
{
|
||||||
switch (axis)
|
switch (axis)
|
||||||
|
@ -399,7 +419,7 @@ osg::Vec3f CSVRender::Object::getMarkerPosition (float x, float y, float z, int
|
||||||
CSVRender::Object::Object (CSMWorld::Data& data, osg::Group* parentNode,
|
CSVRender::Object::Object (CSMWorld::Data& data, osg::Group* parentNode,
|
||||||
const std::string& id, bool referenceable, bool forceBaseToZero)
|
const std::string& id, bool referenceable, bool forceBaseToZero)
|
||||||
: mData (data), mBaseNode(0), mSelected(false), mParentNode(parentNode), mResourceSystem(data.getResourceSystem().get()), mForceBaseToZero (forceBaseToZero),
|
: mData (data), mBaseNode(0), mSelected(false), mParentNode(parentNode), mResourceSystem(data.getResourceSystem().get()), mForceBaseToZero (forceBaseToZero),
|
||||||
mScaleOverride (1), mOverrideFlags (0), mSubMode (-1)
|
mScaleOverride (1), mOverrideFlags (0), mSubMode (-1), mMarkerTransparency(0.5f)
|
||||||
{
|
{
|
||||||
mRootNode = new osg::PositionAttitudeTransform;
|
mRootNode = new osg::PositionAttitudeTransform;
|
||||||
|
|
||||||
|
@ -629,6 +649,12 @@ void CSVRender::Object::setScale (float scale)
|
||||||
adjustTransform();
|
adjustTransform();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CSVRender::Object::setMarkerTransparency(float value)
|
||||||
|
{
|
||||||
|
mMarkerTransparency = value;
|
||||||
|
updateMarker();
|
||||||
|
}
|
||||||
|
|
||||||
void CSVRender::Object::apply (CSMWorld::CommandMacro& commands)
|
void CSVRender::Object::apply (CSMWorld::CommandMacro& commands)
|
||||||
{
|
{
|
||||||
const CSMWorld::RefCollection& collection = mData.getReferences();
|
const CSMWorld::RefCollection& collection = mData.getReferences();
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include <osg/ref_ptr>
|
#include <osg/ref_ptr>
|
||||||
|
#include <osg/Geometry>
|
||||||
#include <osg/Referenced>
|
#include <osg/Referenced>
|
||||||
|
|
||||||
#include <components/esm/defs.hpp>
|
#include <components/esm/defs.hpp>
|
||||||
|
@ -96,6 +97,7 @@ namespace CSVRender
|
||||||
int mOverrideFlags;
|
int mOverrideFlags;
|
||||||
osg::ref_ptr<osg::Node> mMarker[3];
|
osg::ref_ptr<osg::Node> mMarker[3];
|
||||||
int mSubMode;
|
int mSubMode;
|
||||||
|
float mMarkerTransparency;
|
||||||
|
|
||||||
/// Not implemented
|
/// Not implemented
|
||||||
Object (const Object&);
|
Object (const Object&);
|
||||||
|
@ -121,6 +123,9 @@ namespace CSVRender
|
||||||
osg::ref_ptr<osg::Node> makeMoveOrScaleMarker (int axis);
|
osg::ref_ptr<osg::Node> makeMoveOrScaleMarker (int axis);
|
||||||
osg::ref_ptr<osg::Node> makeRotateMarker (int axis);
|
osg::ref_ptr<osg::Node> makeRotateMarker (int axis);
|
||||||
|
|
||||||
|
/// Sets up a stateset with properties common to all marker types.
|
||||||
|
void setupCommonMarkerState(osg::ref_ptr<osg::Geometry> geometry);
|
||||||
|
|
||||||
osg::Vec3f getMarkerPosition (float x, float y, float z, int axis);
|
osg::Vec3f getMarkerPosition (float x, float y, float z, int axis);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -179,6 +184,8 @@ namespace CSVRender
|
||||||
/// Set override scale
|
/// Set override scale
|
||||||
void setScale (float scale);
|
void setScale (float scale);
|
||||||
|
|
||||||
|
void setMarkerTransparency(float value);
|
||||||
|
|
||||||
/// Apply override changes via command and end edit mode
|
/// Apply override changes via command and end edit mode
|
||||||
void apply (CSMWorld::CommandMacro& commands);
|
void apply (CSMWorld::CommandMacro& commands);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue