*** empty log message ***
This commit is contained in:
parent
5a939f5420
commit
15f88f35b2
@ -35,9 +35,9 @@ MAKEDEPEND = ignore
|
||||
##
|
||||
## Usage:
|
||||
## Default - VERSION_REVISION is set to the value defined here
|
||||
## Env variable PRODUCER_VERSION_REVISION overrides default
|
||||
## Env variable OSG_VERSION_REVISION overrides default
|
||||
## e.g.:
|
||||
## % setenv PRODUCER_VERSION_REVISION 5
|
||||
## % setenv OSG_VERSION_REVISION 5
|
||||
## % make version
|
||||
## Command line overrides env variable
|
||||
## % make VERSION_REVISION=
|
||||
@ -386,16 +386,17 @@ ifeq ($(OS),CYGWIN)
|
||||
LIB_EXT = dll
|
||||
PLUGIN_EXT = dll
|
||||
LINK = cp -f
|
||||
INST_SYS_PREFIX = /usr/local/OpenSceneGraph
|
||||
INST_LIBS = $(INST_SYS_PREFIX)/bin
|
||||
INST_PLUGINS = $(INST_SYS_PREFIX)/bin
|
||||
INST_INCLUDE = $(INST_SYS_PREFIX)/include
|
||||
INST_LOCATION = /usr/local/OpenSceneGraph
|
||||
INST_LIBS = $(INST_LOCATION)/bin
|
||||
INST_PLUGINS = $(INST_LOCATION)/bin
|
||||
INST_INCLUDE = $(INST_LOCATION)/include
|
||||
INST_SHARE_PREFIX = /usr/local/OpenSceneGraph
|
||||
INST_SRC = $(INST_SHARE_PREFIX)/src
|
||||
INST_EXAMPLES = $(INST_SHARE_PREFIX)/bin
|
||||
INST_EXAMPLE_SRC = $(INST_SHARE_PREFIX)/src/demos
|
||||
INST_DOC = $(INST_SHARE_PREFIX)/doc
|
||||
INST_DATA = $(INST_SHARE_PREFIX)/data
|
||||
MAKEDIST = $(TOPDIR)/Make/makeinnosetup
|
||||
endif
|
||||
|
||||
#### Cygwin/Mingw specific definitions
|
||||
@ -432,10 +433,10 @@ ifeq ($(OS),MINGW)
|
||||
LIB_EXT = dll
|
||||
PLUGIN_EXT = dll
|
||||
LINK = cp -f
|
||||
INST_SYS_PREFIX = /usr/local/OpenSceneGraph
|
||||
INST_LIBS = $(INST_SYS_PREFIX)/bin
|
||||
INST_PLUGINS = $(INST_SYS_PREFIX)/bin
|
||||
INST_INCLUDE = $(INST_SYS_PREFIX)/include
|
||||
INST_LOCATION = /usr/local/OpenSceneGraph
|
||||
INST_LIBS = $(INST_LOCATION)/bin
|
||||
INST_PLUGINS = $(INST_LOCATION)/bin
|
||||
INST_INCLUDE = $(INST_LOCATION)/include
|
||||
INST_SHARE_PREFIX = /usr/local/OpenSceneGraph
|
||||
INST_SRC = $(INST_SHARE_PREFIX)/src
|
||||
INST_EXAMPLES = $(INST_SHARE_PREFIX)/bin
|
||||
|
@ -128,6 +128,7 @@ EXAMPLE_DIRS = \
|
||||
osgparticle\
|
||||
osgpick\
|
||||
osgprerender\
|
||||
osgpoints\
|
||||
osgreflect\
|
||||
osgscribe\
|
||||
osgsequence\
|
||||
@ -146,8 +147,10 @@ EXAMPLE_DIRS = \
|
||||
osgversion\
|
||||
osgvertexprogram\
|
||||
osgviewer\
|
||||
osgprerendercubemap\
|
||||
|
||||
# osgprerendercubemap\
|
||||
# osgsimulation\
|
||||
# osgdemeter\
|
||||
# osgjigsaw\
|
||||
|
||||
# comment in you want to compile the cluster demo.
|
||||
|
@ -23,7 +23,7 @@ print_pkginfo()
|
||||
PKG="$1"
|
||||
NAME="$2"
|
||||
`[ "$OS" = "SunOS" ] && echo ARCH=sparc`
|
||||
VERSION=`$TOPDIR/bin/osgversion`
|
||||
VERSION=`gmake -s version`
|
||||
CATEGORY="application,graphics,opengl"
|
||||
DESC="$3"
|
||||
BASEDIR="/opt/"
|
||||
@ -67,7 +67,7 @@ make_installable()
|
||||
{
|
||||
PKGNAME=$1
|
||||
PKGDIR=$PKGNAME.pkg
|
||||
DISTNAME="$PKGNAME"-"`$TOPDIR/bin/osgversion`"-"$OS".shar
|
||||
DISTNAME="$PKGNAME"-"`gmake -s version`"-"$OS".shar
|
||||
|
||||
THISDIR=`pwd`
|
||||
cd $PKGSUBDIR
|
||||
|
@ -753,6 +753,33 @@ Package=<4>
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "Example osgprerendercubemap"=.\examples\osgprerendercubemap\osgprerendercubemap.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name Core osg
|
||||
End Project Dependency
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name Core osgDB
|
||||
End Project Dependency
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name Core osgGA
|
||||
End Project Dependency
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name Core osgProducer
|
||||
End Project Dependency
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name Core osgUtil
|
||||
End Project Dependency
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "Example osgreflect"=.\examples\osgreflect\osgreflect.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
|
@ -421,6 +421,10 @@ SOURCE=..\..\src\osg\Transform.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\..\src\osg\TransformAttributeFunctor.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\..\src\osg\BlendFunc.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
@ -837,6 +841,11 @@ SOURCE=..\..\Include\Osg\Transform
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\..\Include\Osg\TransformAttributeFunctor
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
|
||||
SOURCE=..\..\Include\Osg\TriangleFunctor
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
@ -15,5 +15,13 @@ EXEC = osgcameragroup
|
||||
INC += $(PRODUCER_INCLUDE_DIR) -I/usr/X11R6/include -I/usr/X11R6/include
|
||||
LDFLAGS += $(PRODUCER_LIB_DIR) -L/usr/X11R6/lib
|
||||
|
||||
|
||||
ifeq ($(USE_OPEN_THREAD),1)
|
||||
DEF += -D_USE_OPEN_THREAD
|
||||
INC += $(INC_OPEN_THREAD)
|
||||
LDFLAGS += $(LIB_OPEN_THREAD)
|
||||
LIBS += -lOpenThread
|
||||
endif
|
||||
|
||||
include $(TOPDIR)/Make/makerules
|
||||
|
||||
|
@ -149,10 +149,10 @@ int main( int argc, char **argv )
|
||||
|
||||
const osg::BoundingSphere& bs = loadedModel->getBound();
|
||||
|
||||
Producer::Trackball tb;
|
||||
tb.setOrientation( Producer::Trackball::Z_UP );
|
||||
tb.setDistance(bs.radius()*3.0f);
|
||||
tb.translate(-bs.center().x(),-bs.center().y(),-bs.center().z());
|
||||
osg::ref_ptr<Producer::Trackball> tb = new Producer::Trackball;
|
||||
tb->setOrientation( Producer::Trackball::Z_UP );
|
||||
tb->setDistance(bs.radius()*3.0f);
|
||||
tb->translate(-bs.center().x(),-bs.center().y(),-bs.center().z());
|
||||
|
||||
// create the windows and run the threads.
|
||||
cg.realize();
|
||||
@ -168,10 +168,10 @@ int main( int argc, char **argv )
|
||||
// call all node update callbacks and animations.
|
||||
cg.getSceneData()->accept(update);
|
||||
|
||||
tb.input( kbmcb.mx(), kbmcb.my(), kbmcb.mbutton() );
|
||||
tb->input( kbmcb.mx(), kbmcb.my(), kbmcb.mbutton() );
|
||||
|
||||
// update the main producer camera
|
||||
cg.setViewByMatrix(tb.getMatrix());
|
||||
cg.setViewByMatrix(tb->getMatrix());
|
||||
|
||||
// fire off the cull and draw traversals of the scene.
|
||||
cg.frame();
|
||||
|
@ -9,6 +9,8 @@
|
||||
#include <osgDB/WriteFile>
|
||||
#include <osgDB/ReaderWriter>
|
||||
|
||||
#include <osgUtil/Optimizer>
|
||||
|
||||
#include "OrientationConverter.h"
|
||||
#include "GeoSet.h"
|
||||
|
||||
@ -273,6 +275,10 @@ int main( int argc, char **argv )
|
||||
ConvertGeoSetsToGeometryVisitor cgtg;
|
||||
root->accept(cgtg);
|
||||
|
||||
// optimize the scene graph, remove rendundent nodes and state etc.
|
||||
osgUtil::Optimizer optimizer;
|
||||
optimizer.optimize(root.get());
|
||||
|
||||
|
||||
if( do_convert )
|
||||
root = oc.convert( root.get() );
|
||||
|
@ -35,8 +35,17 @@ osg::Node* createHUD()
|
||||
// turn lighting off for the text and disable depth test to ensure its always ontop.
|
||||
osg::StateSet* stateset = geode->getOrCreateStateSet();
|
||||
stateset->setMode(GL_LIGHTING,osg::StateAttribute::OFF);
|
||||
//stateset->setMode(GL_DEPTH_TEST,osg::StateAttribute::OFF);
|
||||
|
||||
#if 0
|
||||
// to ensure the hud appears on top we can either use osg::Depth to force the
|
||||
// depth fragments to be placed at the front of the screen.
|
||||
stateset->setAttribute(new osg::Depth(osg::Depth::LESS,0.0,0.0001));
|
||||
#else
|
||||
// or disable depth test, and make sure that the hud is drawn after everything
|
||||
// else so that it always appears ontop.
|
||||
stateset->setMode(GL_DEPTH_TEST,osg::StateAttribute::OFF);
|
||||
stateset->setRenderBinDetails(11,"RenderBin");
|
||||
#endif
|
||||
|
||||
osg::Vec3 position(150.0f,800.0f,0.0f);
|
||||
osg::Vec3 delta(0.0f,-120.0f,0.0f);
|
||||
|
@ -356,7 +356,7 @@ int main( int argc, char **argv )
|
||||
++itr)
|
||||
{
|
||||
// switch off small feature culling to prevent the light points from being culled.
|
||||
osgUtil::SceneView* sceneview = itr->get();
|
||||
osgUtil::SceneView* sceneview = (*itr)->getSceneView();
|
||||
sceneview->setCullingMode( sceneview->getCullingMode() & ~osg::CullStack::SMALL_FEATURE_CULLING);
|
||||
}
|
||||
|
||||
|
@ -508,7 +508,7 @@ int main( int argc, char **argv )
|
||||
itr!=viewer.getSceneHandlerList().end();
|
||||
++itr)
|
||||
{
|
||||
osgUtil::SceneView* sceneview = itr->get();
|
||||
osgUtil::SceneView* sceneview = (*itr)->getSceneView();
|
||||
sceneview->setCullMask(0xffffffff);
|
||||
sceneview->setCullMaskLeft(0x00000001);
|
||||
sceneview->setCullMaskRight(0x00000002);
|
||||
|
@ -20,9 +20,9 @@
|
||||
#include <osg/Geometry>
|
||||
#include <osg/Geode>
|
||||
|
||||
#include <osg/Group>
|
||||
#include <osg/Projection>
|
||||
#include <osg/MatrixTransform>
|
||||
|
||||
#include <osgText/Text>
|
||||
|
||||
#include <osgDB/Registry>
|
||||
@ -137,18 +137,14 @@ osg::Node* createRectangle(osg::BoundingBox& bb,
|
||||
// disable display list so our modified tex coordinates show up
|
||||
geom->setUseDisplayList(false);
|
||||
|
||||
osg::Geode* geode = new osg::Geode;
|
||||
geode->addDrawable(geom);
|
||||
|
||||
// setup texture
|
||||
osg::TextureRectangle* texture = new osg::TextureRectangle;
|
||||
texture->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP);
|
||||
texture->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP);
|
||||
|
||||
// load image
|
||||
osg::Image* img = osgDB::readImageFile(filename);
|
||||
texture->setImage(img);
|
||||
|
||||
// setup state
|
||||
osg::StateSet* state = geom->getOrCreateStateSet();
|
||||
state->setTextureAttributeAndModes(0, texture, osg::StateAttribute::ON);
|
||||
|
||||
@ -156,6 +152,8 @@ osg::Node* createRectangle(osg::BoundingBox& bb,
|
||||
state->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
|
||||
|
||||
// install 'update' callback
|
||||
osg::Geode* geode = new osg::Geode;
|
||||
geode->addDrawable(geom);
|
||||
geode->setUpdateCallback(new TexturePanCallback(geom, img));
|
||||
|
||||
return geode;
|
||||
@ -190,17 +188,17 @@ osg::Node* createHUD()
|
||||
state->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF);
|
||||
|
||||
// add text
|
||||
osg::Vec3 pos(150.0f, 800.0f, 0.0f);
|
||||
osg::Vec3 pos(120.0f, 800.0f, 0.0f);
|
||||
const osg::Vec3 delta(0.0f, -80.0f, 0.0f);
|
||||
|
||||
const char* text[] = {
|
||||
"TextureRectangle Mini-HOWTO",
|
||||
"- essentially behaves like Texture2D, *except* that:",
|
||||
"- tex coords must be non-normalized (0..width) instead of (0..1)",
|
||||
"- wrap mode must be CLAMP, CLAMP_TO_EDGE, or CLAMP_TO_BORDER",
|
||||
"- repeating wrap modes are *not* supported",
|
||||
"- texture border is *not* supported",
|
||||
"- texture mipmaps are *not* supported",
|
||||
"- tex coords must be non-normalized (0..pixel) instead of (0..1)",
|
||||
"- wrap modes must be CLAMP, CLAMP_TO_EDGE, or CLAMP_TO_BORDER\n repeating wrap modes are not supported",
|
||||
"- filter modes must be NEAREST or LINEAR since\n mipmaps are not supported",
|
||||
"- texture borders are not supported",
|
||||
"- defaults should be fine",
|
||||
NULL
|
||||
};
|
||||
const char** t = text;
|
||||
@ -227,8 +225,10 @@ osg::Node* createModel(const std::string& filename)
|
||||
{
|
||||
osg::Group* root = new osg::Group;
|
||||
|
||||
osg::BoundingBox bb(0.0f,0.0f,0.0f,1.0f,1.0f,1.0f);
|
||||
root->addChild(createRectangle(bb, filename)); // XXX
|
||||
if (filename != "X") {
|
||||
osg::BoundingBox bb(0.0f,0.0f,0.0f,1.0f,1.0f,1.0f);
|
||||
root->addChild(createRectangle(bb, filename)); // XXX
|
||||
}
|
||||
|
||||
root->addChild(createHUD());
|
||||
|
||||
|
@ -13,6 +13,43 @@
|
||||
#include <osgUtil/Optimizer>
|
||||
#include <osgProducer/Viewer>
|
||||
|
||||
|
||||
#if 0
|
||||
enum Methods
|
||||
{
|
||||
SET_1,
|
||||
SET_2,
|
||||
END
|
||||
};
|
||||
|
||||
|
||||
typedef std::pair<Methods,std::string> MethodPair;
|
||||
|
||||
class Proxy
|
||||
{
|
||||
public:
|
||||
Proxy(MethodPair* methods)
|
||||
{
|
||||
std::cout<<"methods "<<methods<<std::endl;
|
||||
for(int i=0;methods[i].first!=END;++i)
|
||||
{
|
||||
std::cout<<"\t"<<methods[i].first<<"\t"<<methods[i].second<<std::endl;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
static MethodPair methods[] =
|
||||
{
|
||||
MethodPair(SET_1,"SET_1"),
|
||||
MethodPair(SET_2,"SET_2"),
|
||||
MethodPair(END,"")
|
||||
};
|
||||
|
||||
Proxy myproxy(methods);
|
||||
|
||||
#endif
|
||||
|
||||
int main( int argc, char **argv )
|
||||
{
|
||||
|
||||
|
@ -64,7 +64,7 @@ class SG_EXPORT CollectOccludersVisitor : public osg::NodeVisitor, public osg::C
|
||||
protected:
|
||||
|
||||
/** prevent unwanted copy construction.*/
|
||||
CollectOccludersVisitor(const CollectOccludersVisitor&):osg::NodeVisitor(),osg::CullStack() {}
|
||||
//CollectOccludersVisitor(const CollectOccludersVisitor&):osg::NodeVisitor(),osg::CullStack() {}
|
||||
|
||||
/** prevent unwanted copy operator.*/
|
||||
CollectOccludersVisitor& operator = (const CollectOccludersVisitor&) { return *this; }
|
||||
|
@ -340,7 +340,9 @@ class SG_EXPORT Drawable : public Object
|
||||
|
||||
virtual ~PrimitiveFunctor() {}
|
||||
|
||||
virtual void setVertexArray(unsigned int count,const Vec2* vertices) = 0;
|
||||
virtual void setVertexArray(unsigned int count,const Vec3* vertices) = 0;
|
||||
virtual void setVertexArray(unsigned int count,const Vec4* vertices) = 0;
|
||||
|
||||
virtual void drawArrays(GLenum mode,GLint first,GLsizei count) = 0;
|
||||
virtual void drawElements(GLenum mode,GLsizei count,const GLubyte* indices) = 0;
|
||||
@ -348,8 +350,12 @@ class SG_EXPORT Drawable : public Object
|
||||
virtual void drawElements(GLenum mode,GLsizei count,const GLuint* indices) = 0;
|
||||
|
||||
virtual void begin(GLenum mode) = 0;
|
||||
virtual void vertex(const Vec2& vert) = 0;
|
||||
virtual void vertex(const Vec3& vert) = 0;
|
||||
virtual void vertex(const Vec4& vert) = 0;
|
||||
virtual void vertex(float x,float y) = 0;
|
||||
virtual void vertex(float x,float y,float z) = 0;
|
||||
virtual void vertex(float x,float y,float z,float w) = 0;
|
||||
virtual void end() = 0;
|
||||
|
||||
};
|
||||
|
@ -51,9 +51,9 @@ class SG_EXPORT Geometry : public Drawable
|
||||
BIND_PER_VERTEX
|
||||
};
|
||||
|
||||
void setVertexArray(Vec3Array* array) { _vertexArray = array; dirtyDisplayList(); dirtyBound(); }
|
||||
Vec3Array* getVertexArray() { return _vertexArray.get(); }
|
||||
const Vec3Array* getVertexArray() const { return _vertexArray.get(); }
|
||||
void setVertexArray(Array* array) { _vertexArray = array; dirtyDisplayList(); dirtyBound(); }
|
||||
Array* getVertexArray() { return _vertexArray.get(); }
|
||||
const Array* getVertexArray() const { return _vertexArray.get(); }
|
||||
|
||||
void setVertexIndices(IndexArray* array) { _vertexIndices = array; _fastPathComputed=false; dirtyDisplayList(); dirtyBound(); }
|
||||
IndexArray* getVertexIndices() { return _vertexIndices.get(); }
|
||||
@ -366,31 +366,31 @@ class SG_EXPORT Geometry : public Drawable
|
||||
#ifdef COMPILE_POSSIBLE_NEW_ARRAY_METHODS
|
||||
AttributeList _attributeList;
|
||||
#endif
|
||||
ref_ptr<Vec3Array> _vertexArray;
|
||||
ref_ptr<IndexArray> _vertexIndices;
|
||||
ref_ptr<Array> _vertexArray;
|
||||
ref_ptr<IndexArray> _vertexIndices;
|
||||
|
||||
mutable AttributeBinding _normalBinding;
|
||||
ref_ptr<Vec3Array> _normalArray;
|
||||
ref_ptr<IndexArray> _normalIndices;
|
||||
ref_ptr<Vec3Array> _normalArray;
|
||||
ref_ptr<IndexArray> _normalIndices;
|
||||
|
||||
mutable AttributeBinding _colorBinding;
|
||||
ref_ptr<Array> _colorArray;
|
||||
ref_ptr<IndexArray> _colorIndices;
|
||||
ref_ptr<Array> _colorArray;
|
||||
ref_ptr<IndexArray> _colorIndices;
|
||||
|
||||
mutable AttributeBinding _secondaryColorBinding;
|
||||
ref_ptr<Array> _secondaryColorArray;
|
||||
ref_ptr<IndexArray> _secondaryColorIndices;
|
||||
ref_ptr<Array> _secondaryColorArray;
|
||||
ref_ptr<IndexArray> _secondaryColorIndices;
|
||||
|
||||
mutable AttributeBinding _fogCoordBinding;
|
||||
ref_ptr<Array> _fogCoordArray;
|
||||
ref_ptr<IndexArray> _fogCoordIndices;
|
||||
ref_ptr<Array> _fogCoordArray;
|
||||
ref_ptr<IndexArray> _fogCoordIndices;
|
||||
|
||||
TexCoordArrayList _texCoordList;
|
||||
TexCoordArrayList _texCoordList;
|
||||
|
||||
VertexAttribArrayList _vertexAttribList;
|
||||
mutable VertexAttribBindingList _vertexAttribBindingList;
|
||||
VertexAttribArrayList _vertexAttribList;
|
||||
mutable VertexAttribBindingList _vertexAttribBindingList;
|
||||
|
||||
mutable bool _fastPathComputed;
|
||||
mutable bool _fastPathComputed;
|
||||
mutable bool _fastPath;
|
||||
};
|
||||
|
||||
|
@ -155,6 +155,9 @@ class SG_EXPORT Image : public Object
|
||||
/** return the numbers of bytes the whole row/image/volume of pixels occupies.*/
|
||||
inline unsigned int getTotalSizeInBytes() const { return getImageSizeInBytes()*_r; }
|
||||
|
||||
/** return the numbers of bytes the whole row/image/volume of pixels occupies, including all mip maps if included.*/
|
||||
unsigned int getTotalSizeInBytesIncludingMipmaps() const;
|
||||
|
||||
/** raw image data.*/
|
||||
inline unsigned char *data() { return _data; }
|
||||
|
||||
|
@ -113,6 +113,12 @@ const double PI_4 = 0.78539816339744830962;
|
||||
template<typename T>
|
||||
inline T absolute(T v) { return v<(T)0?-v:v; }
|
||||
|
||||
/** return true if float lhs and rhs are equivalent, meaning that the difference between then is less than an epsilon value which default to 1e-6.*/
|
||||
inline float equivalent(float lhs,float rhs,float epsilon=1e-6) { float delta = rhs-lhs; return delta<0.0f?delta>=-epsilon:delta<=epsilon; }
|
||||
|
||||
/** return true if double lhs and rhs are equivalent, meaning that the difference between then is less than an epsilon value which default to 1e-6.*/
|
||||
inline double equivalent(double lhs,double rhs,double epsilon=1e-6) { double delta = rhs-lhs; return delta<0.0?delta>=-epsilon:delta<=epsilon; }
|
||||
|
||||
/** return the minimum of two values, equivilant to std::min.
|
||||
* std::min not used because of STL implementation under IRIX contains no std::min.*/
|
||||
template<typename T>
|
||||
|
@ -31,7 +31,9 @@ class SG_EXPORT Point : public StateAttribute
|
||||
StateAttribute(point,copyop),
|
||||
_size(point._size),
|
||||
_fadeThresholdSize(point._fadeThresholdSize),
|
||||
_distanceAttenuation(point._distanceAttenuation) {}
|
||||
_distanceAttenuation(point._distanceAttenuation),
|
||||
_minSize(point._minSize),
|
||||
_maxSize(point._maxSize) {}
|
||||
|
||||
META_StateAttribute(osg, Point, POINT);
|
||||
|
||||
@ -46,6 +48,8 @@ class SG_EXPORT Point : public StateAttribute
|
||||
COMPARE_StateAttribute_Parameter(_size)
|
||||
COMPARE_StateAttribute_Parameter(_fadeThresholdSize)
|
||||
COMPARE_StateAttribute_Parameter(_distanceAttenuation)
|
||||
COMPARE_StateAttribute_Parameter(_minSize)
|
||||
COMPARE_StateAttribute_Parameter(_maxSize)
|
||||
|
||||
return 0; // passed all the above comparison macro's, must be equal.
|
||||
}
|
||||
@ -64,6 +68,12 @@ class SG_EXPORT Point : public StateAttribute
|
||||
void setDistanceAttenuation(const Vec3& distanceAttenuation);
|
||||
inline const Vec3& getDistanceAttenuation() const { return _distanceAttenuation; }
|
||||
|
||||
void setMinSize(float minSize);
|
||||
inline float getMinSize() const {return _minSize;}
|
||||
|
||||
void setMaxSize(float maxSize);
|
||||
inline float getMaxSize() const {return _maxSize;}
|
||||
|
||||
virtual void apply(State& state) const;
|
||||
|
||||
static void init_GL_EXT();
|
||||
@ -75,6 +85,8 @@ class SG_EXPORT Point : public StateAttribute
|
||||
float _size;
|
||||
float _fadeThresholdSize;
|
||||
Vec3 _distanceAttenuation;
|
||||
float _minSize;
|
||||
float _maxSize;
|
||||
|
||||
};
|
||||
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include <osg/FrameStamp>
|
||||
#include <osg/DisplaySettings>
|
||||
#include <osg/Polytope>
|
||||
#include <osg/Viewport>
|
||||
|
||||
#include <vector>
|
||||
#include <map>
|
||||
@ -80,6 +81,12 @@ class SG_EXPORT State : public Referenced
|
||||
/** reset the state object to an empty stack.*/
|
||||
void reset();
|
||||
|
||||
inline const Viewport* getCurrentViewport() const
|
||||
{
|
||||
return static_cast<const Viewport*>(getLastAppliedAttribute(osg::StateAttribute::VIEWPORT));
|
||||
}
|
||||
|
||||
|
||||
inline void applyProjectionMatrix(const osg::RefMatrix* matrix)
|
||||
{
|
||||
if (_projection!=matrix)
|
||||
|
@ -84,8 +84,8 @@ class SG_EXPORT TextureRectangle : public Texture
|
||||
SubloadCallback* getSubloadCallback() { return _subloadCallback.get(); }
|
||||
const SubloadCallback* getSubloadCallback() const { return _subloadCallback.get(); }
|
||||
|
||||
/** On first apply (unless already compiled), create the minmapped
|
||||
* texture and bind it, subsequent apply will simple bind to texture.*/
|
||||
/** On first apply (unless already compiled), create and bind the
|
||||
* texture, subsequent apply will simple bind to texture.*/
|
||||
virtual void apply(State& state) const;
|
||||
|
||||
protected :
|
||||
@ -94,7 +94,9 @@ class SG_EXPORT TextureRectangle : public Texture
|
||||
|
||||
virtual void computeInternalFormat() const;
|
||||
|
||||
void applyTexImageRectangle(GLenum target, Image* image, State& state, GLsizei& inwidth, GLsizei& inheight) const;
|
||||
void applyTexParameters(GLenum target, State& state) const;
|
||||
|
||||
void applyTexImage(GLenum target, Image* image, State& state, GLsizei& inwidth, GLsizei& inheight) const;
|
||||
|
||||
// not ideal that _image is mutable, but its required since
|
||||
// Image::ensureDimensionsArePowerOfTwo() can only be called
|
||||
|
@ -15,6 +15,7 @@
|
||||
#define OSG_TRIANGLEFUNCTOR 1
|
||||
|
||||
#include <osg/Drawable>
|
||||
#include <osg/Notify>
|
||||
|
||||
namespace osg {
|
||||
|
||||
@ -32,12 +33,23 @@ public:
|
||||
|
||||
virtual ~TriangleFunctor() {}
|
||||
|
||||
virtual void setVertexArray(unsigned int count,const Vec2* vertices)
|
||||
{
|
||||
notify(WARN)<<"Triangle Functor does not support Vec2* vertex arrays"<<std::endl;
|
||||
}
|
||||
|
||||
virtual void setVertexArray(unsigned int count,const Vec3* vertices)
|
||||
{
|
||||
_vertexArraySize = count;
|
||||
_vertexArrayPtr = vertices;
|
||||
}
|
||||
|
||||
virtual void setVertexArray(unsigned int count,const Vec4* vertices)
|
||||
{
|
||||
notify(WARN)<<"Triangle Functor does not support Vec4* vertex arrays"<<std::endl;
|
||||
}
|
||||
|
||||
|
||||
virtual void drawArrays(GLenum mode,GLint first,GLsizei count)
|
||||
{
|
||||
if (_vertexArrayPtr==0 && count==0) return;
|
||||
@ -311,15 +323,19 @@ public:
|
||||
* non vertex array primitives to vertex array based primitives.
|
||||
* this is done to simplify the implementation of primtive functor
|
||||
* subclasses - users only need override drawArray and drawElements.*/
|
||||
inline void begin(GLenum mode)
|
||||
virtual void begin(GLenum mode)
|
||||
{
|
||||
_modeCache = mode;
|
||||
_vertexCache.clear();
|
||||
}
|
||||
|
||||
inline void vertex(const Vec3& vert) { _vertexCache.push_back(vert); }
|
||||
inline void vertex(float x,float y,float z) { _vertexCache.push_back(osg::Vec3(x,y,z)); }
|
||||
inline void end()
|
||||
virtual void vertex(const Vec2& vert) { _vertexCache.push_back(osg::Vec3(vert[0],vert[1],0.0f)); }
|
||||
virtual void vertex(const Vec3& vert) { _vertexCache.push_back(vert); }
|
||||
virtual void vertex(const Vec4& vert) { _vertexCache.push_back(osg::Vec3(vert[0],vert[1],vert[2])/vert[3]); }
|
||||
virtual void vertex(float x,float y) { _vertexCache.push_back(osg::Vec3(x,y,0.0f)); }
|
||||
virtual void vertex(float x,float y,float z) { _vertexCache.push_back(osg::Vec3(x,y,z)); }
|
||||
virtual void vertex(float x,float y,float z,float w) { _vertexCache.push_back(osg::Vec3(x,y,z)/w); }
|
||||
virtual void end()
|
||||
{
|
||||
if (!_vertexCache.empty())
|
||||
{
|
||||
|
@ -106,11 +106,11 @@ public:
|
||||
|
||||
virtual bool removeChild(GUIEventHandler *geh);
|
||||
|
||||
const int getNumChildren() const { return _children.size(); }
|
||||
unsigned int getNumChildren() const { return _children.size(); }
|
||||
|
||||
GUIEventHandler *getChild( int i) { return _children[i].get(); }
|
||||
GUIEventHandler *getChild( unsigned int i) { return _children[i].get(); }
|
||||
|
||||
const GUIEventHandler *getChild( int i ) const { return _children[i].get(); }
|
||||
const GUIEventHandler *getChild( unsigned int i ) const { return _children[i].get(); }
|
||||
|
||||
bool containsNode( const GUIEventHandler* node ) const
|
||||
{
|
||||
|
@ -52,7 +52,7 @@ class OSGPRODUCER_EXPORT OsgCameraGroup : public Producer::CameraGroup
|
||||
const osg::ApplicationUsage* getApplicationUsage() const { return _applicationUsage; }
|
||||
|
||||
|
||||
typedef std::vector < osg::ref_ptr<osgProducer::OsgSceneHandler> > SceneHandlerList;
|
||||
typedef std::vector < Producer::ref_ptr<osgProducer::OsgSceneHandler> > SceneHandlerList;
|
||||
|
||||
SceneHandlerList& getSceneHandlerList() { return _shvec;}
|
||||
|
||||
|
@ -22,12 +22,21 @@
|
||||
|
||||
namespace osgProducer {
|
||||
|
||||
class OSGPRODUCER_EXPORT OsgSceneHandler : public Producer::Camera::SceneHandler, public osgUtil::SceneView
|
||||
class OSGPRODUCER_EXPORT OsgSceneHandler : public Producer::Camera::SceneHandler
|
||||
{
|
||||
public :
|
||||
|
||||
OsgSceneHandler(osg::DisplaySettings *ds = NULL);
|
||||
|
||||
/// set the scene view to which will manage rendering of the OSG scene.
|
||||
void setSceneView(osgUtil::SceneView* sceneView) { _sceneView = sceneView; }
|
||||
|
||||
/// get the scene view.
|
||||
osgUtil::SceneView* getSceneView() { return _sceneView.get(); }
|
||||
|
||||
/// get the const scene view.
|
||||
const osgUtil::SceneView* getSceneView() const { return _sceneView.get(); }
|
||||
|
||||
/// override the init method to force it be run one at a time.
|
||||
virtual void init();
|
||||
|
||||
@ -85,6 +94,9 @@ class OSGPRODUCER_EXPORT OsgSceneHandler : public Producer::Camera::SceneHandler
|
||||
|
||||
virtual ~OsgSceneHandler() {}
|
||||
|
||||
|
||||
osg::ref_ptr<osgUtil::SceneView> _sceneView;
|
||||
|
||||
osg::ref_ptr<Callback> _clearCallback;
|
||||
osg::ref_ptr<Callback> _cullCallback;
|
||||
osg::ref_ptr<Callback> _drawCallback;
|
||||
|
@ -82,8 +82,19 @@ class OSGPRODUCER_EXPORT Viewer : public OsgCameraGroup, public osgGA::GUIAction
|
||||
|
||||
virtual bool realize();
|
||||
|
||||
/** Updated the scene. Handle any queued up events, do an update traversal and set the CameraGroup's setViewByMatrix if any camera manipulators are active.*/
|
||||
virtual void update();
|
||||
|
||||
/** set the update visitor which does the update traversal of the scene graph. Automatically called by the update() method.*/
|
||||
void setUpdateVistor(osg::NodeVisitor* nv) { _updateVisitor = nv; }
|
||||
|
||||
/** get the update visitor.*/
|
||||
osg::NodeVisitor* getUpdateVistor() { return _updateVisitor.get(); }
|
||||
|
||||
/** get the const update visitor.*/
|
||||
const osg::NodeVisitor* getUpdateVistor() const { return _updateVisitor.get(); }
|
||||
|
||||
|
||||
/** Dispatch the cull and draw for each of the Camera's for this frame.*/
|
||||
virtual void frame();
|
||||
|
||||
|
@ -45,6 +45,9 @@ class OSGSIM_EXPORT LightPointNode : public osg::Node
|
||||
virtual void traverse(osg::NodeVisitor& nv);
|
||||
|
||||
|
||||
unsigned int getNumLightPoints() const { return _lightPointList.size(); }
|
||||
|
||||
|
||||
unsigned int addLightPoint(const LightPoint& lp);
|
||||
|
||||
void removeLightPoint(unsigned int pos);
|
||||
|
@ -100,6 +100,18 @@ public:
|
||||
float getCharacterHeight() const { return _characterHeight; }
|
||||
float getCharacterAspectRatio() const { return _characterAspectRatio; }
|
||||
|
||||
enum CharacterSizeMode
|
||||
{
|
||||
OBJECT_COORDS, /// default
|
||||
SCREEN_COORDS, /// internally scale the characters to be constant screen size.
|
||||
OBJECT_COORDS_WITH_MAXIMUM_SCREEN_SIZE_CAPPED_BY_FONT_HEIGHT /// text that behavaves like OBJECT_COORDS sized text when a long distance way, but has its screen sized capped automatically when the viewer gets near.
|
||||
};
|
||||
|
||||
/** Set how the CharacterSize value relates to the final rendered character.*/
|
||||
void setCharacterSizeMode(CharacterSizeMode mode) { _characterSizeMode = mode; }
|
||||
|
||||
/** Get the CharacterSizeMode.*/
|
||||
CharacterSizeMode getCharacterSizeMode() const { return _characterSizeMode; }
|
||||
|
||||
|
||||
/** Set the maximum width of the text box.
|
||||
@ -165,27 +177,11 @@ public:
|
||||
void setAxisAlignment(AxisAlignment axis);
|
||||
|
||||
void setRotation(const osg::Quat& quat);
|
||||
void setRotation(unsigned int contextID, const osg::Quat& quat);
|
||||
const osg::Quat& getRotation(unsigned int contextID=0) const { return _rotation[contextID]; }
|
||||
|
||||
void setScale(float scale);
|
||||
void setScale(unsigned int contextID, float scale);
|
||||
float getScale(unsigned int contextID=0) const { return _scale[contextID]; }
|
||||
|
||||
void setScaleAndRotation(unsigned int contextID, float scale,const osg::Quat& quat);
|
||||
|
||||
void setAutoUpdateEyeMovementTolerance(float tolerance) { _autoUpdateEyeMovementTolerance = tolerance; }
|
||||
float getAutoUpdateEyeMovementTolerance() const { return _autoUpdateEyeMovementTolerance; }
|
||||
const osg::Quat& getRotation() const { return _rotation; }
|
||||
|
||||
void setAutoRotateToScreen(bool autoRotateToScreen);
|
||||
bool getAutoRotateToScreen() const { return _autoRotateToScreen; }
|
||||
|
||||
void setAutoScaleToLimitScreenSizeToFontResolution(bool autoScaleToScreen);
|
||||
bool getAutoScaleToLimitScreenSizeToFontResolution() const { return _autoScaleToLimitScreenSizeToFontResolution; }
|
||||
|
||||
|
||||
|
||||
|
||||
enum Layout
|
||||
{
|
||||
LEFT_TO_RIGHT, /// default
|
||||
@ -295,35 +291,49 @@ protected:
|
||||
unsigned int _fontHeight;
|
||||
float _characterHeight;
|
||||
float _characterAspectRatio;
|
||||
CharacterSizeMode _characterSizeMode;
|
||||
float _maximumWidth;
|
||||
float _maximumHeight;
|
||||
|
||||
String _text;
|
||||
osg::Vec3 _position;
|
||||
AlignmentType _alignment;
|
||||
mutable osg::buffered_object<osg::Quat> _rotation;
|
||||
mutable osg::buffered_value<float> _scale;
|
||||
float _autoUpdateEyeMovementTolerance;
|
||||
osg::Quat _rotation;
|
||||
bool _autoRotateToScreen;
|
||||
bool _autoScaleToLimitScreenSizeToFontResolution;
|
||||
Layout _layout;
|
||||
osg::Vec4 _color;
|
||||
unsigned int _drawMode;
|
||||
|
||||
// iternal map used for rendering. Set up by the computeGlyphRepresentation() method.
|
||||
TextureGlyphQuadMap _textureGlyphQuadMap;
|
||||
mutable TextureGlyphQuadMap _textureGlyphQuadMap;
|
||||
|
||||
void computeGlyphRepresentation();
|
||||
|
||||
// internal caches of the positioning of the text.
|
||||
mutable osg::buffered_object<osg::Matrix> _matrix;
|
||||
osg::Vec3 _offset;
|
||||
osg::Vec3 _normal;
|
||||
mutable osg::BoundingBox _textBB;
|
||||
|
||||
void setUpAutoCallback();
|
||||
struct AutoTransformCache
|
||||
{
|
||||
AutoTransformCache():
|
||||
_traversalNumber(-1),
|
||||
_width(0),
|
||||
_height(0) {}
|
||||
|
||||
int _traversalNumber;
|
||||
int _width;
|
||||
int _height;
|
||||
osg::Vec3 _transformedPosition;
|
||||
osg::Matrix _modelview;
|
||||
osg::Matrix _projection;
|
||||
osg::Matrix _matrix;
|
||||
};
|
||||
|
||||
mutable osg::buffered_object<AutoTransformCache> _autoTransformCache;
|
||||
mutable osg::Vec3 _offset;
|
||||
mutable osg::Vec3 _normal;
|
||||
mutable osg::BoundingBox _textBB;
|
||||
|
||||
void computePositions();
|
||||
void computePositions(unsigned int contextID);
|
||||
void computePositions(unsigned int contextID) const;
|
||||
|
||||
};
|
||||
|
||||
|
@ -217,8 +217,8 @@ class OSGUTIL_EXPORT CullVisitor : public osg::NodeVisitor, public osg::CullStac
|
||||
|
||||
protected:
|
||||
|
||||
/** prevent unwanted copy construction.*/
|
||||
CullVisitor(const CullVisitor&):osg::NodeVisitor(),osg::CullStack() {}
|
||||
// /** prevent unwanted copy construction.*/
|
||||
// CullVisitor(const CullVisitor&): osg::NodeVisitor(), osg::CullStack() {}
|
||||
|
||||
/** prevent unwanted copy operator.*/
|
||||
CullVisitor& operator = (const CullVisitor&) { return *this; }
|
||||
|
@ -163,13 +163,13 @@ class OSGUTIL_EXPORT SceneView : public osg::Referenced
|
||||
|
||||
|
||||
void setCullMask(const osg::Node::NodeMask nm) { _cullMask = nm; }
|
||||
const osg::Node::NodeMask getCullMask() const { return _cullMask; }
|
||||
osg::Node::NodeMask getCullMask() const { return _cullMask; }
|
||||
|
||||
void setCullMaskLeft(const osg::Node::NodeMask nm) { _cullMaskLeft = nm; }
|
||||
const osg::Node::NodeMask getCullMaskLeft() const { return _cullMaskLeft; }
|
||||
osg::Node::NodeMask getCullMaskLeft() const { return _cullMaskLeft; }
|
||||
|
||||
void setCullMaskRight(const osg::Node::NodeMask nm) { _cullMaskRight = nm; }
|
||||
const osg::Node::NodeMask getCullMaskRight() const { return _cullMaskRight; }
|
||||
osg::Node::NodeMask getCullMaskRight() const { return _cullMaskRight; }
|
||||
|
||||
/** Set the LOD bias for the CullVisitor to use.*/
|
||||
void setLODScale(float bias) { _LODScale = bias; }
|
||||
|
@ -62,8 +62,8 @@ class OSGUTIL_EXPORT UpdateVisitor : public osg::NodeVisitor
|
||||
|
||||
protected:
|
||||
|
||||
/** prevent unwanted copy construction.*/
|
||||
UpdateVisitor(const UpdateVisitor&):osg::NodeVisitor() {}
|
||||
// /** prevent unwanted copy construction.*/
|
||||
// UpdateVisitor(const UpdateVisitor&):osg::NodeVisitor() {}
|
||||
|
||||
/** prevent unwanted copy operator.*/
|
||||
UpdateVisitor& operator = (const UpdateVisitor&) { return *this; }
|
||||
|
@ -11,6 +11,7 @@
|
||||
* OpenSceneGraph Public License for more details.
|
||||
*/
|
||||
#include <osg/CullStack>
|
||||
#include <osg/Timer>
|
||||
|
||||
using namespace osg;
|
||||
|
||||
@ -200,25 +201,77 @@ void CullStack::pushModelViewMatrix(RefMatrix* matrix)
|
||||
|
||||
pushCullingSet();
|
||||
|
||||
//osg::Timer timer;
|
||||
|
||||
//osg::Timer_t tick_1 = timer.tick();
|
||||
|
||||
// fast method for computing the eye point in local coords which doesn't require the inverse matrix.
|
||||
const float x_0 = (*matrix)(0,0);
|
||||
const float x_1 = (*matrix)(1,0);
|
||||
const float x_2 = (*matrix)(2,0);
|
||||
const float x_scale = (*matrix)(3,0) / -(x_0*x_0+x_1*x_1+x_2*x_2);
|
||||
const float x_len2 = (x_0*x_0+x_1*x_1+x_2*x_2);
|
||||
|
||||
const float y_0 = (*matrix)(0,1);
|
||||
const float y_1 = (*matrix)(1,1);
|
||||
const float y_2 = (*matrix)(2,1);
|
||||
const float y_scale = (*matrix)(3,1) / -(y_0*y_0+y_1*y_1+y_2*y_2);
|
||||
const float y_len2 = (y_0*y_0+y_1*y_1+y_2*y_2);
|
||||
|
||||
|
||||
const float z_0 = (*matrix)(0,2);
|
||||
const float z_1 = (*matrix)(1,2);
|
||||
const float z_2 = (*matrix)(2,2);
|
||||
const float z_scale = (*matrix)(3,2) / -(z_0*z_0+z_1*z_1+z_2*z_2);
|
||||
const float z_len2 = (z_0*z_0+z_1*z_1+z_2*z_2);
|
||||
|
||||
_eyePointStack.push_back(osg::Vec3(x_0*x_scale + y_0*y_scale + z_0*z_scale,
|
||||
x_1*x_scale + y_1*y_scale + z_1*z_scale,
|
||||
x_2*x_scale + y_2*y_scale + z_2*z_scale));
|
||||
|
||||
bool useFastPath = (osg::equivalent(x_len2,y_len2) &&
|
||||
osg::equivalent(x_len2,z_len2) &&
|
||||
osg::equivalent(y_len2,z_len2));
|
||||
|
||||
// std::cout<<"x_len2 = "<<x_len2 << "\ty_len2 = "<<y_len2 << "\tz_len2 = "<<z_len2 << std::endl;
|
||||
|
||||
if (useFastPath)
|
||||
{
|
||||
const float xyz_len0 = x_0*x_0 + y_0*y_0 + z_0*z_0;
|
||||
const float xyz_len1 = x_1*x_1 + y_1*y_1 + z_1*z_1;
|
||||
const float xyz_len2 = x_2*x_2 + y_2*y_2 + z_2*z_2;
|
||||
|
||||
// std::cout<<"xyz_len0 = "<<xyz_len0 << "\txyz_len2 = "<<xyz_len1 << "\txyz_len2 = "<<xyz_len2 << std::endl;
|
||||
|
||||
if (!osg::equivalent(xyz_len0,xyz_len1) ||
|
||||
!osg::equivalent(xyz_len0,xyz_len2) ||
|
||||
!osg::equivalent(xyz_len1,xyz_len2)) useFastPath = false;
|
||||
|
||||
}
|
||||
|
||||
if (useFastPath)
|
||||
{
|
||||
// compute the eye point in local coords using a fast technique
|
||||
// which assumes that only proportional scaling, no shearing, this
|
||||
// is satisfied for most scene graph usage.
|
||||
|
||||
const float x_scale = (*matrix)(3,0) / -x_len2;
|
||||
const float y_scale = (*matrix)(3,1) / -y_len2;
|
||||
const float z_scale = (*matrix)(3,2) / -z_len2;
|
||||
|
||||
osg::Vec3 fast_eyepoint(x_0*x_scale + y_0*y_scale + z_0*z_scale,
|
||||
x_1*x_scale + y_1*y_scale + z_1*z_scale,
|
||||
x_2*x_scale + y_2*y_scale + z_2*z_scale);
|
||||
|
||||
_eyePointStack.push_back(fast_eyepoint);
|
||||
|
||||
// std::cout<<"fast path "<<*matrix<<std::endl;
|
||||
}
|
||||
else
|
||||
{
|
||||
// shearing or no proportional scaling has been detected so we
|
||||
// callback to compute the inverse of the model view matrix and
|
||||
// transforming the eye point into local coords. This is ten
|
||||
// to thirty times slower than the above fast path.
|
||||
osg::Vec3 slow_eyepoint(osg::Matrix::inverse(*matrix).getTrans());
|
||||
_eyePointStack.push_back(slow_eyepoint);
|
||||
|
||||
//std::cout<<"slow path "<<*matrix<<std::endl;
|
||||
}
|
||||
|
||||
|
||||
osg::Vec3 lookVector = getLookVectorLocal();
|
||||
|
@ -257,8 +257,18 @@ struct ComputeBound : public Drawable::PrimitiveFunctor
|
||||
{
|
||||
ComputeBound():_vertices(0) {}
|
||||
|
||||
virtual void setVertexArray(unsigned int count,const Vec2* vertices)
|
||||
{
|
||||
notify(WARN)<<"ComputeBound does not support Vec2* vertex arrays"<<std::endl;
|
||||
}
|
||||
|
||||
virtual void setVertexArray(unsigned int,const Vec3* vertices) { _vertices = vertices; }
|
||||
|
||||
virtual void setVertexArray(unsigned int count,const Vec4* vertices)
|
||||
{
|
||||
notify(WARN)<<"ComputeBound does not support Vec4* vertex arrays"<<std::endl;
|
||||
}
|
||||
|
||||
virtual void drawArrays(GLenum,GLint first,GLsizei count)
|
||||
{
|
||||
if (_vertices)
|
||||
@ -305,8 +315,12 @@ struct ComputeBound : public Drawable::PrimitiveFunctor
|
||||
}
|
||||
|
||||
virtual void begin(GLenum) {}
|
||||
virtual void vertex(const Vec2& vert) { _bb.expandBy(osg::Vec3(vert[0],vert[1],0.0f)); }
|
||||
virtual void vertex(const Vec3& vert) { _bb.expandBy(vert); }
|
||||
virtual void vertex(const Vec4& vert) { if (vert[3]!=0.0f) _bb.expandBy(osg::Vec3(vert[0],vert[1],vert[2])/vert[3]); }
|
||||
virtual void vertex(float x,float y) { _bb.expandBy(x,y,1.0f); }
|
||||
virtual void vertex(float x,float y,float z) { _bb.expandBy(x,y,z); }
|
||||
virtual void vertex(float x,float y,float z,float w) { if (w!=0.0f) _bb.expandBy(x/w,y/w,z/w); }
|
||||
virtual void end() {}
|
||||
|
||||
const Vec3* _vertices;
|
||||
|
@ -83,6 +83,7 @@ CXXFILES =\
|
||||
Texture3D.cpp\
|
||||
TextureCubeMap.cpp\
|
||||
TextureRectangle.cpp\
|
||||
TransformAttributeFunctor.cpp\
|
||||
Timer.cpp\
|
||||
Transform.cpp\
|
||||
UnitTestFramework.cpp\
|
||||
|
@ -16,22 +16,26 @@
|
||||
|
||||
using namespace osg;
|
||||
|
||||
class DrawVertex
|
||||
class DrawVertex : public osg::ConstValueVisitor
|
||||
{
|
||||
public:
|
||||
|
||||
DrawVertex(const Vec3Array* vertices,const IndexArray* indices):
|
||||
DrawVertex(const Array* vertices,const IndexArray* indices):
|
||||
_vertices(vertices),
|
||||
_indices(indices) {}
|
||||
|
||||
void operator () (unsigned int pos)
|
||||
{
|
||||
if (_indices) glVertex3fv((*_vertices)[_indices->index(pos)].ptr());
|
||||
else glVertex3fv((*_vertices)[pos].ptr());
|
||||
if (_indices) _vertices->accept(_indices->index(pos),*this);
|
||||
else _vertices->accept(pos,*this);
|
||||
}
|
||||
|
||||
const Vec3Array* _vertices;
|
||||
const IndexArray* _indices;
|
||||
virtual void apply(const Vec2& v) { glVertex2fv(v.ptr()); }
|
||||
virtual void apply(const Vec3& v) { glVertex3fv(v.ptr()); }
|
||||
virtual void apply(const Vec4& v) { glVertex4fv(v.ptr()); }
|
||||
|
||||
const Array* _vertices;
|
||||
const IndexArray* _indices;
|
||||
};
|
||||
|
||||
class DrawNormal
|
||||
@ -813,7 +817,7 @@ void Geometry::drawImplementation(State& state) const
|
||||
//
|
||||
|
||||
if( _vertexArray.valid() )
|
||||
state.setVertexPointer(3,GL_FLOAT,0,_vertexArray->getDataPointer());
|
||||
state.setVertexPointer(_vertexArray->getDataSize(),_vertexArray->getDataType(),0,_vertexArray->getDataPointer());
|
||||
else
|
||||
state.disableVertexPointer();
|
||||
|
||||
@ -1547,12 +1551,25 @@ void Geometry::accept(ConstAttributeFunctor& af) const
|
||||
|
||||
void Geometry::accept(PrimitiveFunctor& functor) const
|
||||
{
|
||||
if (!_vertexArray.valid() || _vertexArray->empty()) return;
|
||||
|
||||
if (!_vertexArray.valid() || _vertexArray->getNumElements()==0) return;
|
||||
|
||||
if (!_vertexIndices.valid())
|
||||
{
|
||||
functor.setVertexArray(_vertexArray->size(),&(_vertexArray->front()));
|
||||
switch(_vertexArray->getType())
|
||||
{
|
||||
case(Array::Vec2ArrayType):
|
||||
functor.setVertexArray(_vertexArray->getNumElements(),static_cast<const Vec2*>(_vertexArray->getDataPointer()));
|
||||
break;
|
||||
case(Array::Vec3ArrayType):
|
||||
functor.setVertexArray(_vertexArray->getNumElements(),static_cast<const Vec3*>(_vertexArray->getDataPointer()));
|
||||
break;
|
||||
case(Array::Vec4ArrayType):
|
||||
functor.setVertexArray(_vertexArray->getNumElements(),static_cast<const Vec4*>(_vertexArray->getDataPointer()));
|
||||
break;
|
||||
default:
|
||||
notify(WARN)<<"Warning: Geometry::accept(PrimtiveFunctor&) cannot handle Vertex Array type"<<_vertexArray->getType()<<std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
for(PrimitiveSetList::const_iterator itr=_primitives.begin();
|
||||
itr!=_primitives.end();
|
||||
@ -1563,6 +1580,27 @@ void Geometry::accept(PrimitiveFunctor& functor) const
|
||||
}
|
||||
else
|
||||
{
|
||||
const Vec2Array* vec2Array = 0;
|
||||
const Vec3Array* vec3Array = 0;
|
||||
const Vec4Array* vec4Array = 0;
|
||||
Array::Type type = _vertexArray->getType();
|
||||
switch(type)
|
||||
{
|
||||
case(Array::Vec2ArrayType):
|
||||
vec2Array = static_cast<const Vec2Array*>(_vertexArray.get());
|
||||
break;
|
||||
case(Array::Vec3ArrayType):
|
||||
vec3Array = static_cast<const Vec3Array*>(_vertexArray.get());
|
||||
break;
|
||||
case(Array::Vec4ArrayType):
|
||||
vec4Array = static_cast<const Vec4Array*>(_vertexArray.get());
|
||||
break;
|
||||
default:
|
||||
notify(WARN)<<"Warning: Geometry::accept(PrimtiveFunctor&) cannot handle Vertex Array type"<<_vertexArray->getType()<<std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
for(PrimitiveSetList::const_iterator itr=_primitives.begin();
|
||||
itr!=_primitives.end();
|
||||
++itr)
|
||||
@ -1581,7 +1619,21 @@ void Geometry::accept(PrimitiveFunctor& functor) const
|
||||
vindex<indexEnd;
|
||||
++vindex)
|
||||
{
|
||||
functor.vertex((*_vertexArray)[_vertexIndices->index(vindex)]);
|
||||
switch(type)
|
||||
{
|
||||
case(Array::Vec2ArrayType):
|
||||
functor.vertex((*vec2Array)[_vertexIndices->index(vindex)]);
|
||||
break;
|
||||
case(Array::Vec3ArrayType):
|
||||
functor.vertex((*vec3Array)[_vertexIndices->index(vindex)]);
|
||||
break;
|
||||
case(Array::Vec4ArrayType):
|
||||
functor.vertex((*vec4Array)[_vertexIndices->index(vindex)]);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
functor.end();
|
||||
@ -1601,7 +1653,20 @@ void Geometry::accept(PrimitiveFunctor& functor) const
|
||||
|
||||
for(GLsizei primCount=0;primCount<*primItr;++primCount)
|
||||
{
|
||||
functor.vertex((*_vertexArray)[_vertexIndices->index(vindex)]);
|
||||
switch(type)
|
||||
{
|
||||
case(Array::Vec2ArrayType):
|
||||
functor.vertex((*vec2Array)[_vertexIndices->index(vindex)]);
|
||||
break;
|
||||
case(Array::Vec3ArrayType):
|
||||
functor.vertex((*vec3Array)[_vertexIndices->index(vindex)]);
|
||||
break;
|
||||
case(Array::Vec4ArrayType):
|
||||
functor.vertex((*vec4Array)[_vertexIndices->index(vindex)]);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
++vindex;
|
||||
}
|
||||
|
||||
@ -1621,7 +1686,20 @@ void Geometry::accept(PrimitiveFunctor& functor) const
|
||||
++primCount,++primItr)
|
||||
{
|
||||
unsigned int vindex=*primItr;
|
||||
functor.vertex((*_vertexArray)[_vertexIndices->index(vindex)]);
|
||||
switch(type)
|
||||
{
|
||||
case(Array::Vec2ArrayType):
|
||||
functor.vertex((*vec2Array)[_vertexIndices->index(vindex)]);
|
||||
break;
|
||||
case(Array::Vec3ArrayType):
|
||||
functor.vertex((*vec3Array)[_vertexIndices->index(vindex)]);
|
||||
break;
|
||||
case(Array::Vec4ArrayType):
|
||||
functor.vertex((*vec4Array)[_vertexIndices->index(vindex)]);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
functor.end();
|
||||
@ -1637,7 +1715,20 @@ void Geometry::accept(PrimitiveFunctor& functor) const
|
||||
++primItr)
|
||||
{
|
||||
unsigned int vindex=*primItr;
|
||||
functor.vertex((*_vertexArray)[_vertexIndices->index(vindex)]);
|
||||
switch(type)
|
||||
{
|
||||
case(Array::Vec2ArrayType):
|
||||
functor.vertex((*vec2Array)[_vertexIndices->index(vindex)]);
|
||||
break;
|
||||
case(Array::Vec3ArrayType):
|
||||
functor.vertex((*vec3Array)[_vertexIndices->index(vindex)]);
|
||||
break;
|
||||
case(Array::Vec4ArrayType):
|
||||
functor.vertex((*vec4Array)[_vertexIndices->index(vindex)]);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
functor.end();
|
||||
@ -1653,7 +1744,20 @@ void Geometry::accept(PrimitiveFunctor& functor) const
|
||||
++primItr)
|
||||
{
|
||||
unsigned int vindex=*primItr;
|
||||
functor.vertex((*_vertexArray)[_vertexIndices->index(vindex)]);
|
||||
switch(type)
|
||||
{
|
||||
case(Array::Vec2ArrayType):
|
||||
functor.vertex((*vec2Array)[_vertexIndices->index(vindex)]);
|
||||
break;
|
||||
case(Array::Vec3ArrayType):
|
||||
functor.vertex((*vec3Array)[_vertexIndices->index(vindex)]);
|
||||
break;
|
||||
case(Array::Vec4ArrayType):
|
||||
functor.vertex((*vec4Array)[_vertexIndices->index(vindex)]);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
functor.end();
|
||||
@ -1742,7 +1846,7 @@ void Geometry::computeCorrectBindingsAndArraySizes()
|
||||
{
|
||||
if (verifyBindings()) return;
|
||||
|
||||
if (!_vertexArray.valid() || _vertexArray->empty())
|
||||
if (!_vertexArray.valid() || _vertexArray->getNumElements()==0)
|
||||
{
|
||||
// no vertex array so switch everything off.
|
||||
|
||||
|
@ -142,6 +142,7 @@ unsigned int Image::computeNumComponents(GLenum format)
|
||||
switch(format)
|
||||
{
|
||||
case(GL_COMPRESSED_RGB_S3TC_DXT1_EXT): return 3;
|
||||
case(GL_COMPRESSED_RGBA_S3TC_DXT1_EXT): return 4;
|
||||
case(GL_COMPRESSED_RGBA_S3TC_DXT3_EXT): return 4;
|
||||
case(GL_COMPRESSED_RGBA_S3TC_DXT5_EXT): return 4;
|
||||
case(GL_COLOR_INDEX): return 1;
|
||||
@ -157,7 +158,11 @@ unsigned int Image::computeNumComponents(GLenum format)
|
||||
case(GL_BGRA): return 4;
|
||||
case(GL_LUMINANCE): return 1;
|
||||
case(GL_LUMINANCE_ALPHA): return 2;
|
||||
default: return 0;
|
||||
default:
|
||||
{
|
||||
std::cout<<"error format = "<<std::hex<<format<<std::endl;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -168,6 +173,8 @@ unsigned int Image::computePixelSizeInBits(GLenum format,GLenum type)
|
||||
{
|
||||
case(GL_COMPRESSED_RGB_S3TC_DXT1_EXT): return 4;
|
||||
|
||||
case(GL_COMPRESSED_RGBA_S3TC_DXT1_EXT): return 4;
|
||||
|
||||
case(GL_COMPRESSED_RGBA_S3TC_DXT3_EXT): return 8;
|
||||
|
||||
case(GL_COMPRESSED_RGBA_S3TC_DXT5_EXT): return 8;
|
||||
@ -199,7 +206,11 @@ unsigned int Image::computePixelSizeInBits(GLenum format,GLenum type)
|
||||
case(GL_UNSIGNED_INT_8_8_8_8_REV):
|
||||
case(GL_UNSIGNED_INT_10_10_10_2):
|
||||
case(GL_UNSIGNED_INT_2_10_10_10_REV): return 32;
|
||||
default: return 0;
|
||||
default:
|
||||
{
|
||||
std::cout<<"error type = "<<type<<std::endl;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -209,6 +220,7 @@ unsigned int Image::computeRowWidthInBytes(int width,GLenum format,GLenum type,i
|
||||
unsigned int pixelSize = computePixelSizeInBits(format,type);
|
||||
int widthInBits = width*pixelSize;
|
||||
int packingInBits = packing*8;
|
||||
std::cout << "width="<<width<<" pixelSize="<<pixelSize<<" width in bit="<<widthInBits<<" packingInBits="<<packingInBits<<" widthInBits%packingInBits="<<widthInBits%packingInBits<<std::endl;
|
||||
return (widthInBits/packingInBits + ((widthInBits%packingInBits)?1:0))*packing;
|
||||
}
|
||||
|
||||
@ -227,6 +239,40 @@ int Image::computeNearestPowerOfTwo(int s,float bias)
|
||||
return s;
|
||||
}
|
||||
|
||||
unsigned int Image::getTotalSizeInBytesIncludingMipmaps() const
|
||||
{
|
||||
if (_mipmapData.empty())
|
||||
{
|
||||
// no mips so just return size of main image
|
||||
return getTotalSizeInBytes();
|
||||
}
|
||||
|
||||
int s = _s;
|
||||
int t = _t;
|
||||
int r = _r;
|
||||
|
||||
unsigned int maxValue = 0;
|
||||
for(unsigned int i=0;i<_mipmapData.size() && _mipmapData[i];++i)
|
||||
{
|
||||
s >>= 1;
|
||||
t >>= 1;
|
||||
r >>= 1;
|
||||
maxValue = maximum(maxValue,_mipmapData[i]);
|
||||
}
|
||||
|
||||
if (s==0) s=1;
|
||||
if (t==0) t=1;
|
||||
if (r==0) r=1;
|
||||
|
||||
unsigned int sizeOfLastMipMap = computeRowWidthInBytes(s,_pixelFormat,_dataType,_packing)*
|
||||
r*t;
|
||||
|
||||
// std::cout<<"sizeOfLastMipMap="<<sizeOfLastMipMap<<"\ts="<<s<<"\tt="<<t<<"\tr"<<r<<std::endl;
|
||||
|
||||
return maxValue+sizeOfLastMipMap;
|
||||
}
|
||||
|
||||
|
||||
void Image::setInternalTextureFormat(GLint internalFormat)
|
||||
{
|
||||
// won't do any sanity checking right now, leave it to
|
||||
|
@ -53,17 +53,17 @@ void Material::setAmbient(Face face, const Vec4& ambient )
|
||||
case(FRONT):
|
||||
_ambientFrontAndBack = false;
|
||||
_ambientFront = ambient;
|
||||
clampArray4BetweenRange(_ambientFront,0.0f,1.0f,"osg::Material::setAmbient(..)");
|
||||
//clampArray4BetweenRange(_ambientFront,0.0f,1.0f,"osg::Material::setAmbient(..)");
|
||||
break;
|
||||
case(BACK):
|
||||
_ambientFrontAndBack = false;
|
||||
_ambientBack = ambient;
|
||||
clampArray4BetweenRange(_ambientBack,0.0f,1.0f,"Material::setAmbient(..)");
|
||||
//clampArray4BetweenRange(_ambientBack,0.0f,1.0f,"Material::setAmbient(..)");
|
||||
break;
|
||||
case(FRONT_AND_BACK):
|
||||
_ambientFrontAndBack = true;
|
||||
_ambientFront = ambient;
|
||||
clampArray4BetweenRange(_ambientFront,0.0f,1.0f,"Material::setAmbient(..)");
|
||||
//clampArray4BetweenRange(_ambientFront,0.0f,1.0f,"Material::setAmbient(..)");
|
||||
_ambientBack = _ambientFront;
|
||||
break;
|
||||
default:
|
||||
@ -100,17 +100,17 @@ void Material::setDiffuse(Face face, const Vec4& diffuse )
|
||||
case(FRONT):
|
||||
_diffuseFrontAndBack = false;
|
||||
_diffuseFront = diffuse;
|
||||
clampArray4BetweenRange(_diffuseFront,0.0f,1.0f,"Material::setDiffuse(..)");
|
||||
//clampArray4BetweenRange(_diffuseFront,0.0f,1.0f,"Material::setDiffuse(..)");
|
||||
break;
|
||||
case(BACK):
|
||||
_diffuseFrontAndBack = false;
|
||||
_diffuseBack = diffuse;
|
||||
clampArray4BetweenRange(_diffuseBack,0.0f,1.0f,"Material::setDiffuse(..)");
|
||||
//clampArray4BetweenRange(_diffuseBack,0.0f,1.0f,"Material::setDiffuse(..)");
|
||||
break;
|
||||
case(FRONT_AND_BACK):
|
||||
_diffuseFrontAndBack = true;
|
||||
_diffuseFront = diffuse;
|
||||
clampArray4BetweenRange(_diffuseFront,0.0f,1.0f,"Material::setDiffuse(..)");
|
||||
//clampArray4BetweenRange(_diffuseFront,0.0f,1.0f,"Material::setDiffuse(..)");
|
||||
_diffuseBack = _diffuseFront;
|
||||
break;
|
||||
default:
|
||||
@ -148,17 +148,17 @@ void Material::setSpecular(Face face, const Vec4& specular )
|
||||
case(FRONT):
|
||||
_specularFrontAndBack = false;
|
||||
_specularFront = specular;
|
||||
clampArray4BetweenRange(_specularFront,0.0f,1.0f,"Material::setSpecular(..)");
|
||||
//clampArray4BetweenRange(_specularFront,0.0f,1.0f,"Material::setSpecular(..)");
|
||||
break;
|
||||
case(BACK):
|
||||
_specularFrontAndBack = false;
|
||||
_specularBack = specular;
|
||||
clampArray4BetweenRange(_specularBack,0.0f,1.0f,"Material::setSpecular(..)");
|
||||
//clampArray4BetweenRange(_specularBack,0.0f,1.0f,"Material::setSpecular(..)");
|
||||
break;
|
||||
case(FRONT_AND_BACK):
|
||||
_specularFrontAndBack = true;
|
||||
_specularFront = specular;
|
||||
clampArray4BetweenRange(_specularFront,0.0f,1.0f,"Material::setSpecular(..)");
|
||||
//clampArray4BetweenRange(_specularFront,0.0f,1.0f,"Material::setSpecular(..)");
|
||||
_specularBack = _specularFront;
|
||||
break;
|
||||
default:
|
||||
@ -196,17 +196,17 @@ void Material::setEmission(Face face, const Vec4& emission )
|
||||
case(FRONT):
|
||||
_emissionFrontAndBack = false;
|
||||
_emissionFront = emission;
|
||||
clampArray4BetweenRange(_emissionFront,0.0f,1.0f,"Material::setEmission(..)");
|
||||
//clampArray4BetweenRange(_emissionFront,0.0f,1.0f,"Material::setEmission(..)");
|
||||
break;
|
||||
case(BACK):
|
||||
_emissionFrontAndBack = false;
|
||||
_emissionBack = emission;
|
||||
clampArray4BetweenRange(_emissionBack,0.0f,1.0f,"Material::setEmission(..)");
|
||||
//clampArray4BetweenRange(_emissionBack,0.0f,1.0f,"Material::setEmission(..)");
|
||||
break;
|
||||
case(FRONT_AND_BACK):
|
||||
_emissionFrontAndBack = true;
|
||||
_emissionFront = emission;
|
||||
clampArray4BetweenRange(_emissionFront,0.0f,1.0f,"Material::setEmission(..)");
|
||||
//clampArray4BetweenRange(_emissionFront,0.0f,1.0f,"Material::setEmission(..)");
|
||||
_emissionBack = _emissionFront;
|
||||
break;
|
||||
default:
|
||||
@ -285,7 +285,7 @@ float Material::getShininess(Face face) const
|
||||
|
||||
void Material::setTransparency(Face face,float transparency)
|
||||
{
|
||||
clampBetweenRange(transparency,0.0f,1.0f,"Material::setTransparency()");
|
||||
//clampBetweenRange(transparency,0.0f,1.0f,"Material::setTransparency()");
|
||||
|
||||
if (face==FRONT || face==FRONT_AND_BACK)
|
||||
{
|
||||
|
@ -16,7 +16,8 @@
|
||||
|
||||
using namespace osg;
|
||||
|
||||
NodeVisitor::NodeVisitor(TraversalMode tm)
|
||||
NodeVisitor::NodeVisitor(TraversalMode tm):
|
||||
Referenced()
|
||||
{
|
||||
_visitorType = NODE_VISITOR;
|
||||
_traversalNumber = -1;
|
||||
@ -26,7 +27,8 @@ NodeVisitor::NodeVisitor(TraversalMode tm)
|
||||
_nodeMaskOverride = 0x0;
|
||||
}
|
||||
|
||||
NodeVisitor::NodeVisitor(VisitorType type,TraversalMode tm)
|
||||
NodeVisitor::NodeVisitor(VisitorType type,TraversalMode tm):
|
||||
Referenced()
|
||||
{
|
||||
_visitorType = type;
|
||||
_traversalNumber = -1;
|
||||
|
@ -55,7 +55,10 @@ Point::Point()
|
||||
_size = 1.0f; // TODO find proper default
|
||||
_fadeThresholdSize = 1.0f; // TODO find proper default
|
||||
// TODO find proper default
|
||||
_distanceAttenuation = Vec3(0.0f, 1.0f/5.f, 0.0f);
|
||||
_distanceAttenuation = Vec3(1, 0.0, 0.0);
|
||||
|
||||
_minSize = 0.0;
|
||||
_maxSize = 100.0;//depends on mulitsampling ... some default necessary
|
||||
}
|
||||
|
||||
|
||||
@ -99,6 +102,15 @@ void Point::setDistanceAttenuation(const Vec3& distanceAttenuation)
|
||||
_distanceAttenuation = distanceAttenuation;
|
||||
}
|
||||
|
||||
void Point::setMinSize(float minSize)
|
||||
{
|
||||
_minSize = minSize;
|
||||
}
|
||||
|
||||
void Point::setMaxSize(float maxSize)
|
||||
{
|
||||
_maxSize = maxSize;
|
||||
}
|
||||
|
||||
void Point::apply(State&) const
|
||||
{
|
||||
@ -112,8 +124,14 @@ void Point::apply(State&) const
|
||||
init_GL_EXT();
|
||||
}
|
||||
|
||||
if (s_PointParameterfvEXT) s_PointParameterfvEXT(GL_DISTANCE_ATTENUATION_EXT, (const GLfloat*)&_distanceAttenuation);
|
||||
if (s_PointParameterfEXT) s_PointParameterfEXT(GL_POINT_FADE_THRESHOLD_SIZE_EXT, _fadeThresholdSize);
|
||||
|
||||
if (s_PointParameterfvEXT) s_PointParameterfvEXT(GL_DISTANCE_ATTENUATION_EXT, (const GLfloat*)&_distanceAttenuation);
|
||||
|
||||
if (s_PointParameterfEXT)
|
||||
{
|
||||
s_PointParameterfEXT(GL_POINT_FADE_THRESHOLD_SIZE_EXT, _fadeThresholdSize);
|
||||
s_PointParameterfEXT(GL_POINT_SIZE_MIN_EXT, _minSize);
|
||||
s_PointParameterfEXT(GL_POINT_SIZE_MAX_EXT, _maxSize);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -16,6 +16,7 @@
|
||||
#include <osg/GLExtensions>
|
||||
|
||||
|
||||
using namespace std;
|
||||
using namespace osg;
|
||||
|
||||
State::State()
|
||||
@ -726,7 +727,7 @@ bool State::checkGLErrors(StateAttribute::GLMode mode) const
|
||||
GLenum errorNo = glGetError();
|
||||
if (errorNo!=GL_NO_ERROR)
|
||||
{
|
||||
osg::notify(WARN)<<"Warning: detected OpenGL error '"<<gluErrorString(errorNo)<<"' after applying GLMode "<<mode<< std::endl;
|
||||
osg::notify(WARN)<<"Warning: detected OpenGL error '"<<gluErrorString(errorNo)<<"' after applying GLMode 0x"<<hex<<mode<<dec<< std::endl;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -49,14 +49,18 @@ void TexEnvCombine::apply(State&) const
|
||||
static bool s_isTexEnvCrossbarSupported =
|
||||
isGLExtensionSupported("GL_ARB_texture_env_crossbar");
|
||||
|
||||
static bool s_isNVTexEnvCrossbarSupported =
|
||||
isGLExtensionSupported("GL_NV_texture_env_combine4");
|
||||
|
||||
static bool s_isTexEnvDot3Supported =
|
||||
isGLExtensionSupported("GL_ARB_texture_env_dot3");
|
||||
|
||||
|
||||
bool needsTexEnvDot3 = (_combine_RGB==DOT3_RGB) ||
|
||||
(_combine_RGB==DOT3_RGBA);
|
||||
|
||||
bool supported = s_isTexEnvCombineSupported;
|
||||
if (_needsTexEnvCrossbar && !s_isTexEnvCrossbarSupported) supported = false;
|
||||
if (_needsTexEnvCrossbar && !(s_isTexEnvCrossbarSupported || s_isNVTexEnvCrossbarSupported)) supported = false;
|
||||
if (needsTexEnvDot3 && !s_isTexEnvDot3Supported) supported = false;
|
||||
|
||||
if (supported)
|
||||
|
@ -23,6 +23,11 @@ TextureRectangle::TextureRectangle():
|
||||
_textureWidth(0),
|
||||
_textureHeight(0)
|
||||
{
|
||||
setWrap(WRAP_S, CLAMP);
|
||||
setWrap(WRAP_T, CLAMP);
|
||||
|
||||
setFilter(MIN_FILTER, LINEAR);
|
||||
setFilter(MAG_FILTER, LINEAR);
|
||||
}
|
||||
|
||||
TextureRectangle::TextureRectangle(const TextureRectangle& text,const CopyOp& copyop):
|
||||
@ -132,7 +137,7 @@ void TextureRectangle::apply(State& state) const
|
||||
|
||||
applyTexParameters(GL_TEXTURE_RECTANGLE_NV, state);
|
||||
|
||||
applyTexImageRectangle(GL_TEXTURE_RECTANGLE_NV, _image.get(), state, _textureWidth, _textureHeight);
|
||||
applyTexImage(GL_TEXTURE_RECTANGLE_NV, _image.get(), state, _textureWidth, _textureHeight);
|
||||
|
||||
// in theory the following line is redundant, but in practice
|
||||
// have found that the first frame drawn doesn't apply the textures
|
||||
@ -146,7 +151,22 @@ void TextureRectangle::apply(State& state) const
|
||||
}
|
||||
}
|
||||
|
||||
void TextureRectangle::applyTexImageRectangle(GLenum target, Image* image, State& state, GLsizei& inwidth, GLsizei& inheight) const
|
||||
void TextureRectangle::applyTexParameters(GLenum target, State& state) const
|
||||
{
|
||||
// get the contextID (user defined ID of 0 upwards) for the
|
||||
// current OpenGL context.
|
||||
const unsigned int contextID = state.getContextID();
|
||||
|
||||
glTexParameteri( target, GL_TEXTURE_WRAP_S, _wrap_s );
|
||||
glTexParameteri( target, GL_TEXTURE_WRAP_T, _wrap_t );
|
||||
|
||||
glTexParameteri( target, GL_TEXTURE_MIN_FILTER, _min_filter);
|
||||
glTexParameteri( target, GL_TEXTURE_MAG_FILTER, _mag_filter);
|
||||
|
||||
getTextureParameterDirty(contextID) = false;
|
||||
}
|
||||
|
||||
void TextureRectangle::applyTexImage(GLenum target, Image* image, State& state, GLsizei& inwidth, GLsizei& inheight) const
|
||||
{
|
||||
// if we don't have a valid image we can't create a texture!
|
||||
if (!image || !image->data())
|
||||
|
@ -51,7 +51,8 @@ Registry* Registry::instance()
|
||||
// definition of the Registry
|
||||
Registry::Registry()
|
||||
{
|
||||
notify(INFO) << "Constructing osg::Registry"<<std::endl;
|
||||
// comment out because it was causing problems under OSX - causing it to crash osgconv when constucting ostream in osg::notify().
|
||||
// notify(INFO) << "Constructing osg::Registry"<<std::endl;
|
||||
|
||||
_createNodeFromImage = true;
|
||||
_openingLibrary = false;
|
||||
@ -126,16 +127,16 @@ void Registry::initDataFilePathList()
|
||||
char *ptr;
|
||||
if( (ptr = getenv( "OSG_FILE_PATH" )) )
|
||||
{
|
||||
notify(DEBUG_INFO) << "OSG_FILE_PATH("<<ptr<<")"<<std::endl;
|
||||
//notify(DEBUG_INFO) << "OSG_FILE_PATH("<<ptr<<")"<<std::endl;
|
||||
setDataFilePathList(ptr);
|
||||
}
|
||||
else if( (ptr = getenv( "OSGFILEPATH" )) )
|
||||
{
|
||||
notify(DEBUG_INFO) << "OSGFILEPATH("<<ptr<<")"<<std::endl;
|
||||
//notify(DEBUG_INFO) << "OSGFILEPATH("<<ptr<<")"<<std::endl;
|
||||
setDataFilePathList(ptr);
|
||||
}
|
||||
|
||||
osg::notify(INFO)<<"Data FilePathList"<<std::endl;
|
||||
//osg::notify(INFO)<<"Data FilePathList"<<std::endl;
|
||||
PrintFilePathList(osg::notify(INFO),getDataFilePathList());
|
||||
}
|
||||
|
||||
@ -153,12 +154,12 @@ void Registry::initLibraryFilePathList()
|
||||
char* ptr;
|
||||
if( (ptr = getenv( "OSG_LIBRARY_PATH")) )
|
||||
{
|
||||
notify(DEBUG_INFO) << "OSG_LIBRARY_PATH("<<ptr<<")"<<std::endl;
|
||||
//notify(DEBUG_INFO) << "OSG_LIBRARY_PATH("<<ptr<<")"<<std::endl;
|
||||
setLibraryFilePathList(ptr);
|
||||
}
|
||||
else if( (ptr = getenv( "OSG_LD_LIBRARY_PATH")) )
|
||||
{
|
||||
notify(DEBUG_INFO) << "OSG_LD_LIBRARY_PATH("<<ptr<<")"<<std::endl;
|
||||
//notify(DEBUG_INFO) << "OSG_LD_LIBRARY_PATH("<<ptr<<")"<<std::endl;
|
||||
setLibraryFilePathList(ptr);
|
||||
}
|
||||
|
||||
@ -227,8 +228,8 @@ void Registry::initLibraryFilePathList()
|
||||
|
||||
#endif
|
||||
|
||||
osg::notify(INFO)<<"Library FilePathList"<<std::endl;
|
||||
PrintFilePathList(osg::notify(INFO),getLibraryFilePathList());
|
||||
//osg::notify(INFO)<<"Library FilePathList"<<std::endl;
|
||||
//PrintFilePathList(osg::notify(INFO),getLibraryFilePathList());
|
||||
|
||||
}
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
void osgGA::GUIEventHandlerVisitor::visit(osgGA::CompositeGUIEventHandler& cgeh)
|
||||
{
|
||||
for(int i=0; i<cgeh.getNumChildren(); i++){
|
||||
for(unsigned int i=0; i<cgeh.getNumChildren(); i++){
|
||||
cgeh.getChild(i)->accept(*this);
|
||||
}
|
||||
}
|
||||
|
@ -106,6 +106,7 @@ class ReaderWriter3DC : public osgDB::ReaderWriter
|
||||
//std::cout <<"]"<<std::endl;
|
||||
}
|
||||
|
||||
geometry->setUseDisplayList(false);
|
||||
geometry->setVertexArray(vertices);
|
||||
geometry->setNormalArray(normals);
|
||||
geometry->setNormalBinding(osg::Geometry::BIND_PER_VERTEX);
|
||||
|
@ -156,8 +156,11 @@ osg::Image* ReadDDSFile(const char *filename)
|
||||
fread(&ddsd, sizeof(ddsd), 1, fp);
|
||||
|
||||
// Read image data.
|
||||
unsigned int size = ddsd.dwMipMapCount > 1 ? ddsd.dwLinearSize * 2 : ddsd.dwLinearSize;
|
||||
unsigned char* imageData = new unsigned char [size];
|
||||
unsigned int size = ddsd.dwMipMapCount > 1 ? ddsd.dwLinearSize * (ddsd.ddpfPixelFormat.dwFourCC==FOURCC_DXT1 ? 2: 4) : ddsd.dwLinearSize;
|
||||
//###################unsigned int size = ddsd.dwMipMapCount > 1 ? ddsd.dwLinearSize * 2 : ddsd.dwLinearSize;
|
||||
|
||||
|
||||
unsigned char* imageData = new unsigned char [size];
|
||||
fread(imageData, 1, size, fp);
|
||||
// Close the file.
|
||||
fclose(fp);
|
||||
@ -206,7 +209,8 @@ osg::Image* ReadDDSFile(const char *filename)
|
||||
else
|
||||
{
|
||||
internalFormat = GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
|
||||
pixelFormat = GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
|
||||
//#######################pixelFormat = GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
|
||||
pixelFormat = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
|
||||
}
|
||||
break;
|
||||
case FOURCC_DXT3:
|
||||
|
@ -113,7 +113,7 @@ void DynGeoSet::addToGeometry(osg::Geometry* geom)
|
||||
{
|
||||
int indexBase = 0;
|
||||
|
||||
osg::Vec3Array* vertices = geom->getVertexArray();
|
||||
osg::Vec3Array* vertices = dynamic_cast<osg::Vec3Array*>(geom->getVertexArray());
|
||||
if (vertices)
|
||||
{
|
||||
indexBase = vertices->size();
|
||||
|
@ -1838,11 +1838,25 @@ void ConvertFromFLT::visitLightPoint(GeoSetBuilder* pBuilder, LightPointRecord*
|
||||
osg::Point* point = new osg::Point;
|
||||
if (point)
|
||||
{
|
||||
/*
|
||||
point->setSize(pSLightPoint->sfSize);
|
||||
stateSet->setAttributeAndModes( point, osg::StateAttribute::ON );
|
||||
// point->setFadeThresholdSize(const float fadeThresholdSize);
|
||||
// point->setDistanceAttenuation(const Vec3& distanceAttenuation);
|
||||
// point->setStateSetModes(*stateSet, osg::StateAttribute::ON); // GL_POINT_SMOOTH
|
||||
*/
|
||||
//change to:
|
||||
point->setSize(pSLightPoint->afActualPixelSize);
|
||||
point->setFadeThresholdSize(pSLightPoint->sfTranspFalloff);
|
||||
//numbers that are going to appear are "experimental"
|
||||
point->setDistanceAttenuation(osg::Vec3(0.0001, 0.0005, 0.00000025));
|
||||
|
||||
point->setMinSize(pSLightPoint->sfMinPixelSize);
|
||||
point->setMaxSize(pSLightPoint->sfMaxPixelSize);
|
||||
|
||||
stateSet->setAttributeAndModes( point, osg::StateAttribute::ON );
|
||||
stateSet->setMode(GL_POINT_SMOOTH, osg::StateAttribute::ON);
|
||||
stateSet->setAttributeAndModes(new osg::BlendFunc, osg::StateAttribute::ON);
|
||||
|
||||
}
|
||||
|
||||
|
@ -12,7 +12,7 @@
|
||||
*/
|
||||
|
||||
#include "FreeTypeFont.h"
|
||||
#include FT_GLYPH_H
|
||||
//#include FT_GLYPH_H
|
||||
|
||||
#include <osg/Notify>
|
||||
#include <osgDB/WriteFile>
|
||||
@ -140,7 +140,7 @@ osg::Vec2 FreeTypeFont::getKerning(unsigned int leftcharcode,unsigned int rightc
|
||||
FT_Error error = FT_Get_Kerning( _face, // handle to face object
|
||||
left, // left glyph index
|
||||
right, // right glyph index
|
||||
ft_kerning_default, // kerning mode
|
||||
FT_KERNING_UNFITTED, // kerning mode
|
||||
&kerning ); // target vector
|
||||
|
||||
if (error)
|
||||
|
@ -36,10 +36,15 @@ void AnimationPathCallback::write(DataOutputStream* out){
|
||||
out->writeDouble(_firstTime);
|
||||
out->writeDouble(_animationTime);
|
||||
// Write animationpath if any
|
||||
out->writeInt((int)getAnimationPath());
|
||||
if(getAnimationPath()){
|
||||
if(getAnimationPath())
|
||||
{
|
||||
out->writeInt(1); // true we have an animation path.
|
||||
((ive::AnimationPath*)(getAnimationPath()))->write(out);
|
||||
}
|
||||
else
|
||||
{
|
||||
out->writeInt(0); // false we don't have an animation path.
|
||||
}
|
||||
}
|
||||
|
||||
void AnimationPathCallback::read(DataInputStream* in){
|
||||
@ -61,7 +66,8 @@ void AnimationPathCallback::read(DataInputStream* in){
|
||||
_firstTime = in->readDouble();
|
||||
_animationTime = in->readDouble();
|
||||
// Read animationpath if any
|
||||
if(in->readInt()){
|
||||
if(in->readInt())
|
||||
{
|
||||
osg::AnimationPath* path = new osg::AnimationPath();
|
||||
((ive::AnimationPath*)(path))->read(in);
|
||||
setAnimationPath(path);
|
||||
|
@ -1,77 +1,113 @@
|
||||
/**********************************************************************
|
||||
*
|
||||
* FILE: DataInputStream.cpp
|
||||
* FILE: DataInputStream.cpp
|
||||
*
|
||||
* DESCRIPTION: Implements methods to read simpel datatypes from an
|
||||
* input stream.
|
||||
* DESCRIPTION: Implements methods to read simpel datatypes from an
|
||||
* input stream.
|
||||
*
|
||||
* CREATED BY: Rune Schmidt Jensen
|
||||
* CREATED BY: Rune Schmidt Jensen
|
||||
*
|
||||
* HISTORY: Created 11.03.2003
|
||||
* HISTORY: Created 11.03.2003
|
||||
*
|
||||
* Copyright 2003 VR-C
|
||||
* Copyright 2003 VR-C
|
||||
**********************************************************************/
|
||||
|
||||
#include "DataInputStream.h"
|
||||
#include "StateSet.h"
|
||||
#include "BlendFunc.h"
|
||||
#include "Material.h"
|
||||
#include "CullFace.h"
|
||||
#include "PolygonOffset.h"
|
||||
#include "ShadeModel.h"
|
||||
#include "Point.h"
|
||||
#include "Texture2D.h"
|
||||
#include "TextureCubeMap.h"
|
||||
#include "TexEnv.h"
|
||||
#include "TexEnvCombine.h"
|
||||
#include "TexGen.h"
|
||||
|
||||
#include "Group.h"
|
||||
#include "MatrixTransform.h"
|
||||
#include "Geode.h"
|
||||
#include "LightSource.h"
|
||||
#include "Billboard.h"
|
||||
#include "Sequence.h"
|
||||
#include "LOD.h"
|
||||
//#include "ViewPoint.h"
|
||||
#include "PositionAttitudeTransform.h"
|
||||
#include "Transform.h"
|
||||
#include "Switch.h"
|
||||
#include "OccluderNode.h"
|
||||
#include "Impostor.h"
|
||||
|
||||
#include "Geometry.h"
|
||||
|
||||
#include <osgDB/ReadFile>
|
||||
|
||||
using namespace ive;
|
||||
using namespace std;
|
||||
|
||||
DataInputStream::DataInputStream(std::istream* istream){
|
||||
_istream = istream;
|
||||
_peeking = false;
|
||||
_peekValue = 0;
|
||||
_istream = istream;
|
||||
_peeking = false;
|
||||
_peekValue = 0;
|
||||
|
||||
if(!istream){
|
||||
throw Exception("DataInputStream::DataInputStream(): null pointer exception in argument.");
|
||||
}
|
||||
if(!istream){
|
||||
throw Exception("DataInputStream::DataInputStream(): null pointer exception in argument.");
|
||||
}
|
||||
|
||||
_version = readInt();
|
||||
_version = readInt();
|
||||
|
||||
// Are we trying to open a binary .ive file which version are newer than this library.
|
||||
if(_version>VERSION){
|
||||
throw Exception("DataInputStream::DataInputStream(): The version found in the file is newer than this library can handle.");
|
||||
}
|
||||
// Are we trying to open a binary .ive file which version are newer than this library.
|
||||
if(_version>VERSION){
|
||||
throw Exception("DataInputStream::DataInputStream(): The version found in the file is newer than this library can handle.");
|
||||
}
|
||||
}
|
||||
|
||||
DataInputStream::~DataInputStream(){}
|
||||
|
||||
bool DataInputStream::readBool(){
|
||||
bool b;
|
||||
_istream->read((char*)&b, BOOLSIZE);
|
||||
if (_istream->rdstate() & _istream->failbit)
|
||||
throw Exception("DataInputStream::readBool(): Failed to read boolean value.");
|
||||
return b;
|
||||
bool b;
|
||||
_istream->read((char*)&b, BOOLSIZE);
|
||||
if (_istream->rdstate() & _istream->failbit)
|
||||
throw Exception("DataInputStream::readBool(): Failed to read boolean value.");
|
||||
return b;
|
||||
}
|
||||
|
||||
char DataInputStream::readChar(){
|
||||
char c;
|
||||
_istream->read(&c, CHARSIZE);
|
||||
if (_istream->rdstate() & _istream->failbit)
|
||||
throw Exception("DataInputStream::readChar(): Failed to read char value.");
|
||||
return c;
|
||||
char c;
|
||||
_istream->read(&c, CHARSIZE);
|
||||
if (_istream->rdstate() & _istream->failbit)
|
||||
throw Exception("DataInputStream::readChar(): Failed to read char value.");
|
||||
return c;
|
||||
}
|
||||
|
||||
unsigned short DataInputStream::readUShort(){
|
||||
unsigned short s;
|
||||
_istream->read((char*)&s, SHORTSIZE);
|
||||
if (_istream->rdstate() & _istream->failbit)
|
||||
throw Exception("DataInputStream::readUShort(): Failed to read unsigned short value.");
|
||||
return s;
|
||||
unsigned short s;
|
||||
_istream->read((char*)&s, SHORTSIZE);
|
||||
if (_istream->rdstate() & _istream->failbit)
|
||||
throw Exception("DataInputStream::readUShort(): Failed to read unsigned short value.");
|
||||
return s;
|
||||
}
|
||||
|
||||
unsigned int DataInputStream::readUInt(){
|
||||
unsigned int s;
|
||||
_istream->read((char*)&s, INTSIZE);
|
||||
if (_istream->rdstate() & _istream->failbit)
|
||||
throw Exception("DataInputStream::readUInt(): Failed to read unsigned int value.");
|
||||
return s;
|
||||
}
|
||||
|
||||
int DataInputStream::readInt(){
|
||||
if(_peeking){
|
||||
_peeking = false;
|
||||
return _peekValue;
|
||||
}
|
||||
int i;
|
||||
_istream->read((char*)&i, INTSIZE);
|
||||
if (_istream->rdstate() & _istream->failbit)
|
||||
throw Exception("DataInputStream::readInt(): Failed to read int value.");
|
||||
return i;
|
||||
if(_peeking){
|
||||
_peeking = false;
|
||||
return _peekValue;
|
||||
}
|
||||
int i;
|
||||
_istream->read((char*)&i, INTSIZE);
|
||||
if (_istream->rdstate() & _istream->failbit)
|
||||
throw Exception("DataInputStream::readInt(): Failed to read int value.");
|
||||
return i;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -80,247 +116,476 @@ int DataInputStream::readInt(){
|
||||
* return the same integer.
|
||||
*/
|
||||
int DataInputStream::peekInt(){
|
||||
if(_peeking){
|
||||
return _peekValue;
|
||||
}
|
||||
_peekValue = readInt();
|
||||
_peeking = true;
|
||||
return _peekValue;
|
||||
if(_peeking){
|
||||
return _peekValue;
|
||||
}
|
||||
_peekValue = readInt();
|
||||
_peeking = true;
|
||||
return _peekValue;
|
||||
}
|
||||
|
||||
float DataInputStream::readFloat(){
|
||||
float f;
|
||||
_istream->read((char*)&f, FLOATSIZE);
|
||||
if (_istream->rdstate() & _istream->failbit)
|
||||
throw Exception("DataInputStream::readFloat(): Failed to read float value.");
|
||||
return f;
|
||||
float f;
|
||||
_istream->read((char*)&f, FLOATSIZE);
|
||||
if (_istream->rdstate() & _istream->failbit)
|
||||
throw Exception("DataInputStream::readFloat(): Failed to read float value.");
|
||||
return f;
|
||||
}
|
||||
|
||||
long DataInputStream::readLong(){
|
||||
long l;
|
||||
_istream->read((char*)&l, LONGSIZE);
|
||||
if (_istream->rdstate() & _istream->failbit)
|
||||
throw Exception("DataInputStream::readLong(): Failed to read long value.");
|
||||
return l;
|
||||
long l;
|
||||
_istream->read((char*)&l, LONGSIZE);
|
||||
if (_istream->rdstate() & _istream->failbit)
|
||||
throw Exception("DataInputStream::readLong(): Failed to read long value.");
|
||||
return l;
|
||||
}
|
||||
|
||||
double DataInputStream::readDouble(){
|
||||
double d;
|
||||
_istream->read((char*)&d, DOUBLESIZE);
|
||||
if (_istream->rdstate() & _istream->failbit)
|
||||
throw Exception("DataInputStream::readDouble(): Failed to read double value.");
|
||||
return d;
|
||||
double d;
|
||||
_istream->read((char*)&d, DOUBLESIZE);
|
||||
if (_istream->rdstate() & _istream->failbit)
|
||||
throw Exception("DataInputStream::readDouble(): Failed to read double value.");
|
||||
return d;
|
||||
}
|
||||
|
||||
std::string DataInputStream::readString(){
|
||||
std::string s;
|
||||
int size = readInt();
|
||||
s.resize(size);
|
||||
_istream->read((char*)s.c_str(), size);
|
||||
if (_istream->rdstate() & _istream->failbit)
|
||||
throw Exception("DataInputStream::readString(): Failed to read string value.");
|
||||
return s;
|
||||
std::string s;
|
||||
int size = readInt();
|
||||
s.resize(size);
|
||||
_istream->read((char*)s.c_str(), size);
|
||||
if (_istream->rdstate() & _istream->failbit)
|
||||
throw Exception("DataInputStream::readString(): Failed to read string value.");
|
||||
return s;
|
||||
}
|
||||
|
||||
void DataInputStream::readCharArray(char* data, int size){
|
||||
_istream->read(data, size);
|
||||
if (_istream->rdstate() & _istream->failbit)
|
||||
throw Exception("DataInputStream::readCharArray(): Failed to read char value.");
|
||||
_istream->read(data, size);
|
||||
if (_istream->rdstate() & _istream->failbit)
|
||||
throw Exception("DataInputStream::readCharArray(): Failed to read char value.");
|
||||
}
|
||||
|
||||
osg::Vec2 DataInputStream::readVec2(){
|
||||
osg::Vec2 v;
|
||||
v.set(readFloat(), readFloat());
|
||||
return v;
|
||||
osg::Vec2 v;
|
||||
v.x()=readFloat();
|
||||
v.y()=readFloat();
|
||||
return v;
|
||||
}
|
||||
|
||||
osg::Vec3 DataInputStream::readVec3(){
|
||||
osg::Vec3 v;
|
||||
v.set(readFloat(),readFloat(),readFloat());
|
||||
return v;
|
||||
osg::Vec3 v;
|
||||
v.x()=readFloat();
|
||||
v.y()=readFloat();
|
||||
v.z()=readFloat();
|
||||
return v;
|
||||
}
|
||||
|
||||
osg::Vec4 DataInputStream::readVec4(){
|
||||
osg::Vec4 v;
|
||||
v.set(readFloat(), readFloat(), readFloat(), readFloat());
|
||||
return v;
|
||||
osg::Vec4 v;
|
||||
v.x()=readFloat();
|
||||
v.y()=readFloat();
|
||||
v.z()=readFloat();
|
||||
v.w()=readFloat();
|
||||
return v;
|
||||
}
|
||||
|
||||
osg::UByte4 DataInputStream::readUByte4(){
|
||||
osg::UByte4 v;
|
||||
v.set(readChar(), readChar(), readChar(), readChar());
|
||||
return v;
|
||||
osg::UByte4 v;
|
||||
v.r()=readChar();
|
||||
v.g()=readChar();
|
||||
v.b()=readChar();
|
||||
v.a()=readChar();
|
||||
return v;
|
||||
}
|
||||
|
||||
osg::Quat DataInputStream::readQuat(){
|
||||
osg::Quat q;
|
||||
q.set(readFloat(), readFloat(), readFloat(), readFloat());
|
||||
return q;
|
||||
osg::Quat q;
|
||||
q.set(readFloat(), readFloat(), readFloat(), readFloat());
|
||||
return q;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
osg::Image* DataInputStream::readImage(std::string filename){
|
||||
// If image is already read and in list
|
||||
// then just return pointer to this.
|
||||
for(ImageList::iterator mitr=_imageList.begin();
|
||||
mitr!=_imageList.end(); ++mitr){
|
||||
if(mitr->first.compare(filename) == 0){
|
||||
return mitr->second.get();
|
||||
}
|
||||
}
|
||||
// Image is not in list.
|
||||
// Read it from disk,
|
||||
osg::Image* image = osgDB::readImageFile(filename.c_str());
|
||||
// add it to the imageList,
|
||||
_imageList.push_back(ImagePair(filename, image));
|
||||
// and return image pointer.
|
||||
return image;
|
||||
}
|
||||
|
||||
osg::StateSet* DataInputStream::readStateSet(){
|
||||
// Read statesets unique ID.
|
||||
int id = readInt();
|
||||
// See if stateset is already in the list.
|
||||
for(StateSetList::iterator itr=_statesetList.begin();
|
||||
itr!=_statesetList.end(); ++itr){
|
||||
if(itr->first == id){
|
||||
return itr->second.get();
|
||||
}
|
||||
}
|
||||
// StateSet is not in list.
|
||||
// Create a new stateset,
|
||||
osg::StateSet* stateset = new osg::StateSet();
|
||||
// read its properties from stream
|
||||
((ive::StateSet*)(stateset))->read(this);
|
||||
// and add it to the stateset list,
|
||||
_statesetList.push_back(StateSetPair(id, stateset));
|
||||
return stateset;
|
||||
}
|
||||
|
||||
|
||||
|
||||
osg::Geometry::AttributeBinding DataInputStream::readBinding(){
|
||||
char c = readChar();
|
||||
switch((int)c){
|
||||
case 0: return osg::Geometry::BIND_OFF;
|
||||
case 1: return osg::Geometry::BIND_OVERALL;
|
||||
case 2: return osg::Geometry::BIND_PER_PRIMITIVE;
|
||||
case 3: return osg::Geometry::BIND_PER_PRIMITIVE_SET;
|
||||
case 4: return osg::Geometry::BIND_PER_VERTEX;
|
||||
default: throw Exception("Unknown binding type in DataInputStream::readBinding()");
|
||||
}
|
||||
char c = readChar();
|
||||
switch((int)c){
|
||||
case 0: return osg::Geometry::BIND_OFF;
|
||||
case 1: return osg::Geometry::BIND_OVERALL;
|
||||
case 2: return osg::Geometry::BIND_PER_PRIMITIVE;
|
||||
case 3: return osg::Geometry::BIND_PER_PRIMITIVE_SET;
|
||||
case 4: return osg::Geometry::BIND_PER_VERTEX;
|
||||
default: throw Exception("Unknown binding type in DataInputStream::readBinding()");
|
||||
}
|
||||
}
|
||||
|
||||
osg::Array* DataInputStream::readArray(){
|
||||
char c = readChar();
|
||||
switch((int)c){
|
||||
case 0: return readIntArray();
|
||||
case 1: return readUByteArray();
|
||||
case 2: return readUShortArray();
|
||||
case 3: return readUIntArray();
|
||||
case 4: return readUByte4Array();
|
||||
case 5: return readFloatArray();
|
||||
case 6: return readVec2Array();
|
||||
case 7: return readVec3Array();
|
||||
case 8: return readVec4Array();
|
||||
default: throw Exception("Unknown array type in DataInputStream::readArray()");
|
||||
}
|
||||
char c = readChar();
|
||||
switch((int)c){
|
||||
case 0: return readIntArray();
|
||||
case 1: return readUByteArray();
|
||||
case 2: return readUShortArray();
|
||||
case 3: return readUIntArray();
|
||||
case 4: return readUByte4Array();
|
||||
case 5: return readFloatArray();
|
||||
case 6: return readVec2Array();
|
||||
case 7: return readVec3Array();
|
||||
case 8: return readVec4Array();
|
||||
default: throw Exception("Unknown array type in DataInputStream::readArray()");
|
||||
}
|
||||
}
|
||||
|
||||
osg::IntArray* DataInputStream::readIntArray(){
|
||||
int size = readInt();
|
||||
osg::IntArray* a = new osg::IntArray();
|
||||
a->reserve(size);
|
||||
for(int i =0; i<size;i++){
|
||||
a->push_back(readInt());
|
||||
}
|
||||
return a;
|
||||
int size = readInt();
|
||||
osg::IntArray* a = new osg::IntArray(size);
|
||||
|
||||
_istream->read((char*)&((*a)[0]), INTSIZE*size);
|
||||
if (_istream->rdstate() & _istream->failbit)
|
||||
throw Exception("DataInputStream::readIntArray(): Failed to read Int array.");
|
||||
|
||||
// a->reserve(size);
|
||||
// for(int i =0; i<size;i++){
|
||||
// a->push_back(readInt());
|
||||
// }
|
||||
return a;
|
||||
}
|
||||
|
||||
osg::UByteArray* DataInputStream::readUByteArray(){
|
||||
int size = readInt();
|
||||
osg::UByteArray* a = new osg::UByteArray();
|
||||
a->reserve(size);
|
||||
for(int i =0; i<size;i++){
|
||||
a->push_back(readChar());
|
||||
}
|
||||
return a;
|
||||
int size = readInt();
|
||||
osg::UByteArray* a = new osg::UByteArray(size);
|
||||
|
||||
_istream->read((char*)&((*a)[0]), CHARSIZE*size);
|
||||
if (_istream->rdstate() & _istream->failbit)
|
||||
throw Exception("DataInputStream::readUByteArray(): Failed to read UByte array.");
|
||||
|
||||
// a->reserve(size);
|
||||
// for(int i =0; i<size;i++){
|
||||
// a->push_back(readChar());
|
||||
// }
|
||||
return a;
|
||||
}
|
||||
|
||||
osg::UShortArray* DataInputStream::readUShortArray(){
|
||||
int size = readInt();
|
||||
osg::UShortArray* a = new osg::UShortArray();
|
||||
a->reserve(size);
|
||||
for(int i =0; i<size;i++){
|
||||
a->push_back(readUShort());
|
||||
}
|
||||
return a;
|
||||
int size = readInt();
|
||||
osg::UShortArray* a = new osg::UShortArray(size);
|
||||
|
||||
_istream->read((char*)&((*a)[0]), SHORTSIZE*size);
|
||||
if (_istream->rdstate() & _istream->failbit)
|
||||
throw Exception("DataInputStream::readUShortArray(): Failed to read UShort array.");
|
||||
//
|
||||
// a->reserve(size);
|
||||
// for(int i =0; i<size;i++){
|
||||
// a->push_back(readUShort());
|
||||
// }
|
||||
return a;
|
||||
}
|
||||
|
||||
osg::UIntArray* DataInputStream::readUIntArray(){
|
||||
int size = readInt();
|
||||
osg::UIntArray* a = new osg::UIntArray();
|
||||
a->reserve(size);
|
||||
for(int i =0; i<size;i++){
|
||||
a->push_back((unsigned int)readInt());
|
||||
}
|
||||
return a;
|
||||
int size = readInt();
|
||||
osg::UIntArray* a = new osg::UIntArray(size);
|
||||
|
||||
_istream->read((char*)&((*a)[0]), INTSIZE*size);
|
||||
if (_istream->rdstate() & _istream->failbit)
|
||||
throw Exception("DataInputStream::readUIntArray(): Failed to read UInt array.");
|
||||
//
|
||||
// a->reserve(size);
|
||||
// for(int i =0; i<size;i++){
|
||||
// a->push_back((unsigned int)readInt());
|
||||
// }
|
||||
return a;
|
||||
}
|
||||
|
||||
osg::UByte4Array* DataInputStream::readUByte4Array(){
|
||||
int size = readInt();
|
||||
osg::UByte4Array* a = new osg::UByte4Array();
|
||||
a->reserve(size);
|
||||
for(int i =0; i<size;i++){
|
||||
a->push_back(readUByte4());
|
||||
}
|
||||
return a;
|
||||
int size = readInt();
|
||||
osg::UByte4Array* a = new osg::UByte4Array(size);
|
||||
|
||||
_istream->read((char*)&((*a)[0]), INTSIZE*size);
|
||||
if (_istream->rdstate() & _istream->failbit)
|
||||
throw Exception("DataInputStream::readUbyte4Array(): Failed to read UByte4 array.");
|
||||
|
||||
// a->reserve(size);
|
||||
// for(int i =0; i<size;i++){
|
||||
// a->push_back(readUByte4());
|
||||
// }
|
||||
return a;
|
||||
}
|
||||
|
||||
osg::FloatArray* DataInputStream::readFloatArray(){
|
||||
int size = readInt();
|
||||
osg::FloatArray* a = new osg::FloatArray();
|
||||
a->reserve(size);
|
||||
for(int i =0; i<size;i++){
|
||||
a->push_back(readFloat());
|
||||
}
|
||||
return a;
|
||||
int size = readInt();
|
||||
osg::FloatArray* a = new osg::FloatArray(size);
|
||||
|
||||
_istream->read((char*)&((*a)[0]), FLOATSIZE*size);
|
||||
if (_istream->rdstate() & _istream->failbit)
|
||||
throw Exception("DataInputStream::readFloatArray(): Failed to read float array.");
|
||||
|
||||
// a->reserve(size);
|
||||
// for(int i =0; i<size;i++){
|
||||
// a->push_back(readFloat());
|
||||
// }
|
||||
return a;
|
||||
}
|
||||
|
||||
osg::Vec2Array* DataInputStream::readVec2Array(){
|
||||
int size = readInt();
|
||||
osg::Vec2Array* a = new osg::Vec2Array(size);
|
||||
for(int i = 0; i < size; i++){
|
||||
(*a)[i] = (readVec2());
|
||||
}
|
||||
return a;
|
||||
int size = readInt();
|
||||
osg::Vec2Array* a = new osg::Vec2Array(size);
|
||||
|
||||
_istream->read((char*)&((*a)[0]), FLOATSIZE*2*size);
|
||||
if (_istream->rdstate() & _istream->failbit)
|
||||
throw Exception("DataInputStream::readVec2Array(): Failed to read Vec2 array.");
|
||||
|
||||
// for(int i = 0; i < size; i++){
|
||||
// (*a)[i] = (readVec2());
|
||||
// }
|
||||
return a;
|
||||
}
|
||||
|
||||
osg::Vec3Array* DataInputStream::readVec3Array(){
|
||||
int size = readInt();
|
||||
osg::Vec3Array* a = new osg::Vec3Array(size);
|
||||
for(int i = 0; i < size; i++){
|
||||
(*a)[i] = readVec3();
|
||||
}
|
||||
return a;
|
||||
int size = readInt();
|
||||
osg::Vec3Array* a = new osg::Vec3Array(size);
|
||||
|
||||
_istream->read((char*)&((*a)[0]), FLOATSIZE*3*size);
|
||||
if (_istream->rdstate() & _istream->failbit)
|
||||
throw Exception("DataInputStream::readVec3Array(): Failed to read Vec3 array.");
|
||||
|
||||
// for(int i = 0; i < size; i++){
|
||||
// (*a)[i] = readVec3();
|
||||
// }
|
||||
return a;
|
||||
}
|
||||
|
||||
osg::Vec4Array* DataInputStream::readVec4Array(){
|
||||
int size = readInt();
|
||||
osg::Vec4Array* a = new osg::Vec4Array(size);
|
||||
for(int i = 0; i < size; i++){
|
||||
(*a)[i] = (readVec4());
|
||||
}
|
||||
return a;
|
||||
int size = readInt();
|
||||
osg::Vec4Array* a = new osg::Vec4Array(size);
|
||||
|
||||
_istream->read((char*)&((*a)[0]), FLOATSIZE*4*size);
|
||||
if (_istream->rdstate() & _istream->failbit)
|
||||
throw Exception("DataInputStream::readVec4Array(): Failed to read Vec4 array.");
|
||||
|
||||
|
||||
// for(int i = 0; i < size; i++){
|
||||
// (*a)[i] = (readVec4());
|
||||
// }
|
||||
|
||||
|
||||
return a;
|
||||
}
|
||||
|
||||
osg::Matrix DataInputStream::readMatrix(){
|
||||
osg::Matrix mat;
|
||||
float* p = mat.ptr();
|
||||
for(int i=0;i<16;i++){
|
||||
p[i] = readFloat();
|
||||
}
|
||||
return mat;
|
||||
osg::Matrix mat;
|
||||
_istream->read((char*)(mat.ptr()), FLOATSIZE*16);
|
||||
if (_istream->rdstate() & _istream->failbit)
|
||||
throw Exception("DataInputStream::readMatrix(): Failed to read Matrix array.");
|
||||
// float* p = mat.ptr();
|
||||
// for(int i=0;i<16;i++){
|
||||
// p[i] = readFloat();
|
||||
// }
|
||||
return mat;
|
||||
}
|
||||
|
||||
osg::Image* DataInputStream::readImage(std::string filename)
|
||||
{
|
||||
// If image is already read and in list
|
||||
// then just return pointer to this.
|
||||
ImageMap::iterator mitr=_imageMap.find(filename);
|
||||
if (mitr!=_imageMap.end()) mitr->second.get();
|
||||
|
||||
// Image is not in list.
|
||||
// Read it from disk,
|
||||
osg::Image* image = osgDB::readImageFile(filename.c_str());
|
||||
|
||||
// add it to the imageList,
|
||||
_imageMap[filename] = image;
|
||||
// and return image pointer.
|
||||
return image;
|
||||
}
|
||||
|
||||
osg::StateSet* DataInputStream::readStateSet()
|
||||
{
|
||||
// Read statesets unique ID.
|
||||
int id = readInt();
|
||||
// See if stateset is already in the list.
|
||||
StateSetMap::iterator itr= _statesetMap.find(id);
|
||||
if (itr!=_statesetMap.end()) return itr->second.get();
|
||||
|
||||
// StateSet is not in list.
|
||||
// Create a new stateset,
|
||||
osg::StateSet* stateset = new osg::StateSet();
|
||||
|
||||
// read its properties from stream
|
||||
((ive::StateSet*)(stateset))->read(this);
|
||||
|
||||
// and add it to the stateset map,
|
||||
_statesetMap[id] = stateset;
|
||||
|
||||
return stateset;
|
||||
}
|
||||
|
||||
osg::StateAttribute* DataInputStream::readStateAttribute()
|
||||
{
|
||||
// Read stateattributes unique ID.
|
||||
int id = readInt();
|
||||
// See if stateattribute is already in the list.
|
||||
StateAttributeMap::iterator itr= _stateAttributeMap.find(id);
|
||||
if (itr!=_stateAttributeMap.end()) return itr->second.get();
|
||||
|
||||
// stateattribute is not in list.
|
||||
// Create a new stateattribute,
|
||||
|
||||
|
||||
osg::StateAttribute* attribute;
|
||||
int attributeID = peekInt();
|
||||
if(attributeID == IVEBLENDFUNC){
|
||||
attribute = new osg::BlendFunc();
|
||||
((ive::BlendFunc*)(attribute))->read(this);
|
||||
}
|
||||
else if(attributeID == IVEMATERIAL){
|
||||
attribute = new osg::Material();
|
||||
((ive::Material*)(attribute))->read(this);
|
||||
}
|
||||
else if(attributeID == IVECULLFACE){
|
||||
attribute = new osg::CullFace();
|
||||
((ive::CullFace*)(attribute))->read(this);
|
||||
}
|
||||
else if(attributeID == IVEPOLYGONOFFSET){
|
||||
attribute = new osg::PolygonOffset();
|
||||
((ive::PolygonOffset*)(attribute))->read(this);
|
||||
}
|
||||
else if(attributeID == IVESHADEMODEL){
|
||||
attribute = new osg::ShadeModel();
|
||||
((ive::ShadeModel*)(attribute))->read(this);
|
||||
}
|
||||
else if(attributeID == IVEPOINT){
|
||||
attribute = new osg::Point();
|
||||
((ive::Point*)(attribute))->read(this);
|
||||
}
|
||||
else if(attributeID == IVETEXTURE2D){
|
||||
attribute = new osg::Texture2D();
|
||||
((ive::Texture2D*)(attribute))->read(this);
|
||||
}
|
||||
else if(attributeID == IVETEXTURECUBEMAP){
|
||||
attribute = new osg::TextureCubeMap();
|
||||
((ive::TextureCubeMap*)(attribute))->read(this);
|
||||
}
|
||||
else if(attributeID == IVETEXENV){
|
||||
attribute = new osg::TexEnv();
|
||||
((ive::TexEnv*)(attribute))->read(this);
|
||||
}
|
||||
else if(attributeID == IVETEXENVCOMBINE){
|
||||
attribute = new osg::TexEnvCombine();
|
||||
((ive::TexEnvCombine*)(attribute))->read(this);
|
||||
}
|
||||
else if(attributeID == IVETEXGEN){
|
||||
attribute = new osg::TexGen();
|
||||
((ive::TexGen*)(attribute))->read(this);
|
||||
}
|
||||
else{
|
||||
throw Exception("Unkown StateAttribute in StateSet::read()");
|
||||
}
|
||||
|
||||
// and add it to the stateattribute map,
|
||||
_stateAttributeMap[id] = attribute;
|
||||
|
||||
return attribute;
|
||||
}
|
||||
|
||||
osg::Drawable* DataInputStream::readDrawable()
|
||||
{
|
||||
// Read stateattributes unique ID.
|
||||
int id = readInt();
|
||||
// See if stateattribute is already in the list.
|
||||
DrawableMap::iterator itr= _drawableMap.find(id);
|
||||
if (itr!=_drawableMap.end()) return itr->second.get();
|
||||
|
||||
// stateattribute is not in list.
|
||||
// Create a new stateattribute,
|
||||
|
||||
int drawableTypeID = peekInt();
|
||||
osg::Drawable* drawable;
|
||||
if(drawableTypeID == IVEGEOMETRY){
|
||||
drawable = new osg::Geometry();
|
||||
((Geometry*)(drawable))->read(this);
|
||||
}
|
||||
else
|
||||
throw Exception("Unknown drawable drawableTypeIDentification in Geode::read()");
|
||||
|
||||
|
||||
// and add it to the stateattribute map,
|
||||
_drawableMap[id] = drawable;
|
||||
|
||||
return drawable;
|
||||
}
|
||||
|
||||
osg::Node* DataInputStream::readNode()
|
||||
{
|
||||
// Read node unique ID.
|
||||
int id = readInt();
|
||||
// See if node is already in the list.
|
||||
NodeMap::iterator itr= _nodeMap.find(id);
|
||||
if (itr!=_nodeMap.end()) return itr->second.get();
|
||||
|
||||
// stateattribute is not in list.
|
||||
// Create a new node,
|
||||
|
||||
osg::Node* node;
|
||||
int nodeTypeID= peekInt();
|
||||
|
||||
if(nodeTypeID== IVEMATRIXTRANSFORM){
|
||||
node = new osg::MatrixTransform();
|
||||
((ive::MatrixTransform*)(node))->read(this);
|
||||
}
|
||||
// else if(nodeTypeID== IVEVIEWPOINT){
|
||||
// node = new osgfIVE::ViewPoint();
|
||||
// ((ive::ViewPoint*)(node))->read(this);
|
||||
// }
|
||||
else if(nodeTypeID== IVEPOSITIONATTITUDETRANSFORM){
|
||||
node = new osg::PositionAttitudeTransform();
|
||||
((ive::PositionAttitudeTransform*)(node))->read(this);
|
||||
}
|
||||
else if(nodeTypeID== IVETRANSFORM){
|
||||
node = new osg::Transform();
|
||||
((ive::Transform*)(node))->read(this);
|
||||
}
|
||||
else if(nodeTypeID== IVELIGHTSOURCE){
|
||||
node = new osg::LightSource();
|
||||
((ive::LightSource*)(node))->read(this);
|
||||
}
|
||||
else if(nodeTypeID== IVESEQUENCE){
|
||||
node = new osg::Sequence();
|
||||
((ive::Sequence*)(node))->read(this);
|
||||
}
|
||||
else if(nodeTypeID== IVELOD){
|
||||
node = new osg::LOD();
|
||||
((ive::LOD*)(node))->read(this);
|
||||
}
|
||||
else if(nodeTypeID== IVESWITCH){
|
||||
node = new osg::Switch();
|
||||
((ive::Switch*)(node))->read(this);
|
||||
}
|
||||
else if(nodeTypeID== IVEIMPOSTOR){
|
||||
node = new osg::Impostor();
|
||||
((ive::Impostor*)(node))->read(this);
|
||||
}
|
||||
else if(nodeTypeID== IVEOCCLUDERNODE){
|
||||
node = new osg::OccluderNode();
|
||||
((ive::OccluderNode*)(node))->read(this);
|
||||
}
|
||||
else if(nodeTypeID== IVEGROUP){
|
||||
node = new osg::Group();
|
||||
((ive::Group*)(node))->read(this);
|
||||
}
|
||||
else if(nodeTypeID== IVEBILLBOARD){
|
||||
node = new osg::Billboard();
|
||||
((ive::Billboard*)(node))->read(this);
|
||||
}
|
||||
else if(nodeTypeID== IVEGEODE){
|
||||
node = new osg::Geode();
|
||||
((ive::Geode*)(node))->read(this);
|
||||
}
|
||||
else{
|
||||
throw Exception("Unknown node identification in DataInputStream::readNode()");
|
||||
}
|
||||
|
||||
// and add it to the stateattribute map,
|
||||
_nodeMap[id] = node;
|
||||
|
||||
return node;
|
||||
}
|
||||
|
@ -32,6 +32,7 @@ public:
|
||||
bool readBool();
|
||||
char readChar();
|
||||
unsigned short readUShort();
|
||||
unsigned int readUInt();
|
||||
int readInt();
|
||||
int peekInt();
|
||||
float readFloat();
|
||||
@ -46,8 +47,6 @@ public:
|
||||
osg::Quat readQuat();
|
||||
osg::Matrix readMatrix();
|
||||
osg::Geometry::AttributeBinding readBinding();
|
||||
osg::Image* readImage(std::string s);
|
||||
osg::StateSet* readStateSet();
|
||||
osg::Array* readArray();
|
||||
osg::IntArray* readIntArray();
|
||||
osg::UByteArray* readUByteArray();
|
||||
@ -59,22 +58,29 @@ public:
|
||||
osg::Vec3Array* readVec3Array();
|
||||
osg::Vec4Array* readVec4Array();
|
||||
|
||||
// Container to map image filenames to their respective images.
|
||||
typedef std::pair<std::string, osg::ref_ptr<osg::Image> > ImagePair;
|
||||
typedef std::vector<ImagePair> ImageList;
|
||||
osg::Image* readImage(std::string s);
|
||||
osg::StateSet* readStateSet();
|
||||
osg::StateAttribute* readStateAttribute();
|
||||
osg::Drawable* readDrawable();
|
||||
osg::Node* readNode();
|
||||
|
||||
// Container to map stateset id to their respective stateset.
|
||||
typedef std::pair<int, osg::ref_ptr<osg::StateSet> > StateSetPair;
|
||||
typedef std::vector<StateSetPair> StateSetList;
|
||||
typedef std::map<std::string, osg::ref_ptr<osg::Image> > ImageMap;
|
||||
typedef std::map<int,osg::ref_ptr<osg::StateSet> > StateSetMap;
|
||||
typedef std::map<int,osg::ref_ptr<osg::StateAttribute> > StateAttributeMap;
|
||||
typedef std::map<int,osg::ref_ptr<osg::Drawable> > DrawableMap;
|
||||
typedef std::map<int,osg::ref_ptr<osg::Node> > NodeMap;
|
||||
|
||||
|
||||
private:
|
||||
std::istream* _istream;
|
||||
int _version;
|
||||
bool _peeking;
|
||||
int _peekValue;
|
||||
ImageList _imageList;
|
||||
StateSetList _statesetList;
|
||||
std::istream* _istream;
|
||||
int _version;
|
||||
bool _peeking;
|
||||
int _peekValue;
|
||||
ImageMap _imageMap;
|
||||
StateSetMap _statesetMap;
|
||||
StateAttributeMap _stateAttributeMap;
|
||||
DrawableMap _drawableMap;
|
||||
NodeMap _nodeMap;
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -1,252 +1,449 @@
|
||||
/**********************************************************************
|
||||
*
|
||||
* FILE: DataOutputStream.cpp
|
||||
* FILE: DataOutputStream.cpp
|
||||
*
|
||||
* DESCRIPTION: Implements methods to write simpel datatypes to an
|
||||
* output stream.
|
||||
* DESCRIPTION: Implements methods to write simpel datatypes to an
|
||||
* output stream.
|
||||
*
|
||||
* CREATED BY: Rune Schmidt Jensen
|
||||
* CREATED BY: Rune Schmidt Jensen
|
||||
*
|
||||
* HISTORY: Created 11.03.2003
|
||||
* HISTORY: Created 11.03.2003
|
||||
*
|
||||
* Copyright 2003 VR-C
|
||||
* Copyright 2003 VR-C
|
||||
**********************************************************************/
|
||||
|
||||
#include "DataOutputStream.h"
|
||||
#include "Exception.h"
|
||||
|
||||
#include "StateSet.h"
|
||||
#include "BlendFunc.h"
|
||||
#include "Material.h"
|
||||
#include "CullFace.h"
|
||||
#include "PolygonOffset.h"
|
||||
#include "ShadeModel.h"
|
||||
#include "Point.h"
|
||||
#include "Texture2D.h"
|
||||
#include "TextureCubeMap.h"
|
||||
#include "TexEnv.h"
|
||||
#include "TexEnvCombine.h"
|
||||
#include "TexGen.h"
|
||||
|
||||
#include "Group.h"
|
||||
#include "MatrixTransform.h"
|
||||
#include "Geode.h"
|
||||
#include "LightSource.h"
|
||||
#include "Billboard.h"
|
||||
#include "Sequence.h"
|
||||
#include "LOD.h"
|
||||
//#include "ViewPoint.h"
|
||||
#include "PositionAttitudeTransform.h"
|
||||
#include "Transform.h"
|
||||
#include "Switch.h"
|
||||
#include "OccluderNode.h"
|
||||
#include "Impostor.h"
|
||||
|
||||
#include "Geometry.h"
|
||||
|
||||
using namespace ive;
|
||||
|
||||
DataOutputStream::DataOutputStream(std::ostream * ostream){
|
||||
|
||||
_includeImageData= true;
|
||||
_ostream = ostream;
|
||||
if(!_ostream)
|
||||
throw Exception("DataOutputStream::DataOutputStream(): null pointer exception in argument.");
|
||||
writeInt(VERSION);
|
||||
_includeImageData= true;
|
||||
_ostream = ostream;
|
||||
if(!_ostream)
|
||||
throw Exception("DataOutputStream::DataOutputStream(): null pointer exception in argument.");
|
||||
writeInt(VERSION);
|
||||
}
|
||||
|
||||
DataOutputStream::~DataOutputStream(){}
|
||||
|
||||
void DataOutputStream::writeBool(bool b){
|
||||
_ostream->write((char*)&b, BOOLSIZE);
|
||||
_ostream->write((char*)&b, BOOLSIZE);
|
||||
}
|
||||
|
||||
void DataOutputStream::writeChar(char c){
|
||||
_ostream->write(&c, CHARSIZE);
|
||||
_ostream->write(&c, CHARSIZE);
|
||||
}
|
||||
|
||||
void DataOutputStream::writeUShort(unsigned short s){
|
||||
_ostream->write((char*)&s, SHORTSIZE);
|
||||
_ostream->write((char*)&s, SHORTSIZE);
|
||||
}
|
||||
|
||||
void DataOutputStream::writeUInt(unsigned int s){
|
||||
_ostream->write((char*)&s, INTSIZE);
|
||||
}
|
||||
|
||||
void DataOutputStream::writeInt(int i){
|
||||
_ostream->write((char*)&i, INTSIZE);
|
||||
_ostream->write((char*)&i, INTSIZE);
|
||||
}
|
||||
|
||||
void DataOutputStream::writeFloat(float f){
|
||||
_ostream->write((char*)&f, FLOATSIZE);
|
||||
_ostream->write((char*)&f, FLOATSIZE);
|
||||
}
|
||||
|
||||
void DataOutputStream::writeLong(long l){
|
||||
_ostream->write((char*)&l, LONGSIZE);
|
||||
_ostream->write((char*)&l, LONGSIZE);
|
||||
}
|
||||
|
||||
void DataOutputStream::writeDouble(double d){
|
||||
_ostream->write((char*)&d, DOUBLESIZE);
|
||||
_ostream->write((char*)&d, DOUBLESIZE);
|
||||
}
|
||||
|
||||
void DataOutputStream::writeString(std::string s){
|
||||
writeInt(s.size());
|
||||
_ostream->write(s.c_str(), s.size());
|
||||
writeInt(s.size());
|
||||
_ostream->write(s.c_str(), s.size());
|
||||
}
|
||||
|
||||
void DataOutputStream::writeCharArray(char* data, int size){
|
||||
_ostream->write(data, size);
|
||||
_ostream->write(data, size);
|
||||
}
|
||||
|
||||
void DataOutputStream::writeVec2(osg::Vec2 v){
|
||||
writeFloat(v.y());
|
||||
writeFloat(v.x());
|
||||
void DataOutputStream::writeVec2(const osg::Vec2& v){
|
||||
writeFloat(v.x());
|
||||
writeFloat(v.y());
|
||||
}
|
||||
|
||||
void DataOutputStream::writeVec3(osg::Vec3 v){
|
||||
writeFloat(v.z());
|
||||
writeFloat(v.y());
|
||||
writeFloat(v.x());
|
||||
void DataOutputStream::writeVec3(const osg::Vec3& v){
|
||||
writeFloat(v.x());
|
||||
writeFloat(v.y());
|
||||
writeFloat(v.z());
|
||||
}
|
||||
|
||||
void DataOutputStream::writeVec4(osg::Vec4 v){
|
||||
writeFloat(v.w());
|
||||
writeFloat(v.z());
|
||||
writeFloat(v.y());
|
||||
writeFloat(v.x());
|
||||
void DataOutputStream::writeVec4(const osg::Vec4& v){
|
||||
writeFloat(v.x());
|
||||
writeFloat(v.y());
|
||||
writeFloat(v.z());
|
||||
writeFloat(v.w());
|
||||
}
|
||||
|
||||
void DataOutputStream::writeUByte4(osg::UByte4 v){
|
||||
writeChar(v.a());
|
||||
writeChar(v.b());
|
||||
writeChar(v.g());
|
||||
writeChar(v.r());
|
||||
void DataOutputStream::writeUByte4(const osg::UByte4& v){
|
||||
writeChar(v.r());
|
||||
writeChar(v.g());
|
||||
writeChar(v.b());
|
||||
writeChar(v.a());
|
||||
}
|
||||
|
||||
void DataOutputStream::writeQuat(osg::Quat q){
|
||||
writeFloat(q.w());
|
||||
writeFloat(q.z());
|
||||
writeFloat(q.y());
|
||||
writeFloat(q.x());
|
||||
}
|
||||
|
||||
void DataOutputStream::writeStateSet(osg::StateSet* stateset){
|
||||
// If stateset is already in list we do not write it again.
|
||||
// We just writes its unique ID.
|
||||
for(StateSetList::iterator itr=_statesetList.begin();
|
||||
itr!=_statesetList.end(); ++itr){
|
||||
if((*itr) == (int)stateset){
|
||||
writeInt((*itr));
|
||||
return;
|
||||
}
|
||||
}
|
||||
// StateSet is not in list.
|
||||
// We write its unique ID,
|
||||
writeInt((int)stateset);
|
||||
// add it to the stateset list,
|
||||
_statesetList.push_back((int)stateset);
|
||||
// and write it to stream.
|
||||
((ive::StateSet*)(stateset))->write(this);
|
||||
void DataOutputStream::writeQuat(const osg::Quat& q){
|
||||
writeFloat(q.x());
|
||||
writeFloat(q.y());
|
||||
writeFloat(q.z());
|
||||
writeFloat(q.w());
|
||||
}
|
||||
|
||||
void DataOutputStream::writeBinding(osg::Geometry::AttributeBinding b){
|
||||
switch(b){
|
||||
case osg::Geometry::BIND_OFF: writeChar((char) 0); break;
|
||||
case osg::Geometry::BIND_OVERALL: writeChar((char) 1); break;
|
||||
case osg::Geometry::BIND_PER_PRIMITIVE: writeChar((char) 2); break;
|
||||
case osg::Geometry::BIND_PER_PRIMITIVE_SET: writeChar((char) 3); break;
|
||||
case osg::Geometry::BIND_PER_VERTEX: writeChar((char) 4); break;
|
||||
default: throw Exception("Unknown binding in DataOutputStream::writeBinding()");
|
||||
}
|
||||
switch(b){
|
||||
case osg::Geometry::BIND_OFF: writeChar((char) 0); break;
|
||||
case osg::Geometry::BIND_OVERALL: writeChar((char) 1); break;
|
||||
case osg::Geometry::BIND_PER_PRIMITIVE: writeChar((char) 2); break;
|
||||
case osg::Geometry::BIND_PER_PRIMITIVE_SET: writeChar((char) 3); break;
|
||||
case osg::Geometry::BIND_PER_VERTEX: writeChar((char) 4); break;
|
||||
default: throw Exception("Unknown binding in DataOutputStream::writeBinding()");
|
||||
}
|
||||
}
|
||||
|
||||
void DataOutputStream::writeArray(osg::Array* a){
|
||||
switch(a->getType()){
|
||||
case osg::Array::IntArrayType:
|
||||
writeChar((char)0);
|
||||
writeIntArray(static_cast<osg::IntArray*>(a));
|
||||
break;
|
||||
case osg::Array::UByteArrayType:
|
||||
writeChar((char)1);
|
||||
writeUByteArray(static_cast<osg::UByteArray*>(a));
|
||||
break;
|
||||
case osg::Array::UShortArrayType:
|
||||
writeChar((char)2);
|
||||
writeUShortArray(static_cast<osg::UShortArray*>(a));
|
||||
break;
|
||||
case osg::Array::UIntArrayType:
|
||||
writeChar((char)3);
|
||||
writeUIntArray(static_cast<osg::UIntArray*>(a));
|
||||
break;
|
||||
case osg::Array::UByte4ArrayType:
|
||||
writeChar((char)4);
|
||||
writeUByte4Array(static_cast<osg::UByte4Array*>(a));
|
||||
break;
|
||||
case osg::Array::FloatArrayType:
|
||||
writeChar((char)5);
|
||||
writeFloatArray(static_cast<osg::FloatArray*>(a));
|
||||
break;
|
||||
case osg::Array::Vec2ArrayType:
|
||||
writeChar((char)6);
|
||||
writeVec2Array(static_cast<osg::Vec2Array*>(a));
|
||||
break;
|
||||
case osg::Array::Vec3ArrayType:
|
||||
writeChar((char)7);
|
||||
writeVec3Array(static_cast<osg::Vec3Array*>(a));
|
||||
break;
|
||||
case osg::Array::Vec4ArrayType:
|
||||
writeChar((char)8);
|
||||
writeVec4Array(static_cast<osg::Vec4Array*>(a));
|
||||
break;
|
||||
default: throw Exception("Unknown array type in DataOutputStream::writeArray()");
|
||||
}
|
||||
switch(a->getType()){
|
||||
case osg::Array::IntArrayType:
|
||||
writeChar((char)0);
|
||||
writeIntArray(static_cast<osg::IntArray*>(a));
|
||||
break;
|
||||
case osg::Array::UByteArrayType:
|
||||
writeChar((char)1);
|
||||
writeUByteArray(static_cast<osg::UByteArray*>(a));
|
||||
break;
|
||||
case osg::Array::UShortArrayType:
|
||||
writeChar((char)2);
|
||||
writeUShortArray(static_cast<osg::UShortArray*>(a));
|
||||
break;
|
||||
case osg::Array::UIntArrayType:
|
||||
writeChar((char)3);
|
||||
writeUIntArray(static_cast<osg::UIntArray*>(a));
|
||||
break;
|
||||
case osg::Array::UByte4ArrayType:
|
||||
writeChar((char)4);
|
||||
writeUByte4Array(static_cast<osg::UByte4Array*>(a));
|
||||
break;
|
||||
case osg::Array::FloatArrayType:
|
||||
writeChar((char)5);
|
||||
writeFloatArray(static_cast<osg::FloatArray*>(a));
|
||||
break;
|
||||
case osg::Array::Vec2ArrayType:
|
||||
writeChar((char)6);
|
||||
writeVec2Array(static_cast<osg::Vec2Array*>(a));
|
||||
break;
|
||||
case osg::Array::Vec3ArrayType:
|
||||
writeChar((char)7);
|
||||
writeVec3Array(static_cast<osg::Vec3Array*>(a));
|
||||
break;
|
||||
case osg::Array::Vec4ArrayType:
|
||||
writeChar((char)8);
|
||||
writeVec4Array(static_cast<osg::Vec4Array*>(a));
|
||||
break;
|
||||
default: throw Exception("Unknown array type in DataOutputStream::writeArray()");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void DataOutputStream::writeIntArray(osg::IntArray* a){
|
||||
int size = a->getNumElements();
|
||||
writeInt(size);
|
||||
for(int i =0; i<size ;i++){
|
||||
writeInt(a->index(i));
|
||||
}
|
||||
int size = a->getNumElements();
|
||||
writeInt(size);
|
||||
for(int i =0; i<size ;i++){
|
||||
writeInt(a->index(i));
|
||||
}
|
||||
}
|
||||
|
||||
void DataOutputStream::writeUByteArray(osg::UByteArray* a){
|
||||
int size = a->getNumElements();
|
||||
writeInt(size);
|
||||
for(int i =0; i<size ;i++){
|
||||
writeChar((*a)[i]);
|
||||
}
|
||||
int size = a->getNumElements();
|
||||
writeInt(size);
|
||||
for(int i =0; i<size ;i++){
|
||||
writeChar((*a)[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void DataOutputStream::writeUShortArray(osg::UShortArray* a){
|
||||
int size = a->getNumElements();
|
||||
writeInt(size);
|
||||
for(int i =0; i<size ;i++){
|
||||
writeUShort((*a)[i]);
|
||||
}
|
||||
int size = a->getNumElements();
|
||||
writeInt(size);
|
||||
for(int i =0; i<size ;i++){
|
||||
writeUShort((*a)[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void DataOutputStream::writeUIntArray(osg::UIntArray* a){
|
||||
int size = a->getNumElements();
|
||||
writeInt(size);
|
||||
for(int i =0; i<size ;i++){
|
||||
writeInt((*a)[i]);
|
||||
}
|
||||
int size = a->getNumElements();
|
||||
writeInt(size);
|
||||
for(int i =0; i<size ;i++){
|
||||
writeInt((*a)[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void DataOutputStream::writeUByte4Array(osg::UByte4Array* a){
|
||||
int size = a->getNumElements();
|
||||
writeInt(size);
|
||||
for(int i =0; i<size ;i++){
|
||||
writeUByte4((*a)[i]);
|
||||
}
|
||||
int size = a->getNumElements();
|
||||
writeInt(size);
|
||||
for(int i =0; i<size ;i++){
|
||||
writeUByte4((*a)[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void DataOutputStream::writeFloatArray(osg::FloatArray* a){
|
||||
int size = a->getNumElements();
|
||||
writeInt(size);
|
||||
for(int i =0; i<size ;i++){
|
||||
writeFloat((*a)[i]);
|
||||
}
|
||||
int size = a->getNumElements();
|
||||
writeInt(size);
|
||||
for(int i =0; i<size ;i++){
|
||||
writeFloat((*a)[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void DataOutputStream::writeVec2Array(osg::Vec2Array* a){
|
||||
int size = a->size();
|
||||
writeInt(size);
|
||||
for(int i=0;i<size;i++){
|
||||
writeVec2((*a)[i]);
|
||||
}
|
||||
int size = a->size();
|
||||
writeInt(size);
|
||||
for(int i=0;i<size;i++){
|
||||
writeVec2((*a)[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void DataOutputStream::writeVec3Array(osg::Vec3Array* a){
|
||||
int size = a->size();
|
||||
writeInt(size);
|
||||
for(int i = 0; i < size; i++){
|
||||
int size = a->size();
|
||||
writeInt(size);
|
||||
for(int i = 0; i < size; i++){
|
||||
writeVec3((*a)[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DataOutputStream::writeVec4Array(osg::Vec4Array* a){
|
||||
int size = a->size();
|
||||
writeInt(size);
|
||||
for(int i=0;i<size;i++){
|
||||
writeVec4((*a)[i]);
|
||||
}
|
||||
int size = a->size();
|
||||
writeInt(size);
|
||||
for(int i=0;i<size;i++){
|
||||
writeVec4((*a)[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void DataOutputStream::writeMatrix(osg::Matrix mat){
|
||||
float* p = mat.ptr();
|
||||
for(int i=0;i<16;i++){
|
||||
writeFloat(p[i]);
|
||||
}
|
||||
float* p = mat.ptr();
|
||||
for(int i=0;i<16;i++){
|
||||
writeFloat(p[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void DataOutputStream::writeStateSet(osg::StateSet* stateset)
|
||||
{
|
||||
StateSetMap::iterator itr = _stateSetMap.find(stateset);
|
||||
if (itr!=_stateSetMap.end())
|
||||
{
|
||||
// Id already exists so just write ID.
|
||||
writeInt(itr->second);
|
||||
}
|
||||
else
|
||||
{
|
||||
// id doesn't exist so create a new ID and
|
||||
// register the stateset.
|
||||
|
||||
int id = _stateSetMap.size();
|
||||
_stateSetMap[stateset] = id;
|
||||
|
||||
// write the id.
|
||||
writeInt(id);
|
||||
|
||||
// write the stateset.
|
||||
((ive::StateSet*)(stateset))->write(this);
|
||||
}
|
||||
}
|
||||
|
||||
void DataOutputStream::writeStateAttribute(osg::StateAttribute* attribute)
|
||||
{
|
||||
StateAttributeMap::iterator itr = _stateAttributeMap.find(attribute);
|
||||
if (itr!=_stateAttributeMap.end())
|
||||
{
|
||||
// Id already exists so just write ID.
|
||||
writeInt(itr->second);
|
||||
}
|
||||
else
|
||||
{
|
||||
// id doesn't exist so create a new ID and
|
||||
// register the stateset.
|
||||
|
||||
int id = _stateAttributeMap.size();
|
||||
_stateAttributeMap[attribute] = id;
|
||||
|
||||
// write the id.
|
||||
writeInt(id);
|
||||
|
||||
// write the stateset.
|
||||
if(dynamic_cast<osg::BlendFunc*>(attribute)){
|
||||
((ive::BlendFunc*)(attribute))->write(this);
|
||||
}
|
||||
// This is a Material
|
||||
else if(dynamic_cast<osg::Material*>(attribute)){
|
||||
((ive::Material*)(attribute))->write(this);
|
||||
}
|
||||
// This is a CullFace
|
||||
else if(dynamic_cast<osg::CullFace*>(attribute)){
|
||||
((ive::CullFace*)(attribute))->write(this);
|
||||
}
|
||||
// This is a PolygonOffset
|
||||
else if(dynamic_cast<osg::PolygonOffset*>(attribute)){
|
||||
((ive::PolygonOffset*)(attribute))->write(this);
|
||||
}
|
||||
else if(dynamic_cast<osg::ShadeModel*>(attribute)){
|
||||
((ive::ShadeModel*)(attribute))->write(this);
|
||||
}
|
||||
else if(dynamic_cast<osg::Point*>(attribute)){
|
||||
((ive::Point*)(attribute))->write(this);
|
||||
}
|
||||
// This is a Texture2D
|
||||
else if(dynamic_cast<osg::Texture2D*>(attribute)){
|
||||
((ive::Texture2D*)(attribute))->write(this);
|
||||
}
|
||||
// This is a TextureCubeMap
|
||||
else if(dynamic_cast<osg::TextureCubeMap*>(attribute)){
|
||||
((ive::TextureCubeMap*)(attribute))->write(this);
|
||||
}
|
||||
// This is a TexEnv
|
||||
else if(dynamic_cast<osg::TexEnv*>(attribute)){
|
||||
((ive::TexEnv*)(attribute))->write(this);
|
||||
}
|
||||
// This is a TexEnvCombine
|
||||
else if(dynamic_cast<osg::TexEnvCombine*>(attribute)){
|
||||
((ive::TexEnvCombine*)(attribute))->write(this);
|
||||
}
|
||||
// This is a TexGen
|
||||
else if(dynamic_cast<osg::TexGen*>(attribute)){
|
||||
((ive::TexGen*)(attribute))->write(this);
|
||||
}
|
||||
else{
|
||||
std::string className = attribute->className();
|
||||
throw Exception(std::string("StateSet::write(): Unknown StateAttribute: ").append(className));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DataOutputStream::writeDrawable(osg::Drawable* drawable)
|
||||
{
|
||||
DrawableMap::iterator itr = _drawableMap.find(drawable);
|
||||
if (itr!=_drawableMap.end())
|
||||
{
|
||||
// Id already exists so just write ID.
|
||||
writeInt(itr->second);
|
||||
}
|
||||
else
|
||||
{
|
||||
// id doesn't exist so create a new ID and
|
||||
// register the stateset.
|
||||
|
||||
int id = _drawableMap.size();
|
||||
_drawableMap[drawable] = id;
|
||||
|
||||
// write the id.
|
||||
writeInt(id);
|
||||
|
||||
if(dynamic_cast<osg::Geometry*>(drawable))
|
||||
((ive::Geometry*)(drawable))->write(this);
|
||||
else{
|
||||
throw Exception("Unknown drawable in DataOutputStream::writeDrawable()");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DataOutputStream::writeNode(osg::Node* node)
|
||||
{
|
||||
NodeMap::iterator itr = _nodeMap.find(node);
|
||||
if (itr!=_nodeMap.end())
|
||||
{
|
||||
// Id already exists so just write ID.
|
||||
writeInt(itr->second);
|
||||
}
|
||||
else
|
||||
{
|
||||
// id doesn't exist so create a new ID and
|
||||
// register the stateset.
|
||||
|
||||
int id = _nodeMap.size();
|
||||
_nodeMap[node] = id;
|
||||
|
||||
// write the id.
|
||||
writeInt(id);
|
||||
|
||||
if(dynamic_cast<osg::MatrixTransform*>(node)){
|
||||
((ive::MatrixTransform*)(node))->write(this);
|
||||
}
|
||||
// else if(dynamic_cast<osgfIVE::ViewPoint*>(node)){
|
||||
// ((ive::ViewPoint*)(node))->write(this);
|
||||
// }
|
||||
else if(dynamic_cast<osg::PositionAttitudeTransform*>(node)){
|
||||
((ive::PositionAttitudeTransform*)(node))->write(this);
|
||||
}
|
||||
else if(dynamic_cast<osg::LightSource*>(node)){
|
||||
((ive::LightSource*)(node))->write(this);
|
||||
}
|
||||
else if(dynamic_cast<osg::Sequence*>(node)){
|
||||
((ive::Sequence*)(node))->write(this);
|
||||
}
|
||||
else if(dynamic_cast<osg::Impostor*>(node)){
|
||||
((ive::Impostor*)(node))->write(this);
|
||||
}
|
||||
else if(dynamic_cast<osg::LOD*>(node)){
|
||||
((ive::LOD*)(node))->write(this);
|
||||
}
|
||||
else if(dynamic_cast<osg::Switch*>(node)){
|
||||
((ive::Switch*)(node))->write(this);
|
||||
}
|
||||
else if(dynamic_cast<osg::OccluderNode*>(node)){
|
||||
((ive::OccluderNode*)(node))->write(this);
|
||||
}
|
||||
else if(dynamic_cast<osg::Transform*>(node)){
|
||||
((ive::Transform*)(node))->write(this);
|
||||
}
|
||||
else if(dynamic_cast<osg::Group*>(node)){
|
||||
((ive::Group*)(node))->write(this);
|
||||
}
|
||||
else if(dynamic_cast<osg::Billboard*>(node)){
|
||||
((ive::Billboard*)(node))->write(this);
|
||||
}
|
||||
else if(dynamic_cast<osg::Geode*>(node)){
|
||||
((ive::Geode*)(node))->write(this);
|
||||
}
|
||||
else
|
||||
throw Exception("Unknown node in Group::write()");
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -29,18 +29,18 @@ public:
|
||||
void writeBool(bool b);
|
||||
void writeChar(char c);
|
||||
void writeUShort(unsigned short s);
|
||||
void writeUInt(unsigned int s);
|
||||
void writeInt(int i);
|
||||
void writeFloat(float f);
|
||||
void writeLong(long l);
|
||||
void writeDouble(double d);
|
||||
void writeString(std::string s);
|
||||
void writeCharArray(char* data, int size);
|
||||
void writeVec2(osg::Vec2 v);
|
||||
void writeVec3(osg::Vec3 v);
|
||||
void writeVec4(osg::Vec4 v);
|
||||
void writeUByte4(osg::UByte4 v);
|
||||
void writeQuat(osg::Quat q);
|
||||
void writeStateSet(osg::StateSet* stateset);
|
||||
void writeVec2(const osg::Vec2& v);
|
||||
void writeVec3(const osg::Vec3& v);
|
||||
void writeVec4(const osg::Vec4& v);
|
||||
void writeUByte4(const osg::UByte4& v);
|
||||
void writeQuat(const osg::Quat& q);
|
||||
void writeBinding(osg::Geometry::AttributeBinding b);
|
||||
void writeArray(osg::Array* a);
|
||||
void writeIntArray(osg::IntArray* a);
|
||||
@ -54,6 +54,11 @@ public:
|
||||
void writeVec4Array(osg::Vec4Array* a);
|
||||
void writeMatrix(osg::Matrix mat);
|
||||
|
||||
void writeStateSet(osg::StateSet* stateset);
|
||||
void writeStateAttribute(osg::StateAttribute* sa);
|
||||
void writeDrawable(osg::Drawable* sa);
|
||||
void writeNode(osg::Node* sa);
|
||||
|
||||
// Set and get include image data in stream
|
||||
void setIncludeImageData(bool b) {_includeImageData=b;};
|
||||
bool getIncludeImageData() {return _includeImageData;};
|
||||
@ -62,10 +67,17 @@ private:
|
||||
std::ostream* _ostream;
|
||||
|
||||
// Container to map stateset uniques to their respective stateset.
|
||||
typedef std::vector<int> StateSetList;
|
||||
StateSetList _statesetList;
|
||||
typedef std::map<osg::StateSet*,int> StateSetMap;
|
||||
typedef std::map<osg::StateAttribute*,int> StateAttributeMap;
|
||||
typedef std::map<osg::Drawable*,int> DrawableMap;
|
||||
typedef std::map<osg::Node*,int> NodeMap;
|
||||
|
||||
bool _includeImageData;
|
||||
StateSetMap _stateSetMap;
|
||||
StateAttributeMap _stateAttributeMap;
|
||||
DrawableMap _drawableMap;
|
||||
NodeMap _nodeMap;
|
||||
|
||||
bool _includeImageData;
|
||||
|
||||
};
|
||||
|
||||
|
@ -33,16 +33,23 @@ void Drawable::write(DataOutputStream* out){
|
||||
|
||||
// Write Drawable's properties.
|
||||
|
||||
// Write stateset.
|
||||
out->writeInt((int)getStateSet());
|
||||
if(getStateSet())
|
||||
out->writeStateSet(getStateSet());
|
||||
// Write stateset if any
|
||||
if (getStateSet())
|
||||
{
|
||||
out->writeInt(1); //true we have a stateset
|
||||
out->writeStateSet(getStateSet());
|
||||
}
|
||||
else
|
||||
out->writeInt(0); //false we don't have a stateset
|
||||
|
||||
// Write shape
|
||||
out->writeInt((int)getShape());
|
||||
if (getShape()){
|
||||
//static_cast<Shape*>(getShape())->write(out);
|
||||
}
|
||||
if (getShape())
|
||||
{
|
||||
out->writeInt(1); //true we have a shape
|
||||
//static_cast<Shape*>(getShape())->write(out);
|
||||
}
|
||||
else
|
||||
out->writeInt(0); //false we don't have a shape
|
||||
|
||||
// Write support display list.
|
||||
out->writeBool(getSupportsDisplayList());
|
||||
|
@ -6,18 +6,22 @@ CXXFILES =\
|
||||
AnimationPathCallback.cpp\
|
||||
Billboard.cpp\
|
||||
BlendFunc.cpp\
|
||||
ConvexPlanarOccluder.cpp\
|
||||
ConvexPlanarPolygon.cpp\
|
||||
CullFace.cpp\
|
||||
DataInputStream.cpp\
|
||||
DataOutputStream.cpp\
|
||||
DrawArrayLengths.cpp\
|
||||
DrawArrays.cpp\
|
||||
DrawElementsUShort.cpp\
|
||||
DrawElementsUInt.cpp\
|
||||
Drawable.cpp\
|
||||
Exception.cpp\
|
||||
Geode.cpp\
|
||||
Geometry.cpp\
|
||||
Group.cpp\
|
||||
Image.cpp\
|
||||
Impostor.cpp\
|
||||
LOD.cpp\
|
||||
Light.cpp\
|
||||
LightSource.cpp\
|
||||
@ -25,9 +29,14 @@ CXXFILES =\
|
||||
MatrixTransform.cpp\
|
||||
Node.cpp\
|
||||
Object.cpp\
|
||||
OccluderNode.cpp\
|
||||
PositionAttitudeTransform.cpp\
|
||||
PolygonOffset.cpp\
|
||||
Point.cpp\
|
||||
PrimitiveSet.cpp\
|
||||
Sequence.cpp\
|
||||
ShadeModel.cpp\
|
||||
Switch.cpp\
|
||||
StateSet.cpp\
|
||||
TexEnv.cpp\
|
||||
TexEnvCombine.cpp\
|
||||
|
@ -1,15 +1,15 @@
|
||||
/**********************************************************************
|
||||
*
|
||||
* FILE: Geode.cpp
|
||||
* FILE: Geode.cpp
|
||||
*
|
||||
* DESCRIPTION: Read/Write osg::Geode in binary format to disk.
|
||||
* DESCRIPTION: Read/Write osg::Geode in binary format to disk.
|
||||
*
|
||||
* CREATED BY: Auto generated by iveGenerated
|
||||
* and later modified by Rune Schmidt Jensen.
|
||||
* CREATED BY: Auto generated by iveGenerated
|
||||
* and later modified by Rune Schmidt Jensen.
|
||||
*
|
||||
* HISTORY: Created 18.3.2003
|
||||
* HISTORY: Created 18.3.2003
|
||||
*
|
||||
* Copyright 2003 VR-C
|
||||
* Copyright 2003 VR-C
|
||||
**********************************************************************/
|
||||
|
||||
#include "Exception.h"
|
||||
@ -23,64 +23,71 @@
|
||||
using namespace ive;
|
||||
|
||||
void Geode::write(DataOutputStream* out){
|
||||
// Write Geode's identification.
|
||||
out->writeInt(IVEGEODE);
|
||||
// If the osg class is inherited by any other class we should also write this to file.
|
||||
osg::Node* node = dynamic_cast<osg::Node*>(this);
|
||||
if(node){
|
||||
((ive::Node*)(node))->write(out);
|
||||
}
|
||||
else
|
||||
throw Exception("Geode::write(): Could not cast this osg::Geode to an osg::Node.");
|
||||
// Write Geode's identification.
|
||||
out->writeInt(IVEGEODE);
|
||||
// If the osg class is inherited by any other class we should also write this to file.
|
||||
osg::Node* node = dynamic_cast<osg::Node*>(this);
|
||||
if(node){
|
||||
((ive::Node*)(node))->write(out);
|
||||
}
|
||||
else
|
||||
throw Exception("Geode::write(): Could not cast this osg::Geode to an osg::Node.");
|
||||
|
||||
|
||||
// Write Geode's properties.
|
||||
// Write Geode's properties.
|
||||
|
||||
// Write number of drawables.
|
||||
out->writeInt(getNumDrawables());
|
||||
// Write out every drawable.
|
||||
for(unsigned int i=0;i<getNumDrawables();i++){
|
||||
osg::Drawable* drawable = getDrawable(i);
|
||||
if(dynamic_cast<osg::Geometry*>(drawable))
|
||||
((ive::Geometry*)(drawable))->write(out);
|
||||
else{
|
||||
throw Exception("Unknown drawable in Geode::write()");
|
||||
}
|
||||
// Write number of drawables.
|
||||
out->writeInt(getNumDrawables());
|
||||
// Write out every drawable.
|
||||
for(unsigned int i=0;i<getNumDrawables();i++){
|
||||
osg::Drawable* drawable = getDrawable(i);
|
||||
#if 0
|
||||
if(dynamic_cast<osg::Geometry*>(drawable))
|
||||
((ive::Geometry*)(drawable))->write(out);
|
||||
else{
|
||||
throw Exception("Unknown drawable in Geode::write()");
|
||||
}
|
||||
#else
|
||||
out->writeDrawable(drawable);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
void Geode::read(DataInputStream* in){
|
||||
// Read Geode's identification.
|
||||
int id = in->peekInt();
|
||||
if(id == IVEGEODE){
|
||||
// Code to read Geode's properties.
|
||||
id = in->readInt();
|
||||
// If the osg class is inherited by any other class we should also read this from file.
|
||||
osg::Node* node = dynamic_cast<osg::Node*>(this);
|
||||
if(node){
|
||||
((ive::Node*)(node))->read(in);
|
||||
}
|
||||
else
|
||||
throw Exception("Geode::read(): Could not cast this osg::Geode to an osg::Node.");
|
||||
// Read Geode's identification.
|
||||
int id = in->peekInt();
|
||||
if(id == IVEGEODE){
|
||||
// Code to read Geode's properties.
|
||||
id = in->readInt();
|
||||
// If the osg class is inherited by any other class we should also read this from file.
|
||||
osg::Node* node = dynamic_cast<osg::Node*>(this);
|
||||
if(node){
|
||||
((ive::Node*)(node))->read(in);
|
||||
}
|
||||
else
|
||||
throw Exception("Geode::read(): Could not cast this osg::Geode to an osg::Node.");
|
||||
|
||||
|
||||
// Read number of drawables.
|
||||
int size = in->readInt();
|
||||
// Read the drawables.
|
||||
for(int i = 0; i<size; i++){
|
||||
int id = in->peekInt();
|
||||
osg::Drawable* drawable;
|
||||
if(id == IVEGEOMETRY){
|
||||
drawable = new osg::Geometry();
|
||||
((Geometry*)(drawable))->read(in);
|
||||
addDrawable(drawable);
|
||||
}
|
||||
else
|
||||
throw Exception("Unknown drawable identification in Geode::read()");
|
||||
|
||||
}
|
||||
}
|
||||
else{
|
||||
throw Exception("Geode::read(): Expected Geode identification.");
|
||||
}
|
||||
// Read number of drawables.
|
||||
int size = in->readInt();
|
||||
// Read the drawables.
|
||||
for(int i = 0; i<size; i++){
|
||||
#if 0
|
||||
int id = in->peekInt();
|
||||
osg::Drawable* drawable;
|
||||
if(id == IVEGEOMETRY){
|
||||
drawable = new osg::Geometry();
|
||||
((Geometry*)(drawable))->read(in);
|
||||
addDrawable(drawable);
|
||||
}
|
||||
else
|
||||
throw Exception("Unknown drawable identification in Geode::read()");
|
||||
#else
|
||||
addDrawable(in->readDrawable());
|
||||
#endif
|
||||
}
|
||||
}
|
||||
else{
|
||||
throw Exception("Geode::read(): Expected Geode identification.");
|
||||
}
|
||||
}
|
||||
|
@ -18,6 +18,7 @@
|
||||
#include "DrawArrays.h"
|
||||
#include "DrawArrayLengths.h"
|
||||
#include "DrawElementsUShort.h"
|
||||
#include "DrawElementsUInt.h"
|
||||
|
||||
using namespace ive;
|
||||
|
||||
@ -46,61 +47,64 @@ void Geometry::write(DataOutputStream* out){
|
||||
((ive::DrawArrayLengths*)(getPrimitiveSet(i)))->write(out);
|
||||
else if(dynamic_cast<osg::DrawElementsUShort*>(getPrimitiveSet(i)))
|
||||
((ive::DrawElementsUShort*)(getPrimitiveSet(i)))->write(out);
|
||||
else if(dynamic_cast<osg::DrawElementsUInt*>(getPrimitiveSet(i)))
|
||||
((ive::DrawElementsUInt*)(getPrimitiveSet(i)))->write(out);
|
||||
else
|
||||
throw Exception("Unknown PrimitivSet in Geometry::write()");
|
||||
}
|
||||
|
||||
// Write vertex array if any
|
||||
out->writeInt((int)getVertexArray());
|
||||
if (getVertexArray()){
|
||||
out->writeVec3Array(getVertexArray());
|
||||
out->writeLong((long)getVertexArray());
|
||||
if (getVertexArray())
|
||||
{
|
||||
out->writeArray(getVertexArray());
|
||||
}
|
||||
// Write vertex indices if any
|
||||
out->writeInt((int)getVertexIndices());
|
||||
out->writeLong((long)getVertexIndices());
|
||||
if (getVertexIndices()){
|
||||
out->writeArray(getVertexIndices());
|
||||
}
|
||||
// Write normal array if any
|
||||
out->writeInt((int)getNormalArray());
|
||||
out->writeLong((long)getNormalArray());
|
||||
if (getNormalArray()){
|
||||
out->writeBinding(getNormalBinding());
|
||||
out->writeVec3Array(getNormalArray());
|
||||
}
|
||||
// Write normal indices if any
|
||||
out->writeInt((int)getNormalIndices());
|
||||
out->writeLong((long)getNormalIndices());
|
||||
if (getNormalIndices()){
|
||||
out->writeArray(getNormalIndices());
|
||||
}
|
||||
// Write color array if any.
|
||||
out->writeInt((int)getColorArray());
|
||||
out->writeLong((long)getColorArray());
|
||||
if (getColorArray()){
|
||||
out->writeBinding(getColorBinding());
|
||||
out->writeArray(getColorArray());
|
||||
}
|
||||
// Write color indices if any
|
||||
out->writeInt((int)getColorIndices());
|
||||
out->writeLong((long)getColorIndices());
|
||||
if (getColorIndices()){
|
||||
out->writeArray(getColorIndices());
|
||||
}
|
||||
// Write secondary color array if any
|
||||
out->writeInt((int)getSecondaryColorArray());
|
||||
out->writeLong((long)getSecondaryColorArray());
|
||||
if (getSecondaryColorArray()){
|
||||
out->writeBinding(getSecondaryColorBinding());
|
||||
out->writeArray(getSecondaryColorArray());
|
||||
}
|
||||
// Write second color indices if any
|
||||
out->writeInt((int)getSecondaryColorIndices());
|
||||
out->writeLong((long)getSecondaryColorIndices());
|
||||
if (getSecondaryColorIndices()){
|
||||
out->writeArray(getSecondaryColorIndices());
|
||||
}
|
||||
// Write fog coord array if any
|
||||
out->writeInt((int)getFogCoordArray());
|
||||
out->writeLong((long)getFogCoordArray());
|
||||
if (getFogCoordArray()){
|
||||
out->writeBinding(getFogCoordBinding());
|
||||
out->writeArray(getFogCoordArray());
|
||||
}
|
||||
// Write fog coord indices if any
|
||||
out->writeInt((int)getFogCoordIndices());
|
||||
out->writeLong((long)getFogCoordIndices());
|
||||
if (getFogCoordIndices()){
|
||||
out->writeArray(getFogCoordIndices());
|
||||
}
|
||||
@ -159,6 +163,11 @@ void Geometry::read(DataInputStream* in){
|
||||
((ive::DrawElementsUShort*)(prim))->read(in);
|
||||
addPrimitiveSet(prim);
|
||||
}
|
||||
else if(primID==IVEDRAWELEMENTSUINT){
|
||||
prim = new osg::DrawElementsUInt();
|
||||
((ive::DrawElementsUInt*)(prim))->read(in);
|
||||
addPrimitiveSet(prim);
|
||||
}
|
||||
else{
|
||||
throw Exception("Unkown PrimitiveSet in Geometry::read()");
|
||||
}
|
||||
@ -167,7 +176,7 @@ void Geometry::read(DataInputStream* in){
|
||||
// Read vertex array if any
|
||||
int va=in->readInt();
|
||||
if (va){
|
||||
setVertexArray(in->readVec3Array());
|
||||
setVertexArray(in->readArray());
|
||||
}
|
||||
// Read vertex indices if any
|
||||
int vi = in->readInt();
|
||||
|
@ -1,15 +1,15 @@
|
||||
/**********************************************************************
|
||||
*
|
||||
* FILE: Group.cpp
|
||||
* FILE: Group.cpp
|
||||
*
|
||||
* DESCRIPTION: Read/Write osg::Group in binary format to disk.
|
||||
* DESCRIPTION: Read/Write osg::Group in binary format to disk.
|
||||
*
|
||||
* CREATED BY: Auto generated by iveGenerated
|
||||
* and later modified by Rune Schmidt Jensen.
|
||||
* CREATED BY: Auto generated by iveGenerated
|
||||
* and later modified by Rune Schmidt Jensen.
|
||||
*
|
||||
* HISTORY: Created 17.3.2003
|
||||
* HISTORY: Created 17.3.2003
|
||||
*
|
||||
* Copyright 2003 VR-C
|
||||
* Copyright 2003 VR-C
|
||||
**********************************************************************/
|
||||
|
||||
#include "Exception.h"
|
||||
@ -28,138 +28,54 @@
|
||||
using namespace ive;
|
||||
|
||||
void Group::write(DataOutputStream* out){
|
||||
// Write Group's identification.
|
||||
out->writeInt(IVEGROUP);
|
||||
// If the osg class is inherited by any other class we should also write this to file.
|
||||
osg::Node* node = dynamic_cast<osg::Node*>(this);
|
||||
if(node){
|
||||
static_cast<ive::Node*>(node)->write(out);
|
||||
}
|
||||
else
|
||||
throw Exception("Group::write(): Could not cast this osg::Group to an osg::Node.");
|
||||
// Write Group's identification.
|
||||
out->writeInt(IVEGROUP);
|
||||
// If the osg class is inherited by any other class we should also write this to file.
|
||||
osg::Node* node = dynamic_cast<osg::Node*>(this);
|
||||
if(node){
|
||||
static_cast<ive::Node*>(node)->write(out);
|
||||
}
|
||||
else
|
||||
throw Exception("Group::write(): Could not cast this osg::Group to an osg::Node.");
|
||||
|
||||
// Write Group's properties.
|
||||
// Write Group's properties.
|
||||
|
||||
// Write number of children.
|
||||
out->writeInt(getNumChildren());
|
||||
// Write children.
|
||||
// Write number of children.
|
||||
out->writeInt(getNumChildren());
|
||||
// Write children.
|
||||
for(unsigned int i=0; i<getNumChildren(); i++){
|
||||
osg::Node* child = getChild(i);
|
||||
if(dynamic_cast<osg::MatrixTransform*>(child)){
|
||||
((ive::MatrixTransform*)(child))->write(out);
|
||||
}
|
||||
// else if(dynamic_cast<osgfIVE::ViewPoint*>(child)){
|
||||
// ((ive::ViewPoint*)(child))->write(out);
|
||||
// }
|
||||
else if(dynamic_cast<osg::PositionAttitudeTransform*>(child)){
|
||||
((ive::PositionAttitudeTransform*)(child))->write(out);
|
||||
}
|
||||
else if(dynamic_cast<osg::LightSource*>(child)){
|
||||
((ive::LightSource*)(child))->write(out);
|
||||
}
|
||||
else if(dynamic_cast<osg::Sequence*>(child)){
|
||||
((ive::Sequence*)(child))->write(out);
|
||||
}
|
||||
else if(dynamic_cast<osg::LOD*>(child)){
|
||||
((ive::LOD*)(child))->write(out);
|
||||
}
|
||||
else if(dynamic_cast<osg::Transform*>(child)){
|
||||
((ive::Transform*)(child))->write(out);
|
||||
}
|
||||
else if(dynamic_cast<osg::Group*>(child)){
|
||||
((ive::Group*)(child))->write(out);
|
||||
}
|
||||
else if(dynamic_cast<osg::Billboard*>(child)){
|
||||
((ive::Billboard*)(child))->write(out);
|
||||
}
|
||||
else if(dynamic_cast<osg::Geode*>(child)){
|
||||
((ive::Geode*)(child))->write(out);
|
||||
}
|
||||
else
|
||||
throw Exception("Unknown child in Group::write()");
|
||||
osg::Node* child = getChild(i);
|
||||
out->writeNode(child);
|
||||
}
|
||||
}
|
||||
|
||||
void Group::read(DataInputStream* in){
|
||||
// Read Group's identification.
|
||||
int id = in->peekInt();
|
||||
if(id == IVEGROUP){
|
||||
// Read Group's identification.
|
||||
id = in->readInt();
|
||||
// Read Group's identification.
|
||||
int id = in->peekInt();
|
||||
if(id == IVEGROUP){
|
||||
// Read Group's identification.
|
||||
id = in->readInt();
|
||||
|
||||
// If the osg class is inherited by any other class we should also read this from file.
|
||||
osg::Node* node = dynamic_cast<osg::Node*>(this);
|
||||
if(node){
|
||||
((ive::Node*)(node))->read(in);
|
||||
}
|
||||
else
|
||||
throw Exception("Group::read(): Could not cast this osg::Group to an osg::Node.");
|
||||
// If the osg class is inherited by any other class we should also read this from file.
|
||||
osg::Node* node = dynamic_cast<osg::Node*>(this);
|
||||
if(node){
|
||||
((ive::Node*)(node))->read(in);
|
||||
}
|
||||
else
|
||||
throw Exception("Group::read(): Could not cast this osg::Group to an osg::Node.");
|
||||
|
||||
|
||||
// Read groups properties.
|
||||
// Read groups properties.
|
||||
|
||||
// Read number of children.
|
||||
int size = in->readInt();
|
||||
// Read children.
|
||||
for(int i=0; i<size; i++){
|
||||
int id = in->peekInt();
|
||||
osg::Node* child;
|
||||
if(id == IVEMATRIXTRANSFORM){
|
||||
child = new osg::MatrixTransform();
|
||||
((ive::MatrixTransform*)(child))->read(in);
|
||||
addChild(child);
|
||||
}
|
||||
// else if(id == IVEVIEWPOINT){
|
||||
// child = new osgfIVE::ViewPoint();
|
||||
// ((ive::ViewPoint*)(child))->read(in);
|
||||
// addChild(child);
|
||||
// }
|
||||
else if(id == IVEPOSITIONATTITUDETRANSFORM){
|
||||
child = new osg::PositionAttitudeTransform();
|
||||
((ive::PositionAttitudeTransform*)(child))->read(in);
|
||||
addChild(child);
|
||||
}
|
||||
else if(id == IVELIGHTSOURCE){
|
||||
child = new osg::LightSource();
|
||||
((ive::LightSource*)(child))->read(in);
|
||||
addChild(child);
|
||||
}
|
||||
else if(id == IVESEQUENCE){
|
||||
child = new osg::Sequence();
|
||||
((ive::Sequence*)(child))->read(in);
|
||||
addChild(child);
|
||||
}
|
||||
else if(id == IVELOD){
|
||||
child = new osg::LOD();
|
||||
((ive::LOD*)(child))->read(in);
|
||||
addChild(child);
|
||||
}
|
||||
else if(id == IVETRANSFORM){
|
||||
child = new osg::Transform();
|
||||
((ive::Transform*)(child))->read(in);
|
||||
addChild(child);
|
||||
}
|
||||
else if(id == IVEGROUP){
|
||||
child = new osg::Group();
|
||||
((ive::Group*)(child))->read(in);
|
||||
addChild(child);
|
||||
}
|
||||
else if(id == IVEBILLBOARD){
|
||||
child = new osg::Billboard();
|
||||
((ive::Billboard*)(child))->read(in);
|
||||
addChild(child);
|
||||
}
|
||||
else if(id == IVEGEODE){
|
||||
child = new osg::Geode();
|
||||
((ive::Geode*)(child))->read(in);
|
||||
addChild(child);
|
||||
}
|
||||
else{
|
||||
throw Exception("Unknown child identification in Group::read()");
|
||||
}
|
||||
}
|
||||
}
|
||||
else{
|
||||
throw Exception("Group::read(): Expected Group identification");
|
||||
}
|
||||
// Read number of children.
|
||||
int size = in->readInt();
|
||||
// Read children.
|
||||
for(int i=0; i<size; i++)
|
||||
{
|
||||
addChild(in->readNode());
|
||||
}
|
||||
}
|
||||
else{
|
||||
throw Exception("Group::read(): Expected Group identification");
|
||||
}
|
||||
}
|
||||
|
@ -1,15 +1,15 @@
|
||||
/**********************************************************************
|
||||
*
|
||||
* FILE: Image.cpp
|
||||
* FILE: Image.cpp
|
||||
*
|
||||
* DESCRIPTION: Read/Write osg::Image in binary format to disk.
|
||||
* DESCRIPTION: Read/Write osg::Image in binary format to disk.
|
||||
*
|
||||
* CREATED BY: Auto generated by iveGenerated
|
||||
* and later modified by Rune Schmidt Jensen.
|
||||
* CREATED BY: Auto generated by iveGenerated
|
||||
* and later modified by Rune Schmidt Jensen.
|
||||
*
|
||||
* HISTORY: Created 20.3.2003
|
||||
* HISTORY: Created 20.3.2003
|
||||
*
|
||||
* Copyright 2003 VR-C
|
||||
* Copyright 2003 VR-C
|
||||
**********************************************************************/
|
||||
|
||||
#include "Exception.h"
|
||||
@ -18,104 +18,125 @@
|
||||
|
||||
using namespace ive;
|
||||
|
||||
void Image::write(DataOutputStream* out){
|
||||
// Write Image's identification.
|
||||
out->writeInt(IVEIMAGE);
|
||||
// If the osg class is inherited by any other class we should also write this to file.
|
||||
osg::Object* obj = dynamic_cast<osg::Object*>(this);
|
||||
if(obj){
|
||||
((ive::Object*)(obj))->write(out);
|
||||
}
|
||||
else
|
||||
throw Exception("Image::write(): Could not cast this osg::Image to an osg::Object.");
|
||||
// Write Image's properties.
|
||||
void Image::write(DataOutputStream* out)
|
||||
{
|
||||
// Write Image's identification.
|
||||
out->writeInt(IVEIMAGE);
|
||||
// If the osg class is inherited by any other class we should also write this to file.
|
||||
osg::Object* obj = dynamic_cast<osg::Object*>(this);
|
||||
if(obj){
|
||||
((ive::Object*)(obj))->write(out);
|
||||
}
|
||||
else
|
||||
throw Exception("Image::write(): Could not cast this osg::Image to an osg::Object.");
|
||||
// Write Image's properties.
|
||||
|
||||
// Write name
|
||||
out->writeString(getFileName());
|
||||
// Write name
|
||||
out->writeString(getFileName());
|
||||
|
||||
// Write width, height, depth of image.
|
||||
out->writeInt(s());
|
||||
out->writeInt(t());
|
||||
out->writeInt(r());
|
||||
// Write width, height, depth of image.
|
||||
out->writeInt(s());
|
||||
out->writeInt(t());
|
||||
out->writeInt(r());
|
||||
|
||||
// Write formats, type and packing
|
||||
|
||||
std::cout << getFileName()<<"\t"<<s()<<"\t"<<t()<<std::endl;
|
||||
|
||||
// Write formats, type and packing
|
||||
out->writeInt(getInternalTextureFormat());
|
||||
out->writeInt(getPixelFormat());
|
||||
out->writeInt(getDataType());
|
||||
out->writeInt(getPacking());
|
||||
out->writeInt(getPixelFormat());
|
||||
out->writeInt(getDataType());
|
||||
out->writeInt(getPacking());
|
||||
|
||||
// Write modified tag.
|
||||
out->writeInt(getModifiedTag());
|
||||
// Write modified tag.
|
||||
out->writeInt(getModifiedTag());
|
||||
|
||||
// Write mipmapdata vector
|
||||
int size = _mipmapData.size();
|
||||
out->writeInt(size);
|
||||
for(int i=0;i<size;i++)
|
||||
out->writeInt(_mipmapData[i]);
|
||||
// Write mipmapdata vector
|
||||
int size = _mipmapData.size();
|
||||
out->writeInt(size);
|
||||
for(int i=0;i<size;i++)
|
||||
out->writeInt(_mipmapData[i]);
|
||||
|
||||
// Write image data if any
|
||||
out->writeInt((int)data());
|
||||
if(data()){
|
||||
// Compute the size of image data and write this.
|
||||
unsigned int size = computeRowWidthInBytes(s(),getPixelFormat(),getDataType(),getPacking())*t()*r();
|
||||
out->writeInt(size);
|
||||
// Write the data
|
||||
out->writeCharArray((char*)data(), size);
|
||||
}
|
||||
// Write image data if any
|
||||
out->writeLong((long)data());
|
||||
if(data()){
|
||||
// Compute the size of image data and write this.
|
||||
unsigned int size = getTotalSizeInBytesIncludingMipmaps();
|
||||
out->writeInt(size);
|
||||
// Write the data
|
||||
out->writeCharArray((char*)data(), size);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void Image::read(DataInputStream* in){
|
||||
// Peek Image's identification.
|
||||
int id = in->peekInt();
|
||||
if(id == IVEIMAGE){
|
||||
// Read Image's identification.
|
||||
id = in->readInt();
|
||||
// If the osg class is inherited by any other class we should also read this from file.
|
||||
osg::Object* obj = dynamic_cast<osg::Object*>(this);
|
||||
if(obj){
|
||||
((ive::Object*)(obj))->read(in);
|
||||
}
|
||||
else
|
||||
throw Exception("Image::read(): Could not cast this osg::Image to an osg::Object.");
|
||||
// Read Image's properties.
|
||||
void Image::read(DataInputStream* in)
|
||||
{
|
||||
// Peek Image's identification.
|
||||
int id = in->peekInt();
|
||||
if(id == IVEIMAGE){
|
||||
// Read Image's identification.
|
||||
id = in->readInt();
|
||||
// If the osg class is inherited by any other class we should also read this from file.
|
||||
osg::Object* obj = dynamic_cast<osg::Object*>(this);
|
||||
if(obj){
|
||||
((ive::Object*)(obj))->read(in);
|
||||
}
|
||||
else
|
||||
throw Exception("Image::read(): Could not cast this osg::Image to an osg::Object.");
|
||||
// Read Image's properties.
|
||||
|
||||
// Read name
|
||||
setFileName(in->readString());
|
||||
// Read name
|
||||
setFileName(in->readString());
|
||||
|
||||
// Read width, height, depth of image.
|
||||
int s=in->readInt();
|
||||
int t=in->readInt();
|
||||
int r=in->readInt();
|
||||
// Read width, height, depth of image.
|
||||
int is=in->readInt();
|
||||
int it=in->readInt();
|
||||
int ir=in->readInt();
|
||||
|
||||
// Read formats, type and packing
|
||||
// Read formats, type and packing
|
||||
GLint internalTextureFormat = (GLint) in->readInt();
|
||||
GLenum pixelFormat = (GLenum) in->readInt();
|
||||
GLenum pixelFormat = (GLenum) in->readInt();
|
||||
GLenum dataType = (GLenum) in->readInt();;
|
||||
unsigned int packing = (unsigned int)in->readInt();
|
||||
|
||||
// Read modified tag.
|
||||
// Read modified tag.
|
||||
setModifiedTag((unsigned int)in->readInt());
|
||||
|
||||
// Read mipmapdata vector
|
||||
int size = in->readInt();
|
||||
_mipmapData.resize(size);
|
||||
for(int i=0;i<size;i++)
|
||||
_mipmapData[i]=(unsigned int)in->readInt();
|
||||
// Read mipmapdata vector
|
||||
int size = in->readInt();
|
||||
_mipmapData.resize(size);
|
||||
|
||||
// Read image data if any
|
||||
if(in->readInt()){
|
||||
unsigned int dataSize = (unsigned int)in->readInt();
|
||||
//char* data = (char*)malloc (dataSize);
|
||||
char* data = new char[dataSize];
|
||||
if(!data)
|
||||
throw Exception("Image::read(): Unable to allocate memory for image data.");
|
||||
in->readCharArray(data,dataSize);
|
||||
setImage(s, t, r, internalTextureFormat, pixelFormat,
|
||||
dataType, (unsigned char* ) data, osg::Image::USE_NEW_DELETE, packing);
|
||||
}
|
||||
}
|
||||
else{
|
||||
throw Exception("Image::read(): Expected Image identification.");
|
||||
}
|
||||
//if (size) std::cout<<"is mip mapped ";
|
||||
|
||||
for(int i=0;i<size;i++)
|
||||
{
|
||||
_mipmapData[i]=(unsigned int)in->readInt();
|
||||
//std::cout<<_mipmapData[i]<<"\t";
|
||||
}
|
||||
//std::cout<<std::endl;
|
||||
|
||||
|
||||
// Read image data if any
|
||||
if(in->readInt()){
|
||||
unsigned int dataSize = (unsigned int)in->readInt();
|
||||
|
||||
//static int totalSize = 0;
|
||||
|
||||
//totalSize += dataSize;
|
||||
//std::cout<<getFileName()<<" "<<is<<" "<<it<<std::endl;
|
||||
//std::cout<<" dataSize = "<<dataSize<<"\tTotalSize = "<<totalSize<<std::endl;
|
||||
|
||||
|
||||
//char* data = (char*)malloc (dataSize);
|
||||
char* data = new char[dataSize];
|
||||
if(!data)
|
||||
throw Exception("Image::read(): Unable to allocate memory for image data.");
|
||||
in->readCharArray(data,dataSize);
|
||||
setImage(is, it, ir, internalTextureFormat, pixelFormat,
|
||||
dataType, (unsigned char* ) data, osg::Image::USE_NEW_DELETE, packing);
|
||||
}
|
||||
}
|
||||
else{
|
||||
throw Exception("Image::read(): Expected Image identification.");
|
||||
}
|
||||
}
|
||||
|
@ -32,7 +32,7 @@ void LightSource::write(DataOutputStream* out){
|
||||
// Write LightSource's properties.
|
||||
|
||||
// Write out light
|
||||
out->writeInt((int)getLight());
|
||||
out->writeLong((long)getLight());
|
||||
if(getLight()){
|
||||
((ive::Light*)(getLight()))->write(out);
|
||||
}
|
||||
|
@ -51,7 +51,7 @@ void Node::write(DataOutputStream* out){
|
||||
out->writeString(desc[i]);
|
||||
}
|
||||
// Write Stateset if any
|
||||
out->writeInt((int) getStateSet());
|
||||
out->writeLong((long) getStateSet());
|
||||
if(getStateSet())
|
||||
out->writeStateSet(getStateSet());
|
||||
|
||||
@ -59,7 +59,7 @@ void Node::write(DataOutputStream* out){
|
||||
// Write UpdateCallback if any
|
||||
osg::NodeCallback* nc = getUpdateCallback();
|
||||
if(nc && dynamic_cast<osg::AnimationPathCallback*>(nc)){
|
||||
out->writeInt((int)nc);
|
||||
out->writeLong((long)nc);
|
||||
((ive::AnimationPathCallback*)(nc))->write(out);
|
||||
}
|
||||
else
|
||||
|
@ -7,59 +7,68 @@
|
||||
namespace ive {
|
||||
|
||||
// Objects and Nodes
|
||||
#define IVEOBJECT 0x00000001
|
||||
#define IVENODE 0x00000002
|
||||
#define IVEGROUP 0x00000003
|
||||
#define IVEMATRIXTRANSFORM 0x00000004
|
||||
#define IVESTATESET 0x00000005
|
||||
#define IVEGEODE 0x00000006
|
||||
#define IVEIMAGE 0x00000007
|
||||
#define IVELIGHTSOURCE 0x00000008
|
||||
#define IVELIGHT 0x00000009
|
||||
#define IVEBILLBOARD 0x00000010
|
||||
#define IVELOD 0x00000011
|
||||
#define IVESEQUENCE 0x00000012
|
||||
#define IVETRANSFORM 0x00000013
|
||||
#define IVEPOSITIONATTITUDETRANSFORM 0x00000014
|
||||
#define IVEANIMATIONPATH 0x00000015
|
||||
#define IVEOBJECT 0x00000001
|
||||
#define IVENODE 0x00000002
|
||||
#define IVEGROUP 0x00000003
|
||||
#define IVEMATRIXTRANSFORM 0x00000004
|
||||
#define IVESTATESET 0x00000005
|
||||
#define IVEGEODE 0x00000006
|
||||
#define IVEIMAGE 0x00000007
|
||||
#define IVELIGHTSOURCE 0x00000008
|
||||
#define IVELIGHT 0x00000009
|
||||
#define IVEBILLBOARD 0x00000010
|
||||
#define IVELOD 0x00000011
|
||||
#define IVESEQUENCE 0x00000012
|
||||
#define IVETRANSFORM 0x00000013
|
||||
#define IVEPOSITIONATTITUDETRANSFORM 0x00000014
|
||||
#define IVEANIMATIONPATH 0x00000015
|
||||
#define IVESWITCH 0x00000016
|
||||
#define IVEOCCLUDERNODE 0x00000017
|
||||
#define IVEIMPOSTOR 0x00000018
|
||||
#define IVECONVEXPLANAROCCLUDER 0x00000019
|
||||
#define IVECONVEXPLANARPOLYGON 0x00000020
|
||||
|
||||
// Node callbacks
|
||||
#define IVENODECALLBACK 0x00000050
|
||||
#define IVEANIMATIONPATHCALLBACK 0x00000051
|
||||
#define IVENODECALLBACK 0x00000050
|
||||
#define IVEANIMATIONPATHCALLBACK 0x00000051
|
||||
|
||||
// State attributes.
|
||||
#define IVESTATEATTRIBUTE 0x00000100
|
||||
#define IVEALPHAFUNC 0x00000101
|
||||
#define IVEBLENDFUNC 0x00000102
|
||||
#define IVEMATERIAL 0x00000110
|
||||
#define IVETEXTURE 0x00000120
|
||||
#define IVETEXTURE1D 0x00000121
|
||||
#define IVETEXTURE2D 0x00000122
|
||||
#define IVETEXTURE3D 0x00000123
|
||||
#define IVETEXTURECUBEMAP 0x00000124
|
||||
#define IVETEXENV 0x00000125
|
||||
#define IVETEXENVCOMBINE 0x00000126
|
||||
#define IVETEXGEN 0x00000127
|
||||
#define IVECULLFACE 0x00000128
|
||||
#define IVESTATEATTRIBUTE 0x00000100
|
||||
#define IVEALPHAFUNC 0x00000101
|
||||
#define IVEBLENDFUNC 0x00000102
|
||||
#define IVEMATERIAL 0x00000110
|
||||
#define IVETEXTURE 0x00000120
|
||||
#define IVETEXTURE1D 0x00000121
|
||||
#define IVETEXTURE2D 0x00000122
|
||||
#define IVETEXTURE3D 0x00000123
|
||||
#define IVETEXTURECUBEMAP 0x00000124
|
||||
#define IVETEXENV 0x00000125
|
||||
#define IVETEXENVCOMBINE 0x00000126
|
||||
#define IVETEXGEN 0x00000127
|
||||
#define IVECULLFACE 0x00000128
|
||||
#define IVEPOLYGONOFFSET 0x00000129
|
||||
#define IVESHADEMODEL 0x0000012A
|
||||
#define IVEPOINT 0x0000012B
|
||||
|
||||
// Drawables
|
||||
#define IVEDRAWABLE 0x00001000
|
||||
#define IVEGEOMETRY 0x00001001
|
||||
#define IVEDRAWABLE 0x00001000
|
||||
#define IVEGEOMETRY 0x00001001
|
||||
|
||||
// Primitive set
|
||||
#define IVEPRIMITIVESET 0x00010000
|
||||
#define IVEDRAWARRAYS 0x00010001
|
||||
#define IVEDRAWARRAYLENGTHS 0x00010002
|
||||
#define IVEDRAWELEMENTSUSHORT 0x00010003
|
||||
#define IVEPRIMITIVESET 0x00010000
|
||||
#define IVEDRAWARRAYS 0x00010001
|
||||
#define IVEDRAWARRAYLENGTHS 0x00010002
|
||||
#define IVEDRAWELEMENTSUSHORT 0x00010003
|
||||
#define IVEDRAWELEMENTSUINT 0x00010004
|
||||
|
||||
// Our own classes
|
||||
#define IVEVIEWPOINT 0x00100001
|
||||
#define IVEVIEWPOINT 0x00100001
|
||||
|
||||
class ReadWrite{
|
||||
|
||||
public:
|
||||
virtual void write(DataOutputStream* out) const = 0;
|
||||
virtual void read(DataInputStream* out) const = 0;
|
||||
virtual void write(DataOutputStream* out) const = 0;
|
||||
virtual void read(DataInputStream* out) const = 0;
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -32,26 +32,9 @@ class IVEReaderWriter : public ReaderWriter
|
||||
{
|
||||
try{
|
||||
// Create datainputstream.
|
||||
ive::DataInputStream* in = new ive::DataInputStream(&fin);
|
||||
ive::DataInputStream in(&fin);
|
||||
|
||||
// Which object is written first in the stream.
|
||||
int id = in->peekInt();
|
||||
|
||||
if(id==IVEMATRIXTRANSFORM)
|
||||
{
|
||||
osg::MatrixTransform* rootNode = new osg::MatrixTransform;
|
||||
((ive::MatrixTransform*)(rootNode))->read(in);
|
||||
return rootNode;
|
||||
}
|
||||
else if(id==IVEGROUP)
|
||||
{
|
||||
osg::Group* rootNode = new osg::Group;
|
||||
((ive::Group*)(rootNode))->read(in);
|
||||
return rootNode;
|
||||
}
|
||||
else{
|
||||
std::cout <<"Unknown class identification in file "<< id << std::endl;
|
||||
}
|
||||
return in.readNode();
|
||||
}
|
||||
catch(ive::Exception e)
|
||||
{
|
||||
@ -63,6 +46,9 @@ class IVEReaderWriter : public ReaderWriter
|
||||
|
||||
virtual WriteResult writeNode(const Node& node,const std::string& fileName, const osgDB::ReaderWriter::Options* options)
|
||||
{
|
||||
std::string ext = getFileExtension(fileName);
|
||||
if (!acceptsExtension(ext)) return WriteResult::FILE_NOT_HANDLED;
|
||||
|
||||
std::ofstream fout(fileName.c_str(), std::ios::out | std::ios::binary);
|
||||
WriteResult result = writeNode(node, fout, options);
|
||||
fout.close();
|
||||
@ -73,15 +59,9 @@ class IVEReaderWriter : public ReaderWriter
|
||||
{
|
||||
try
|
||||
{
|
||||
ive::DataOutputStream* out = new ive::DataOutputStream(&fout);
|
||||
// write ive file.
|
||||
if(dynamic_cast<const osg::MatrixTransform*>(&node))
|
||||
const_cast<ive::MatrixTransform*>(static_cast<const ive::MatrixTransform*>(&node))->write(out);
|
||||
else if(dynamic_cast<const osg::Group*>(&node))
|
||||
const_cast<ive::Group*>(static_cast<const ive::Group*>(&node))->write(out);
|
||||
else
|
||||
std::cout<<"File must start with a MatrixTransform or Group "<<std::endl;
|
||||
fout.flush();
|
||||
ive::DataOutputStream out(&fout);
|
||||
|
||||
out.writeNode(const_cast<osg::Node*>(&node));
|
||||
return WriteResult::FILE_SAVED;
|
||||
}
|
||||
catch(ive::Exception e)
|
||||
|
@ -1,15 +1,15 @@
|
||||
/**********************************************************************
|
||||
*
|
||||
* FILE: StateSet.cpp
|
||||
* FILE: StateSet.cpp
|
||||
*
|
||||
* DESCRIPTION: Read/Write osg::StateSet in binary format to disk.
|
||||
* DESCRIPTION: Read/Write osg::StateSet in binary format to disk.
|
||||
*
|
||||
* CREATED BY: Auto generated by iveGenerated
|
||||
* and later modified by Rune Schmidt Jensen.
|
||||
* CREATED BY: Auto generated by iveGenerated
|
||||
* and later modified by Rune Schmidt Jensen.
|
||||
*
|
||||
* HISTORY: Created 17.3.2003
|
||||
* HISTORY: Created 17.3.2003
|
||||
*
|
||||
* Copyright 2003 VR-C
|
||||
* Copyright 2003 VR-C
|
||||
**********************************************************************/
|
||||
|
||||
#include "Exception.h"
|
||||
@ -18,6 +18,8 @@
|
||||
#include "BlendFunc.h"
|
||||
#include "Material.h"
|
||||
#include "CullFace.h"
|
||||
#include "PolygonOffset.h"
|
||||
#include "ShadeModel.h"
|
||||
#include "Texture2D.h"
|
||||
#include "TextureCubeMap.h"
|
||||
#include "TexEnv.h"
|
||||
@ -29,238 +31,148 @@
|
||||
using namespace ive;
|
||||
|
||||
void StateSet::write(DataOutputStream* out){
|
||||
// Write StateSet's identification.
|
||||
out->writeInt(IVESTATESET);
|
||||
// If the osg class is inherited by any other class we should also write this to file.
|
||||
osg::Object* obj = dynamic_cast<osg::Object*>(this);
|
||||
if(obj){
|
||||
((ive::Object*)(obj))->write(out);
|
||||
}
|
||||
else
|
||||
throw Exception("StateSet::write(): Could not cast this osg::StateSet to an osg::Object.");
|
||||
// Write StateSet's identification.
|
||||
out->writeInt(IVESTATESET);
|
||||
// If the osg class is inherited by any other class we should also write this to file.
|
||||
osg::Object* obj = dynamic_cast<osg::Object*>(this);
|
||||
if(obj){
|
||||
((ive::Object*)(obj))->write(out);
|
||||
}
|
||||
else
|
||||
throw Exception("StateSet::write(): Could not cast this osg::StateSet to an osg::Object.");
|
||||
|
||||
// Write render bin bin details.
|
||||
switch(getRenderBinMode()){
|
||||
case osg::StateSet::INHERIT_RENDERBIN_DETAILS: out->writeChar((char)0);break;
|
||||
case osg::StateSet::USE_RENDERBIN_DETAILS: out->writeChar((char)1);break;
|
||||
case osg::StateSet::OVERRIDE_RENDERBIN_DETAILS: out->writeChar((char)2);break;
|
||||
case osg::StateSet::ENCLOSE_RENDERBIN_DETAILS: out->writeChar((char)3);break;
|
||||
default: throw Exception("Unknown RenderBinMode in StateSet::write()");
|
||||
}
|
||||
out->writeInt(getBinNumber());
|
||||
out->writeString(getBinName());
|
||||
// Write render bin bin details.
|
||||
switch(getRenderBinMode()){
|
||||
case osg::StateSet::INHERIT_RENDERBIN_DETAILS: out->writeChar((char)0);break;
|
||||
case osg::StateSet::USE_RENDERBIN_DETAILS: out->writeChar((char)1);break;
|
||||
case osg::StateSet::OVERRIDE_RENDERBIN_DETAILS: out->writeChar((char)2);break;
|
||||
case osg::StateSet::ENCLOSE_RENDERBIN_DETAILS: out->writeChar((char)3);break;
|
||||
default: throw Exception("Unknown RenderBinMode in StateSet::write()");
|
||||
}
|
||||
out->writeInt(getBinNumber());
|
||||
out->writeString(getBinName());
|
||||
|
||||
|
||||
StateSet::ModeList ml = getModeList();
|
||||
StateSet::AttributeList al = getAttributeList();
|
||||
StateSet::ModeList ml = getModeList();
|
||||
StateSet::AttributeList al = getAttributeList();
|
||||
|
||||
// Write stateset modes, this could for instance be GL_NORMALIZE, GL_LIGHT, etc.
|
||||
out->writeInt(ml.size());
|
||||
for(StateSet::ModeList::const_iterator mitr=ml.begin(); mitr!=ml.end(); ++mitr){
|
||||
out->writeInt((unsigned int)mitr->first);
|
||||
out->writeInt((unsigned int)mitr->second);
|
||||
}
|
||||
// Write stateset modes, this could for instance be GL_NORMALIZE, GL_LIGHT, etc.
|
||||
out->writeInt(ml.size());
|
||||
for(StateSet::ModeList::const_iterator mitr=ml.begin(); mitr!=ml.end(); ++mitr){
|
||||
out->writeInt((unsigned int)mitr->first);
|
||||
out->writeInt((unsigned int)mitr->second);
|
||||
}
|
||||
|
||||
// Write stateset attributes, this could for instance be alphafunctions, materials, etc.
|
||||
out->writeInt(al.size());
|
||||
for(StateSet::AttributeList::iterator aitr=al.begin(); aitr!=al.end(); ++aitr){
|
||||
// This is a BlendFunc.
|
||||
if(dynamic_cast<osg::BlendFunc*>(aitr->second.first.get())){
|
||||
((ive::BlendFunc*)(aitr->second.first.get()))->write(out);
|
||||
out->writeInt(aitr->second.second);
|
||||
}
|
||||
// This is a Material
|
||||
else if(dynamic_cast<osg::Material*>(aitr->second.first.get())){
|
||||
((ive::Material*)(aitr->second.first.get()))->write(out);
|
||||
out->writeInt(aitr->second.second);
|
||||
}
|
||||
// This is a CullFace
|
||||
else if(dynamic_cast<osg::CullFace*>(aitr->second.first.get())){
|
||||
((ive::CullFace*)(aitr->second.first.get()))->write(out);
|
||||
out->writeInt(aitr->second.second);
|
||||
}
|
||||
else{
|
||||
std::string className = (aitr->second.first.get())->className();
|
||||
throw Exception(std::string("StateSet::write(): Unknown StateAttribute: ").append(className));
|
||||
}
|
||||
}
|
||||
// Write stateset attributes, this could for instance be alphafunctions, materials, etc.
|
||||
out->writeInt(al.size());
|
||||
for(StateSet::AttributeList::iterator aitr=al.begin(); aitr!=al.end(); ++aitr){
|
||||
out->writeStateAttribute(aitr->second.first.get());
|
||||
out->writeInt(aitr->second.second);
|
||||
}
|
||||
|
||||
StateSet::TextureModeList tml = getTextureModeList();
|
||||
StateSet::TextureAttributeList tal = getTextureAttributeList();
|
||||
StateSet::TextureModeList tml = getTextureModeList();
|
||||
StateSet::TextureAttributeList tal = getTextureAttributeList();
|
||||
|
||||
// Write texture stateset modes, this could for instance be TEXGEN ON, TEXTURECUBEMAP ON, etc.
|
||||
int nUnits = tml.size();
|
||||
out->writeInt(nUnits);
|
||||
// Write texture stateset modes, this could for instance be TEXGEN ON, TEXTURECUBEMAP ON, etc.
|
||||
int nUnits = tml.size();
|
||||
out->writeInt(nUnits);
|
||||
int unit;
|
||||
for(unit=0;unit<nUnits;unit++){
|
||||
ml = tml[unit];
|
||||
out->writeInt(ml.size());
|
||||
for(StateSet::ModeList::const_iterator mitr=ml.begin(); mitr!=ml.end(); ++mitr){
|
||||
out->writeInt((unsigned int)mitr->first);
|
||||
out->writeInt((unsigned int)mitr->second);
|
||||
}
|
||||
}
|
||||
for(unit=0;unit<nUnits;unit++){
|
||||
ml = tml[unit];
|
||||
out->writeInt(ml.size());
|
||||
for(StateSet::ModeList::const_iterator mitr=ml.begin(); mitr!=ml.end(); ++mitr){
|
||||
out->writeInt((unsigned int)mitr->first);
|
||||
out->writeInt((unsigned int)mitr->second);
|
||||
}
|
||||
}
|
||||
|
||||
// Write texture attributes, this could for instance texture2D, texturecubemap
|
||||
nUnits = tal.size();
|
||||
out->writeInt(nUnits);
|
||||
for(unit=0;unit<nUnits;unit++){
|
||||
al = tal[unit];
|
||||
out->writeInt(al.size());
|
||||
for(StateSet::AttributeList::iterator aitr=al.begin(); aitr!=al.end(); ++aitr){
|
||||
// This is a Texture2D
|
||||
if(dynamic_cast<osg::Texture2D*>(aitr->second.first.get())){
|
||||
((ive::Texture2D*)(aitr->second.first.get()))->write(out);
|
||||
out->writeInt(aitr->second.second);
|
||||
}
|
||||
// This is a TextureCubeMap
|
||||
else if(dynamic_cast<osg::TextureCubeMap*>(aitr->second.first.get())){
|
||||
((ive::TextureCubeMap*)(aitr->second.first.get()))->write(out);
|
||||
out->writeInt(aitr->second.second);
|
||||
}
|
||||
// This is a TexEnv
|
||||
else if(dynamic_cast<osg::TexEnv*>(aitr->second.first.get())){
|
||||
((ive::TexEnv*)(aitr->second.first.get()))->write(out);
|
||||
out->writeInt(aitr->second.second);
|
||||
}
|
||||
// This is a TexEnvCombine
|
||||
else if(dynamic_cast<osg::TexEnvCombine*>(aitr->second.first.get())){
|
||||
((ive::TexEnvCombine*)(aitr->second.first.get()))->write(out);
|
||||
out->writeInt(aitr->second.second);
|
||||
}
|
||||
// This is a TexGen
|
||||
else if(dynamic_cast<osg::TexGen*>(aitr->second.first.get())){
|
||||
((ive::TexGen*)(aitr->second.first.get()))->write(out);
|
||||
out->writeInt(aitr->second.second);
|
||||
}
|
||||
else{
|
||||
std::string className = (aitr->second.first.get())->className();
|
||||
throw Exception(std::string("StateSet::write(): Unknown Texture StateAttribute: ").append(className));
|
||||
}
|
||||
}
|
||||
}
|
||||
// Write texture attributes, this could for instance texture2D, texturecubemap
|
||||
nUnits = tal.size();
|
||||
out->writeInt(nUnits);
|
||||
for(unit=0;unit<nUnits;unit++){
|
||||
al = tal[unit];
|
||||
out->writeInt(al.size());
|
||||
for(StateSet::AttributeList::iterator aitr=al.begin(); aitr!=al.end(); ++aitr){
|
||||
out->writeStateAttribute(aitr->second.first.get());
|
||||
out->writeInt(aitr->second.second);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void StateSet::read(DataInputStream* in){
|
||||
// Read StateSet's identification.
|
||||
int id = in->peekInt();
|
||||
if(id == IVESTATESET){
|
||||
// Code to read StateSet's properties.
|
||||
id = in->readInt();
|
||||
// Read StateSet's identification.
|
||||
int id = in->peekInt();
|
||||
if(id == IVESTATESET){
|
||||
// Code to read StateSet's properties.
|
||||
id = in->readInt();
|
||||
|
||||
// If the osg class is inherited by any other class we should also read this from file.
|
||||
osg::Object* obj = dynamic_cast<osg::Object*>(this);
|
||||
if(obj){
|
||||
((ive::Object*)(obj))->read(in);;
|
||||
}
|
||||
else
|
||||
throw Exception("StateSet::read(): Could not cast this osg::StateSet to an osg::Object.");
|
||||
// If the osg class is inherited by any other class we should also read this from file.
|
||||
osg::Object* obj = dynamic_cast<osg::Object*>(this);
|
||||
if(obj){
|
||||
((ive::Object*)(obj))->read(in);;
|
||||
}
|
||||
else
|
||||
throw Exception("StateSet::read(): Could not cast this osg::StateSet to an osg::Object.");
|
||||
|
||||
// Read render bin details.
|
||||
char c = in->readChar();
|
||||
int num = in->readInt();
|
||||
std::string name = in->readString();
|
||||
switch((int)c){
|
||||
case 0:
|
||||
setRenderBinDetails(num, name, osg::StateSet::INHERIT_RENDERBIN_DETAILS);
|
||||
break;
|
||||
case 1:
|
||||
setRenderBinDetails(num, name, osg::StateSet::USE_RENDERBIN_DETAILS);
|
||||
break;
|
||||
case 2:
|
||||
setRenderBinDetails(num, name, osg::StateSet::OVERRIDE_RENDERBIN_DETAILS);
|
||||
break;
|
||||
case 3:
|
||||
setRenderBinDetails(num, name, osg::StateSet::ENCLOSE_RENDERBIN_DETAILS);
|
||||
break;
|
||||
default: throw Exception("Unkown RenderBinMode in StateSet::read()");
|
||||
}
|
||||
// Read render bin details.
|
||||
char c = in->readChar();
|
||||
int num = in->readInt();
|
||||
std::string name = in->readString();
|
||||
switch((int)c){
|
||||
case 0:
|
||||
setRenderBinDetails(num, name, osg::StateSet::INHERIT_RENDERBIN_DETAILS);
|
||||
break;
|
||||
case 1:
|
||||
setRenderBinDetails(num, name, osg::StateSet::USE_RENDERBIN_DETAILS);
|
||||
break;
|
||||
case 2:
|
||||
setRenderBinDetails(num, name, osg::StateSet::OVERRIDE_RENDERBIN_DETAILS);
|
||||
break;
|
||||
case 3:
|
||||
setRenderBinDetails(num, name, osg::StateSet::ENCLOSE_RENDERBIN_DETAILS);
|
||||
break;
|
||||
default: throw Exception("Unkown RenderBinMode in StateSet::read()");
|
||||
}
|
||||
|
||||
// Read stateset modes.
|
||||
int size = in->readInt();
|
||||
// Read stateset modes.
|
||||
int size = in->readInt();
|
||||
int i;
|
||||
for(i=0;i<size;i++){
|
||||
int mode = in->readInt();
|
||||
int value = in->readInt();
|
||||
setMode((osg::StateAttribute::GLMode)mode, (osg::StateAttribute::GLModeValue)value);
|
||||
}
|
||||
for(i=0;i<size;i++){
|
||||
int mode = in->readInt();
|
||||
int value = in->readInt();
|
||||
setMode((osg::StateAttribute::GLMode)mode, (osg::StateAttribute::GLModeValue)value);
|
||||
}
|
||||
|
||||
// Read state attributes
|
||||
size = in->readInt();
|
||||
for(i=0;i<size;i++){
|
||||
osg::StateAttribute* attribute;
|
||||
int attributeID = in->peekInt();
|
||||
if(attributeID == IVEBLENDFUNC){
|
||||
attribute = new osg::BlendFunc();
|
||||
((ive::BlendFunc*)(attribute))->read(in);
|
||||
setAttribute(attribute, (osg::StateAttribute::OverrideValue)in->readInt());
|
||||
}
|
||||
else if(attributeID == IVEMATERIAL){
|
||||
attribute = new osg::Material();
|
||||
((ive::Material*)(attribute))->read(in);
|
||||
setAttribute(attribute, (osg::StateAttribute::OverrideValue)in->readInt());
|
||||
}
|
||||
else if(attributeID == IVECULLFACE){
|
||||
attribute = new osg::CullFace();
|
||||
((ive::CullFace*)(attribute))->read(in);
|
||||
setAttribute(attribute, (osg::StateAttribute::OverrideValue)in->readInt());
|
||||
}
|
||||
else{
|
||||
throw Exception("Unkown StateAttribute in StateSet::read()");
|
||||
}
|
||||
}
|
||||
// Read state attributes
|
||||
size = in->readInt();
|
||||
for(i=0;i<size;i++){
|
||||
osg::StateAttribute* attribute = in->readStateAttribute();
|
||||
setAttribute(attribute, (osg::StateAttribute::OverrideValue)in->readInt());
|
||||
}
|
||||
|
||||
// Read texture stateset mode.
|
||||
int nUnits = in->readInt();
|
||||
// Read texture stateset mode.
|
||||
int nUnits = in->readInt();
|
||||
int unit;
|
||||
for(unit=0;unit<nUnits;unit++){
|
||||
size = in->readInt();
|
||||
for(i=0;i<size;i++){
|
||||
int mode = in->readInt();
|
||||
int value = in->readInt();
|
||||
setTextureMode(unit,(osg::StateAttribute::GLMode)mode, (osg::StateAttribute::GLModeValue)value);
|
||||
}
|
||||
}
|
||||
for(unit=0;unit<nUnits;unit++){
|
||||
size = in->readInt();
|
||||
for(i=0;i<size;i++){
|
||||
int mode = in->readInt();
|
||||
int value = in->readInt();
|
||||
setTextureMode(unit,(osg::StateAttribute::GLMode)mode, (osg::StateAttribute::GLModeValue)value);
|
||||
}
|
||||
}
|
||||
|
||||
// Read texture attributes.
|
||||
nUnits = in->readInt();
|
||||
for(unit=0;unit<nUnits;unit++){
|
||||
size = in->readInt();
|
||||
for(i=0;i<size;i++){
|
||||
osg::StateAttribute* attribute;
|
||||
int attributeID = in->peekInt();
|
||||
if(attributeID == IVETEXTURE2D){
|
||||
attribute = new osg::Texture2D();
|
||||
((ive::Texture2D*)(attribute))->read(in);
|
||||
setTextureAttribute(unit, attribute, (osg::StateAttribute::OverrideValue)in->readInt());
|
||||
}
|
||||
else if(attributeID == IVETEXTURECUBEMAP){
|
||||
attribute = new osg::TextureCubeMap();
|
||||
((ive::TextureCubeMap*)(attribute))->read(in);
|
||||
setTextureAttribute(unit, attribute, (osg::StateAttribute::OverrideValue)in->readInt());
|
||||
}
|
||||
else if(attributeID == IVETEXENV){
|
||||
attribute = new osg::TexEnv();
|
||||
((ive::TexEnv*)(attribute))->read(in);
|
||||
setTextureAttribute(unit, attribute, (osg::StateAttribute::OverrideValue)in->readInt());
|
||||
}
|
||||
else if(attributeID == IVETEXENVCOMBINE){
|
||||
attribute = new osg::TexEnvCombine();
|
||||
((ive::TexEnvCombine*)(attribute))->read(in);
|
||||
setTextureAttribute(unit, attribute, (osg::StateAttribute::OverrideValue)in->readInt());
|
||||
}
|
||||
else if(attributeID == IVETEXGEN){
|
||||
attribute = new osg::TexGen();
|
||||
((ive::TexGen*)(attribute))->read(in);
|
||||
setTextureAttribute(unit, attribute, (osg::StateAttribute::OverrideValue)in->readInt());
|
||||
}
|
||||
else{
|
||||
throw Exception("Unkown Texture StateAttribute in StateSet::read()");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else{
|
||||
throw Exception("StateSet::read(): Expected StateSet identification");
|
||||
}
|
||||
// Read texture attributes.
|
||||
nUnits = in->readInt();
|
||||
for(unit=0;unit<nUnits;unit++){
|
||||
size = in->readInt();
|
||||
for(i=0;i<size;i++){
|
||||
osg::StateAttribute* attribute = in->readStateAttribute();
|
||||
setTextureAttribute(unit, attribute, (osg::StateAttribute::OverrideValue)in->readInt());
|
||||
}
|
||||
}
|
||||
}
|
||||
else{
|
||||
throw Exception("StateSet::read(): Expected StateSet identification");
|
||||
}
|
||||
}
|
||||
|
@ -38,7 +38,7 @@ void Texture2D::write(DataOutputStream* out){
|
||||
|
||||
// Include image data in stream
|
||||
if(includeImg){
|
||||
out->writeInt((int)getImage());
|
||||
out->writeLong((long)getImage());
|
||||
if(getImage())
|
||||
((ive::Image*)getImage())->write(out);
|
||||
}
|
||||
|
@ -41,27 +41,27 @@ void TextureCubeMap::write(DataOutputStream* out){
|
||||
out->writeInt(getNumMipmapLevels());
|
||||
|
||||
// Write images if any
|
||||
out->writeInt((int)getImage(osg::TextureCubeMap::POSITIVE_X));
|
||||
out->writeLong((long)getImage(osg::TextureCubeMap::POSITIVE_X));
|
||||
if(getImage(osg::TextureCubeMap::POSITIVE_X))
|
||||
((ive::Image*)(getImage(osg::TextureCubeMap::POSITIVE_X)))->write(out);
|
||||
|
||||
out->writeInt((int)getImage(osg::TextureCubeMap::NEGATIVE_X));
|
||||
out->writeLong((long)getImage(osg::TextureCubeMap::NEGATIVE_X));
|
||||
if(getImage(osg::TextureCubeMap::NEGATIVE_X))
|
||||
((ive::Image*)(getImage(osg::TextureCubeMap::NEGATIVE_X)))->write(out);
|
||||
|
||||
out->writeInt((int)getImage(osg::TextureCubeMap::POSITIVE_Y));
|
||||
out->writeLong((long)getImage(osg::TextureCubeMap::POSITIVE_Y));
|
||||
if(getImage(osg::TextureCubeMap::POSITIVE_Y))
|
||||
((ive::Image*)(getImage(osg::TextureCubeMap::POSITIVE_Y)))->write(out);
|
||||
|
||||
out->writeInt((int)getImage(osg::TextureCubeMap::NEGATIVE_Y));
|
||||
out->writeLong((long)getImage(osg::TextureCubeMap::NEGATIVE_Y));
|
||||
if(getImage(osg::TextureCubeMap::NEGATIVE_Y))
|
||||
((ive::Image*)(getImage(osg::TextureCubeMap::NEGATIVE_Y)))->write(out);
|
||||
|
||||
out->writeInt((int)getImage(osg::TextureCubeMap::POSITIVE_Z));
|
||||
out->writeLong((long)getImage(osg::TextureCubeMap::POSITIVE_Z));
|
||||
if(getImage(osg::TextureCubeMap::POSITIVE_Z))
|
||||
((ive::Image*)(getImage(osg::TextureCubeMap::POSITIVE_Z)))->write(out);
|
||||
|
||||
out->writeInt((int)getImage(osg::TextureCubeMap::NEGATIVE_Z));
|
||||
out->writeLong((long)getImage(osg::TextureCubeMap::NEGATIVE_Z));
|
||||
if(getImage(osg::TextureCubeMap::NEGATIVE_Z))
|
||||
((ive::Image*)(getImage(osg::TextureCubeMap::NEGATIVE_Z)))->write(out);
|
||||
|
||||
|
@ -14,7 +14,7 @@
|
||||
*/
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#pragma warning( disable : 4786 )
|
||||
#pragma warning( disable : 4786 )
|
||||
#endif
|
||||
|
||||
#include <string>
|
||||
@ -118,9 +118,15 @@ osgDB::ReaderWriter::ReadResult ReaderWriterOBJ::readNode(const std::string& fil
|
||||
omtl->emmissive[2], omtl->emmissive[3]));
|
||||
// note, osg shininess scales between 0.0 and 1.0.
|
||||
mtl->setShininess(osg::Material::FRONT_AND_BACK, omtl->shininess);
|
||||
mtl->setAlpha(osg::Material::FRONT_AND_BACK, omtl->alpha);
|
||||
|
||||
stateset->setAttribute(mtl);
|
||||
|
||||
if (omtl->alpha<1.0f) {
|
||||
stateset->setMode(GL_BLEND,osg::StateAttribute::ON);
|
||||
stateset->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
|
||||
}
|
||||
|
||||
if (omtl->textureName)
|
||||
{
|
||||
std::string fileName = osgDB::findFileInDirectory(omtl->textureName,directory,true);
|
||||
@ -158,9 +164,9 @@ osgDB::ReaderWriter::ReadResult ReaderWriterOBJ::readNode(const std::string& fil
|
||||
osg::Group* osg_top = NULL;
|
||||
if (obj->position[0] != 0.0f || obj->position[2] != 0.0f || obj->position[2] != 0.0f) {
|
||||
osg::MatrixTransform* xform = new osg::MatrixTransform;
|
||||
// note obj_x -> osg_x,
|
||||
// obj_y -> osg_z,
|
||||
// obj_z -> osg_y,
|
||||
// note obj_x -> osg_x,
|
||||
// obj_y -> osg_z,
|
||||
// obj_z -> osg_y,
|
||||
xform->setMatrix(osg::Matrix::translate(obj->position[0], obj->position[2], obj->position[1]));
|
||||
osg_top = xform;
|
||||
}
|
||||
|
@ -24,7 +24,7 @@
|
||||
|
||||
|
||||
/* enums */
|
||||
enum { X, Y, Z, W }; /* elements of a vertex */
|
||||
enum { X, Y, Z, W }; /* elements of a vertex */
|
||||
|
||||
|
||||
/* typedefs */
|
||||
@ -151,7 +151,7 @@ _glmWeldVectors(GLfloat* vectors, unsigned int* numvectors, GLfloat epsilon)
|
||||
for (i = 1; i <= *numvectors; i++) {
|
||||
for (j = 1; j <= copied; j++) {
|
||||
if (_glmEqual(&vectors[3 * i], &copies[3 * j], epsilon)) {
|
||||
goto duplicate;
|
||||
goto duplicate;
|
||||
}
|
||||
}
|
||||
|
||||
@ -159,7 +159,7 @@ _glmWeldVectors(GLfloat* vectors, unsigned int* numvectors, GLfloat epsilon)
|
||||
copies[3 * copied + 0] = vectors[3 * i + 0];
|
||||
copies[3 * copied + 1] = vectors[3 * i + 1];
|
||||
copies[3 * copied + 2] = vectors[3 * i + 2];
|
||||
j = copied; /* pass this along for below */
|
||||
j = copied; /* pass this along for below */
|
||||
copied++;
|
||||
|
||||
duplicate:
|
||||
@ -338,6 +338,7 @@ _glmReadMTL(GLMmodel* model, char* name)
|
||||
model->materials[i].specular[2] = 0.0f;
|
||||
model->materials[i].textureName = NULL;
|
||||
model->materials[i].textureReflection = false;
|
||||
model->materials[i].alpha = 1.0f;
|
||||
}
|
||||
model->materials[0].name = strdup("default");
|
||||
|
||||
@ -361,30 +362,33 @@ _glmReadMTL(GLMmodel* model, char* name)
|
||||
model->materials[nummaterials].shininess /= 1000.0;
|
||||
model->materials[nummaterials].shininess *= 128.0;
|
||||
break;
|
||||
case 'd':
|
||||
fscanf(file, "%f", &model->materials[nummaterials].alpha);
|
||||
break;
|
||||
case 'K':
|
||||
switch(buf[1]) {
|
||||
case 'd':
|
||||
fscanf(file, "%f %f %f",
|
||||
&model->materials[nummaterials].diffuse[0],
|
||||
&model->materials[nummaterials].diffuse[1],
|
||||
&model->materials[nummaterials].diffuse[2]);
|
||||
break;
|
||||
fscanf(file, "%f %f %f",
|
||||
&model->materials[nummaterials].diffuse[0],
|
||||
&model->materials[nummaterials].diffuse[1],
|
||||
&model->materials[nummaterials].diffuse[2]);
|
||||
break;
|
||||
case 's':
|
||||
fscanf(file, "%f %f %f",
|
||||
&model->materials[nummaterials].specular[0],
|
||||
&model->materials[nummaterials].specular[1],
|
||||
&model->materials[nummaterials].specular[2]);
|
||||
break;
|
||||
fscanf(file, "%f %f %f",
|
||||
&model->materials[nummaterials].specular[0],
|
||||
&model->materials[nummaterials].specular[1],
|
||||
&model->materials[nummaterials].specular[2]);
|
||||
break;
|
||||
case 'a':
|
||||
fscanf(file, "%f %f %f",
|
||||
&model->materials[nummaterials].ambient[0],
|
||||
&model->materials[nummaterials].ambient[1],
|
||||
&model->materials[nummaterials].ambient[2]);
|
||||
break;
|
||||
fscanf(file, "%f %f %f",
|
||||
&model->materials[nummaterials].ambient[0],
|
||||
&model->materials[nummaterials].ambient[1],
|
||||
&model->materials[nummaterials].ambient[2]);
|
||||
break;
|
||||
default:
|
||||
/* eat up rest of line */
|
||||
fgets(buf, sizeof(buf), file);
|
||||
break;
|
||||
/* eat up rest of line */
|
||||
fgets(buf, sizeof(buf), file);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
@ -455,11 +459,11 @@ _glmWriteMTL(GLMmodel* model, char* modelpath, char* mtllibname)
|
||||
material = &model->materials[i];
|
||||
fprintf(file, "newmtl %s\n", material->name);
|
||||
fprintf(file, "Ka %f %f %f\n",
|
||||
material->ambient[0], material->ambient[1], material->ambient[2]);
|
||||
material->ambient[0], material->ambient[1], material->ambient[2]);
|
||||
fprintf(file, "Kd %f %f %f\n",
|
||||
material->diffuse[0], material->diffuse[1], material->diffuse[2]);
|
||||
material->diffuse[0], material->diffuse[1], material->diffuse[2]);
|
||||
fprintf(file, "Ks %f %f %f\n",
|
||||
material->specular[0],material->specular[1],material->specular[2]);
|
||||
material->specular[0],material->specular[1],material->specular[2]);
|
||||
fprintf(file, "Ns %f\n", material->shininess);
|
||||
fprintf(file, "\n");
|
||||
}
|
||||
@ -493,11 +497,11 @@ static void createCompositeName(char* buf,char* compositeName)
|
||||
static GLvoid
|
||||
_glmFirstPass(GLMmodel* model, FILE* file)
|
||||
{
|
||||
unsigned int numvertices; /* number of vertices in model */
|
||||
unsigned int numnormals; /* number of normals in model */
|
||||
unsigned int numtexcoords; /* number of texcoords in model */
|
||||
unsigned int numtriangles; /* number of triangles in model */
|
||||
GLMgroup* group; /* current group */
|
||||
unsigned int numvertices; /* number of vertices in model */
|
||||
unsigned int numnormals; /* number of normals in model */
|
||||
unsigned int numtexcoords; /* number of texcoords in model */
|
||||
unsigned int numtriangles; /* number of triangles in model */
|
||||
GLMgroup* group; /* current group */
|
||||
unsigned v, n, t;
|
||||
char buf[128];
|
||||
|
||||
@ -507,32 +511,32 @@ _glmFirstPass(GLMmodel* model, FILE* file)
|
||||
numvertices = numnormals = numtexcoords = numtriangles = 0;
|
||||
while(fscanf(file, "%s", buf) != EOF) {
|
||||
switch(buf[0]) {
|
||||
case '#': /* comment */
|
||||
case '#': /* comment */
|
||||
/* eat up rest of line */
|
||||
fgets(buf, sizeof(buf), file);
|
||||
break;
|
||||
case 'v': /* v, vn, vt */
|
||||
case 'v': /* v, vn, vt */
|
||||
switch(buf[1]) {
|
||||
case '\0': /* vertex */
|
||||
/* eat up rest of line */
|
||||
fgets(buf, sizeof(buf), file);
|
||||
numvertices++;
|
||||
break;
|
||||
case 'n': /* normal */
|
||||
/* eat up rest of line */
|
||||
fgets(buf, sizeof(buf), file);
|
||||
numnormals++;
|
||||
break;
|
||||
case 't': /* texcoord */
|
||||
/* eat up rest of line */
|
||||
fgets(buf, sizeof(buf), file);
|
||||
numtexcoords++;
|
||||
break;
|
||||
case '\0': /* vertex */
|
||||
/* eat up rest of line */
|
||||
fgets(buf, sizeof(buf), file);
|
||||
numvertices++;
|
||||
break;
|
||||
case 'n': /* normal */
|
||||
/* eat up rest of line */
|
||||
fgets(buf, sizeof(buf), file);
|
||||
numnormals++;
|
||||
break;
|
||||
case 't': /* texcoord */
|
||||
/* eat up rest of line */
|
||||
fgets(buf, sizeof(buf), file);
|
||||
numtexcoords++;
|
||||
break;
|
||||
default:
|
||||
printf("_glmFirstPass(): Unknown token \"%s\".\n", buf);
|
||||
//exit(1);
|
||||
return;
|
||||
break;
|
||||
printf("_glmFirstPass(): Unknown token \"%s\".\n", buf);
|
||||
//exit(1);
|
||||
return;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 'm':
|
||||
@ -545,7 +549,7 @@ _glmFirstPass(GLMmodel* model, FILE* file)
|
||||
/* eat up rest of line */
|
||||
fgets(buf, sizeof(buf), file);
|
||||
break;
|
||||
case 'g': /* group */
|
||||
case 'g': /* group */
|
||||
{
|
||||
/* eat up rest of line */
|
||||
fgets(buf, sizeof(buf), file);
|
||||
@ -556,51 +560,51 @@ _glmFirstPass(GLMmodel* model, FILE* file)
|
||||
group = _glmAddGroup(model, compositeName);
|
||||
}
|
||||
break;
|
||||
case 'f': /* face */
|
||||
case 'f': /* face */
|
||||
v = n = t = 0;
|
||||
fscanf(file, "%s", buf);
|
||||
/* can be one of %d, %d//%d, %d/%d, %d/%d/%d %d//%d */
|
||||
if (strstr(buf, "//")) {
|
||||
/* v//n */
|
||||
sscanf(buf, "%d//%d", &v, &n);
|
||||
fscanf(file, "%d//%d", &v, &n);
|
||||
fscanf(file, "%d//%d", &v, &n);
|
||||
numtriangles++;
|
||||
group->numtriangles++;
|
||||
while(fscanf(file, "%d//%d", &v, &n) > 0) {
|
||||
numtriangles++;
|
||||
group->numtriangles++;
|
||||
}
|
||||
/* v//n */
|
||||
sscanf(buf, "%d//%d", &v, &n);
|
||||
fscanf(file, "%d//%d", &v, &n);
|
||||
fscanf(file, "%d//%d", &v, &n);
|
||||
numtriangles++;
|
||||
group->numtriangles++;
|
||||
while(fscanf(file, "%d//%d", &v, &n) > 0) {
|
||||
numtriangles++;
|
||||
group->numtriangles++;
|
||||
}
|
||||
} else if (sscanf(buf, "%d/%d/%d", &v, &t, &n) == 3) {
|
||||
/* v/t/n */
|
||||
fscanf(file, "%d/%d/%d", &v, &t, &n);
|
||||
fscanf(file, "%d/%d/%d", &v, &t, &n);
|
||||
numtriangles++;
|
||||
group->numtriangles++;
|
||||
while(fscanf(file, "%d/%d/%d", &v, &t, &n) > 0) {
|
||||
numtriangles++;
|
||||
group->numtriangles++;
|
||||
}
|
||||
/* v/t/n */
|
||||
fscanf(file, "%d/%d/%d", &v, &t, &n);
|
||||
fscanf(file, "%d/%d/%d", &v, &t, &n);
|
||||
numtriangles++;
|
||||
group->numtriangles++;
|
||||
while(fscanf(file, "%d/%d/%d", &v, &t, &n) > 0) {
|
||||
numtriangles++;
|
||||
group->numtriangles++;
|
||||
}
|
||||
} else if (sscanf(buf, "%d/%d", &v, &t) == 2) {
|
||||
/* v/t */
|
||||
fscanf(file, "%d/%d", &v, &t);
|
||||
fscanf(file, "%d/%d", &v, &t);
|
||||
numtriangles++;
|
||||
group->numtriangles++;
|
||||
while(fscanf(file, "%d/%d", &v, &t) > 0) {
|
||||
numtriangles++;
|
||||
group->numtriangles++;
|
||||
}
|
||||
/* v/t */
|
||||
fscanf(file, "%d/%d", &v, &t);
|
||||
fscanf(file, "%d/%d", &v, &t);
|
||||
numtriangles++;
|
||||
group->numtriangles++;
|
||||
while(fscanf(file, "%d/%d", &v, &t) > 0) {
|
||||
numtriangles++;
|
||||
group->numtriangles++;
|
||||
}
|
||||
} else {
|
||||
/* v */
|
||||
fscanf(file, "%d", &v);
|
||||
fscanf(file, "%d", &v);
|
||||
numtriangles++;
|
||||
group->numtriangles++;
|
||||
while(fscanf(file, "%d", &v) > 0) {
|
||||
numtriangles++;
|
||||
group->numtriangles++;
|
||||
}
|
||||
/* v */
|
||||
fscanf(file, "%d", &v);
|
||||
fscanf(file, "%d", &v);
|
||||
numtriangles++;
|
||||
group->numtriangles++;
|
||||
while(fscanf(file, "%d", &v) > 0) {
|
||||
numtriangles++;
|
||||
group->numtriangles++;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
@ -644,15 +648,15 @@ _glmFirstPass(GLMmodel* model, FILE* file)
|
||||
static GLvoid
|
||||
_glmSecondPass(GLMmodel* model, FILE* file)
|
||||
{
|
||||
unsigned int numvertices; /* number of vertices in model */
|
||||
unsigned int numnormals; /* number of normals in model */
|
||||
unsigned int numtexcoords; /* number of texcoords in model */
|
||||
unsigned int numtriangles; /* number of triangles in model */
|
||||
GLfloat* vertices; /* array of vertices */
|
||||
GLfloat* normals; /* array of normals */
|
||||
GLfloat* texcoords; /* array of texture coordinates */
|
||||
GLMgroup* group; /* current group pointer */
|
||||
unsigned int material; /* current material */
|
||||
unsigned int numvertices; /* number of vertices in model */
|
||||
unsigned int numnormals; /* number of normals in model */
|
||||
unsigned int numtexcoords; /* number of texcoords in model */
|
||||
unsigned int numtriangles; /* number of triangles in model */
|
||||
GLfloat* vertices; /* array of vertices */
|
||||
GLfloat* normals; /* array of normals */
|
||||
GLfloat* texcoords; /* array of texture coordinates */
|
||||
GLMgroup* group; /* current group pointer */
|
||||
unsigned int material; /* current material */
|
||||
unsigned int v, n, t;
|
||||
char buf[128];
|
||||
|
||||
@ -674,32 +678,32 @@ _glmSecondPass(GLMmodel* model, FILE* file)
|
||||
while(fscanf(file, "%s", buf) != EOF) {
|
||||
char c = buf[0];
|
||||
switch(c) {
|
||||
case '#': /* comment */
|
||||
case '#': /* comment */
|
||||
/* eat up rest of line */
|
||||
fgets(buf, sizeof(buf), file);
|
||||
break;
|
||||
case 'v': /* v, vn, vt */
|
||||
case 'v': /* v, vn, vt */
|
||||
switch(buf[1]) {
|
||||
case '\0': /* vertex */
|
||||
fscanf(file, "%f %f %f",
|
||||
&vertices[3 * numvertices + X],
|
||||
&vertices[3 * numvertices + Y],
|
||||
&vertices[3 * numvertices + Z]);
|
||||
numvertices++;
|
||||
break;
|
||||
case 'n': /* normal */
|
||||
fscanf(file, "%f %f %f",
|
||||
&normals[3 * numnormals + X],
|
||||
&normals[3 * numnormals + Y],
|
||||
&normals[3 * numnormals + Z]);
|
||||
numnormals++;
|
||||
break;
|
||||
case 't': /* texcoord */
|
||||
fscanf(file, "%f %f",
|
||||
&texcoords[2 * numtexcoords + X],
|
||||
&texcoords[2 * numtexcoords + Y]);
|
||||
numtexcoords++;
|
||||
break;
|
||||
case '\0': /* vertex */
|
||||
fscanf(file, "%f %f %f",
|
||||
&vertices[3 * numvertices + X],
|
||||
&vertices[3 * numvertices + Y],
|
||||
&vertices[3 * numvertices + Z]);
|
||||
numvertices++;
|
||||
break;
|
||||
case 'n': /* normal */
|
||||
fscanf(file, "%f %f %f",
|
||||
&normals[3 * numnormals + X],
|
||||
&normals[3 * numnormals + Y],
|
||||
&normals[3 * numnormals + Z]);
|
||||
numnormals++;
|
||||
break;
|
||||
case 't': /* texcoord */
|
||||
fscanf(file, "%f %f",
|
||||
&texcoords[2 * numtexcoords + X],
|
||||
&texcoords[2 * numtexcoords + Y]);
|
||||
numtexcoords++;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 'u':
|
||||
@ -714,7 +718,7 @@ _glmSecondPass(GLMmodel* model, FILE* file)
|
||||
if (previousLineWas_g || firstGroup) group->material = material;
|
||||
|
||||
break;
|
||||
case 'g': /* group */
|
||||
case 'g': /* group */
|
||||
/* eat up rest of line */
|
||||
fgets(buf, sizeof(buf), file);
|
||||
char compositeName[128];
|
||||
@ -724,102 +728,102 @@ _glmSecondPass(GLMmodel* model, FILE* file)
|
||||
group->material = material;
|
||||
firstGroup = false;
|
||||
break;
|
||||
case 'f': /* face */
|
||||
case 'f': /* face */
|
||||
v = n = t = 0;
|
||||
fscanf(file, "%s", buf);
|
||||
/* can be one of %d, %d//%d, %d/%d, %d/%d/%d %d//%d */
|
||||
if (strstr(buf, "//")) {
|
||||
/* v//n */
|
||||
sscanf(buf, "%d//%d", &v, &n);
|
||||
T(numtriangles).vindices[0] = v;
|
||||
T(numtriangles).nindices[0] = n;
|
||||
fscanf(file, "%d//%d", &v, &n);
|
||||
T(numtriangles).vindices[1] = v;
|
||||
T(numtriangles).nindices[1] = n;
|
||||
fscanf(file, "%d//%d", &v, &n);
|
||||
T(numtriangles).vindices[2] = v;
|
||||
T(numtriangles).nindices[2] = n;
|
||||
group->triangles[group->numtriangles++] = numtriangles;
|
||||
numtriangles++;
|
||||
while(fscanf(file, "%d//%d", &v, &n) > 0) {
|
||||
T(numtriangles).vindices[0] = T(numtriangles-1).vindices[0];
|
||||
T(numtriangles).nindices[0] = T(numtriangles-1).nindices[0];
|
||||
T(numtriangles).vindices[1] = T(numtriangles-1).vindices[2];
|
||||
T(numtriangles).nindices[1] = T(numtriangles-1).nindices[2];
|
||||
T(numtriangles).vindices[2] = v;
|
||||
T(numtriangles).nindices[2] = n;
|
||||
group->triangles[group->numtriangles++] = numtriangles;
|
||||
numtriangles++;
|
||||
}
|
||||
/* v//n */
|
||||
sscanf(buf, "%d//%d", &v, &n);
|
||||
T(numtriangles).vindices[0] = v;
|
||||
T(numtriangles).nindices[0] = n;
|
||||
fscanf(file, "%d//%d", &v, &n);
|
||||
T(numtriangles).vindices[1] = v;
|
||||
T(numtriangles).nindices[1] = n;
|
||||
fscanf(file, "%d//%d", &v, &n);
|
||||
T(numtriangles).vindices[2] = v;
|
||||
T(numtriangles).nindices[2] = n;
|
||||
group->triangles[group->numtriangles++] = numtriangles;
|
||||
numtriangles++;
|
||||
while(fscanf(file, "%d//%d", &v, &n) > 0) {
|
||||
T(numtriangles).vindices[0] = T(numtriangles-1).vindices[0];
|
||||
T(numtriangles).nindices[0] = T(numtriangles-1).nindices[0];
|
||||
T(numtriangles).vindices[1] = T(numtriangles-1).vindices[2];
|
||||
T(numtriangles).nindices[1] = T(numtriangles-1).nindices[2];
|
||||
T(numtriangles).vindices[2] = v;
|
||||
T(numtriangles).nindices[2] = n;
|
||||
group->triangles[group->numtriangles++] = numtriangles;
|
||||
numtriangles++;
|
||||
}
|
||||
} else if (sscanf(buf, "%d/%d/%d", &v, &t, &n) == 3) {
|
||||
/* v/t/n */
|
||||
T(numtriangles).vindices[0] = v;
|
||||
T(numtriangles).tindices[0] = t;
|
||||
T(numtriangles).nindices[0] = n;
|
||||
fscanf(file, "%d/%d/%d", &v, &t, &n);
|
||||
T(numtriangles).vindices[1] = v;
|
||||
T(numtriangles).tindices[1] = t;
|
||||
T(numtriangles).nindices[1] = n;
|
||||
fscanf(file, "%d/%d/%d", &v, &t, &n);
|
||||
T(numtriangles).vindices[2] = v;
|
||||
T(numtriangles).tindices[2] = t;
|
||||
T(numtriangles).nindices[2] = n;
|
||||
group->triangles[group->numtriangles++] = numtriangles;
|
||||
group->hastexcoords = true;
|
||||
numtriangles++;
|
||||
while(fscanf(file, "%d/%d/%d", &v, &t, &n) > 0) {
|
||||
T(numtriangles).vindices[0] = T(numtriangles-1).vindices[0];
|
||||
T(numtriangles).tindices[0] = T(numtriangles-1).tindices[0];
|
||||
T(numtriangles).nindices[0] = T(numtriangles-1).nindices[0];
|
||||
T(numtriangles).vindices[1] = T(numtriangles-1).vindices[2];
|
||||
T(numtriangles).tindices[1] = T(numtriangles-1).tindices[2];
|
||||
T(numtriangles).nindices[1] = T(numtriangles-1).nindices[2];
|
||||
T(numtriangles).vindices[2] = v;
|
||||
T(numtriangles).tindices[2] = t;
|
||||
T(numtriangles).nindices[2] = n;
|
||||
group->triangles[group->numtriangles++] = numtriangles;
|
||||
numtriangles++;
|
||||
}
|
||||
/* v/t/n */
|
||||
T(numtriangles).vindices[0] = v;
|
||||
T(numtriangles).tindices[0] = t;
|
||||
T(numtriangles).nindices[0] = n;
|
||||
fscanf(file, "%d/%d/%d", &v, &t, &n);
|
||||
T(numtriangles).vindices[1] = v;
|
||||
T(numtriangles).tindices[1] = t;
|
||||
T(numtriangles).nindices[1] = n;
|
||||
fscanf(file, "%d/%d/%d", &v, &t, &n);
|
||||
T(numtriangles).vindices[2] = v;
|
||||
T(numtriangles).tindices[2] = t;
|
||||
T(numtriangles).nindices[2] = n;
|
||||
group->triangles[group->numtriangles++] = numtriangles;
|
||||
group->hastexcoords = true;
|
||||
numtriangles++;
|
||||
while(fscanf(file, "%d/%d/%d", &v, &t, &n) > 0) {
|
||||
T(numtriangles).vindices[0] = T(numtriangles-1).vindices[0];
|
||||
T(numtriangles).tindices[0] = T(numtriangles-1).tindices[0];
|
||||
T(numtriangles).nindices[0] = T(numtriangles-1).nindices[0];
|
||||
T(numtriangles).vindices[1] = T(numtriangles-1).vindices[2];
|
||||
T(numtriangles).tindices[1] = T(numtriangles-1).tindices[2];
|
||||
T(numtriangles).nindices[1] = T(numtriangles-1).nindices[2];
|
||||
T(numtriangles).vindices[2] = v;
|
||||
T(numtriangles).tindices[2] = t;
|
||||
T(numtriangles).nindices[2] = n;
|
||||
group->triangles[group->numtriangles++] = numtriangles;
|
||||
numtriangles++;
|
||||
}
|
||||
} else if (sscanf(buf, "%d/%d", &v, &t) == 2) {
|
||||
/* v/t */
|
||||
T(numtriangles).vindices[0] = v;
|
||||
T(numtriangles).tindices[0] = t;
|
||||
fscanf(file, "%d/%d", &v, &t);
|
||||
T(numtriangles).vindices[1] = v;
|
||||
T(numtriangles).tindices[1] = t;
|
||||
fscanf(file, "%d/%d", &v, &t);
|
||||
T(numtriangles).vindices[2] = v;
|
||||
T(numtriangles).tindices[2] = t;
|
||||
group->triangles[group->numtriangles++] = numtriangles;
|
||||
group->hastexcoords = true;
|
||||
numtriangles++;
|
||||
while(fscanf(file, "%d/%d", &v, &t) > 0) {
|
||||
T(numtriangles).vindices[0] = T(numtriangles-1).vindices[0];
|
||||
T(numtriangles).tindices[0] = T(numtriangles-1).tindices[0];
|
||||
T(numtriangles).vindices[1] = T(numtriangles-1).vindices[2];
|
||||
T(numtriangles).tindices[1] = T(numtriangles-1).tindices[2];
|
||||
T(numtriangles).vindices[2] = v;
|
||||
T(numtriangles).tindices[2] = t;
|
||||
group->triangles[group->numtriangles++] = numtriangles;
|
||||
numtriangles++;
|
||||
}
|
||||
/* v/t */
|
||||
T(numtriangles).vindices[0] = v;
|
||||
T(numtriangles).tindices[0] = t;
|
||||
fscanf(file, "%d/%d", &v, &t);
|
||||
T(numtriangles).vindices[1] = v;
|
||||
T(numtriangles).tindices[1] = t;
|
||||
fscanf(file, "%d/%d", &v, &t);
|
||||
T(numtriangles).vindices[2] = v;
|
||||
T(numtriangles).tindices[2] = t;
|
||||
group->triangles[group->numtriangles++] = numtriangles;
|
||||
group->hastexcoords = true;
|
||||
numtriangles++;
|
||||
while(fscanf(file, "%d/%d", &v, &t) > 0) {
|
||||
T(numtriangles).vindices[0] = T(numtriangles-1).vindices[0];
|
||||
T(numtriangles).tindices[0] = T(numtriangles-1).tindices[0];
|
||||
T(numtriangles).vindices[1] = T(numtriangles-1).vindices[2];
|
||||
T(numtriangles).tindices[1] = T(numtriangles-1).tindices[2];
|
||||
T(numtriangles).vindices[2] = v;
|
||||
T(numtriangles).tindices[2] = t;
|
||||
group->triangles[group->numtriangles++] = numtriangles;
|
||||
numtriangles++;
|
||||
}
|
||||
} else {
|
||||
/* v */
|
||||
sscanf(buf, "%d", &v);
|
||||
T(numtriangles).vindices[0] = v;
|
||||
fscanf(file, "%d", &v);
|
||||
T(numtriangles).vindices[1] = v;
|
||||
fscanf(file, "%d", &v);
|
||||
T(numtriangles).vindices[2] = v;
|
||||
group->triangles[group->numtriangles++] = numtriangles;
|
||||
numtriangles++;
|
||||
while(fscanf(file, "%d", &v) > 0) {
|
||||
T(numtriangles).vindices[0] = T(numtriangles-1).vindices[0];
|
||||
T(numtriangles).vindices[1] = T(numtriangles-1).vindices[2];
|
||||
T(numtriangles).vindices[2] = v;
|
||||
group->triangles[group->numtriangles++] = numtriangles;
|
||||
numtriangles++;
|
||||
}
|
||||
/* v */
|
||||
sscanf(buf, "%d", &v);
|
||||
T(numtriangles).vindices[0] = v;
|
||||
fscanf(file, "%d", &v);
|
||||
T(numtriangles).vindices[1] = v;
|
||||
fscanf(file, "%d", &v);
|
||||
T(numtriangles).vindices[2] = v;
|
||||
group->triangles[group->numtriangles++] = numtriangles;
|
||||
numtriangles++;
|
||||
while(fscanf(file, "%d", &v) > 0) {
|
||||
T(numtriangles).vindices[0] = T(numtriangles-1).vindices[0];
|
||||
T(numtriangles).vindices[1] = T(numtriangles-1).vindices[2];
|
||||
T(numtriangles).vindices[2] = v;
|
||||
group->triangles[group->numtriangles++] = numtriangles;
|
||||
numtriangles++;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
@ -837,10 +841,10 @@ _glmSecondPass(GLMmodel* model, FILE* file)
|
||||
#if 0
|
||||
/* announce the memory requirements */
|
||||
printf(" Memory: %d bytes\n",
|
||||
numvertices * 3*sizeof(GLfloat) +
|
||||
numnormals * 3*sizeof(GLfloat) * (numnormals ? 1 : 0) +
|
||||
numtexcoords * 3*sizeof(GLfloat) * (numtexcoords ? 1 : 0) +
|
||||
numtriangles * sizeof(GLMtriangle));
|
||||
numvertices * 3*sizeof(GLfloat) +
|
||||
numnormals * 3*sizeof(GLfloat) * (numnormals ? 1 : 0) +
|
||||
numtexcoords * 3*sizeof(GLfloat) * (numtexcoords ? 1 : 0) +
|
||||
numtriangles * sizeof(GLMtriangle));
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -1042,7 +1046,7 @@ glmFacetNormals(GLMmodel* model)
|
||||
/* allocate memory for the new facet normals */
|
||||
model->numfacetnorms = model->numtriangles;
|
||||
model->facetnorms = (GLfloat*)malloc(sizeof(GLfloat) *
|
||||
3 * (model->numfacetnorms + 1));
|
||||
3 * (model->numfacetnorms + 1));
|
||||
|
||||
for (i = 0; i < model->numtriangles; i++) {
|
||||
model->triangles[i].findex = i+1;
|
||||
@ -1148,15 +1152,15 @@ glmVertexNormals(GLMmodel* model, GLfloat angle)
|
||||
angle -- or, said another way, the angle between the two
|
||||
facet normals is less than (or equal to) the threshold angle */
|
||||
dot = _glmDot(&model->facetnorms[3 * T(node->index).findex],
|
||||
&model->facetnorms[3 * T(members[i]->index).findex]);
|
||||
&model->facetnorms[3 * T(members[i]->index).findex]);
|
||||
if (dot > cos_angle) {
|
||||
node->averaged = GL_TRUE;
|
||||
average[0] += model->facetnorms[3 * T(node->index).findex + 0];
|
||||
average[1] += model->facetnorms[3 * T(node->index).findex + 1];
|
||||
average[2] += model->facetnorms[3 * T(node->index).findex + 2];
|
||||
avg = 1; /* we averaged at least one normal! */
|
||||
node->averaged = GL_TRUE;
|
||||
average[0] += model->facetnorms[3 * T(node->index).findex + 0];
|
||||
average[1] += model->facetnorms[3 * T(node->index).findex + 1];
|
||||
average[2] += model->facetnorms[3 * T(node->index).findex + 2];
|
||||
avg = 1; /* we averaged at least one normal! */
|
||||
} else {
|
||||
node->averaged = GL_FALSE;
|
||||
node->averaged = GL_FALSE;
|
||||
}
|
||||
node = node->next;
|
||||
}
|
||||
@ -1177,28 +1181,28 @@ glmVertexNormals(GLMmodel* model, GLfloat angle)
|
||||
node = members[i];
|
||||
while (node) {
|
||||
if (node->averaged) {
|
||||
/* if this node was averaged, use the average normal */
|
||||
if (T(node->index).vindices[0] == i)
|
||||
T(node->index).nindices[0] = avg;
|
||||
else if (T(node->index).vindices[1] == i)
|
||||
T(node->index).nindices[1] = avg;
|
||||
else if (T(node->index).vindices[2] == i)
|
||||
T(node->index).nindices[2] = avg;
|
||||
/* if this node was averaged, use the average normal */
|
||||
if (T(node->index).vindices[0] == i)
|
||||
T(node->index).nindices[0] = avg;
|
||||
else if (T(node->index).vindices[1] == i)
|
||||
T(node->index).nindices[1] = avg;
|
||||
else if (T(node->index).vindices[2] == i)
|
||||
T(node->index).nindices[2] = avg;
|
||||
} else {
|
||||
/* if this node wasn't averaged, use the facet normal */
|
||||
model->normals[3 * numnormals + 0] =
|
||||
model->facetnorms[3 * T(node->index).findex + 0];
|
||||
model->normals[3 * numnormals + 1] =
|
||||
model->facetnorms[3 * T(node->index).findex + 1];
|
||||
model->normals[3 * numnormals + 2] =
|
||||
model->facetnorms[3 * T(node->index).findex + 2];
|
||||
if (T(node->index).vindices[0] == i)
|
||||
T(node->index).nindices[0] = numnormals;
|
||||
else if (T(node->index).vindices[1] == i)
|
||||
T(node->index).nindices[1] = numnormals;
|
||||
else if (T(node->index).vindices[2] == i)
|
||||
T(node->index).nindices[2] = numnormals;
|
||||
numnormals++;
|
||||
/* if this node wasn't averaged, use the facet normal */
|
||||
model->normals[3 * numnormals + 0] =
|
||||
model->facetnorms[3 * T(node->index).findex + 0];
|
||||
model->normals[3 * numnormals + 1] =
|
||||
model->facetnorms[3 * T(node->index).findex + 1];
|
||||
model->normals[3 * numnormals + 2] =
|
||||
model->facetnorms[3 * T(node->index).findex + 2];
|
||||
if (T(node->index).vindices[0] == i)
|
||||
T(node->index).nindices[0] = numnormals;
|
||||
else if (T(node->index).vindices[1] == i)
|
||||
T(node->index).nindices[1] = numnormals;
|
||||
else if (T(node->index).vindices[2] == i)
|
||||
T(node->index).nindices[2] = numnormals;
|
||||
numnormals++;
|
||||
}
|
||||
node = node->next;
|
||||
}
|
||||
@ -1280,7 +1284,7 @@ glmLinearTexture(GLMmodel* model)
|
||||
|
||||
#if 0
|
||||
printf("glmLinearTexture(): generated %d linear texture coordinates\n",
|
||||
model->numtexcoords);
|
||||
model->numtexcoords);
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -1312,32 +1316,32 @@ glmSpheremapTexture(GLMmodel* model)
|
||||
|
||||
/* do the calculations */
|
||||
for (i = 1; i <= model->numnormals; i++) {
|
||||
z = model->normals[3 * i + 0]; /* re-arrange for pole distortion */
|
||||
z = model->normals[3 * i + 0]; /* re-arrange for pole distortion */
|
||||
y = model->normals[3 * i + 1];
|
||||
x = model->normals[3 * i + 2];
|
||||
r = sqrtf((x * x) + (y * y));
|
||||
rho = sqrtf((r * r) + (z * z));
|
||||
|
||||
if(r == 0.0f) {
|
||||
theta = 0.0f;
|
||||
phi = 0.0f;
|
||||
theta = 0.0f;
|
||||
phi = 0.0f;
|
||||
} else {
|
||||
if(z == 0.0)
|
||||
phi = 3.14159265f / 2.0f;
|
||||
phi = 3.14159265f / 2.0f;
|
||||
else
|
||||
phi = acosf(z / rho);
|
||||
phi = acosf(z / rho);
|
||||
|
||||
#if WE_DONT_NEED_THIS_CODE
|
||||
if(x == 0.0)
|
||||
theta = 3.14159265f / 2.0f; /* asin(y / r); */
|
||||
theta = 3.14159265f / 2.0f; /* asin(y / r); */
|
||||
else
|
||||
theta = acos(x / r);
|
||||
theta = acos(x / r);
|
||||
#endif
|
||||
|
||||
if(y == 0.0)
|
||||
theta = 3.141592365f / 2.0f; /* acos(x / r); */
|
||||
theta = 3.141592365f / 2.0f; /* acos(x / r); */
|
||||
else
|
||||
theta = asinf(y / r) + 3.14159265f / 2.0f;
|
||||
theta = asinf(y / r) + 3.14159265f / 2.0f;
|
||||
}
|
||||
|
||||
model->texcoords[2 * i + 0] = theta / 3.14159265f;
|
||||
@ -1357,7 +1361,7 @@ glmSpheremapTexture(GLMmodel* model)
|
||||
|
||||
#if 0
|
||||
printf("glmSpheremapTexture(): generated %d spheremap texture coordinates\n",
|
||||
model->numtexcoords);
|
||||
model->numtexcoords);
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -1415,9 +1419,9 @@ glmReadOBJ(char* filename)
|
||||
file = fopen(filename, "r");
|
||||
if (!file) {
|
||||
fprintf(stderr, "glmReadOBJ() failed: can't open data file \"%s\".\n",
|
||||
filename);
|
||||
filename);
|
||||
//exit(1);
|
||||
return NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#if 0
|
||||
@ -1453,16 +1457,16 @@ glmReadOBJ(char* filename)
|
||||
|
||||
/* allocate memory */
|
||||
model->vertices = (GLfloat*)malloc(sizeof(GLfloat) *
|
||||
3 * (model->numvertices + 1));
|
||||
3 * (model->numvertices + 1));
|
||||
model->triangles = (GLMtriangle*)malloc(sizeof(GLMtriangle) *
|
||||
model->numtriangles);
|
||||
model->numtriangles);
|
||||
if (model->numnormals) {
|
||||
model->normals = (GLfloat*)malloc(sizeof(GLfloat) *
|
||||
3 * (model->numnormals + 1));
|
||||
3 * (model->numnormals + 1));
|
||||
}
|
||||
if (model->numtexcoords) {
|
||||
model->texcoords = (GLfloat*)malloc(sizeof(GLfloat) *
|
||||
2 * (model->numtexcoords + 1));
|
||||
2 * (model->numtexcoords + 1));
|
||||
}
|
||||
|
||||
/* rewind to beginning of file and read in the data this pass */
|
||||
@ -1503,22 +1507,22 @@ glmWriteOBJ(GLMmodel* model, char* filename, unsigned int mode)
|
||||
/* do a bit of warning */
|
||||
if (mode & GLM_FLAT && !model->facetnorms) {
|
||||
printf("glmWriteOBJ() warning: flat normal output requested "
|
||||
"with no facet normals defined.\n");
|
||||
"with no facet normals defined.\n");
|
||||
mode &= ~GLM_FLAT;
|
||||
}
|
||||
if (mode & GLM_SMOOTH && !model->normals) {
|
||||
printf("glmWriteOBJ() warning: smooth normal output requested "
|
||||
"with no normals defined.\n");
|
||||
"with no normals defined.\n");
|
||||
mode &= ~GLM_SMOOTH;
|
||||
}
|
||||
if (mode & GLM_TEXTURE && !model->texcoords) {
|
||||
printf("glmWriteOBJ() warning: texture coordinate output requested "
|
||||
"with no texture coordinates defined.\n");
|
||||
"with no texture coordinates defined.\n");
|
||||
mode &= ~GLM_TEXTURE;
|
||||
}
|
||||
if (mode & GLM_FLAT && mode & GLM_SMOOTH) {
|
||||
printf("glmWriteOBJ() warning: flat normal output requested "
|
||||
"and smooth normal output requested (using smooth).\n");
|
||||
"and smooth normal output requested (using smooth).\n");
|
||||
mode &= ~GLM_FLAT;
|
||||
}
|
||||
|
||||
@ -1526,9 +1530,9 @@ glmWriteOBJ(GLMmodel* model, char* filename, unsigned int mode)
|
||||
file = fopen(filename, "w");
|
||||
if (!file) {
|
||||
fprintf(stderr, "glmWriteOBJ() failed: can't open file \"%s\" to write.\n",
|
||||
filename);
|
||||
filename);
|
||||
//exit(1);
|
||||
return;
|
||||
return;
|
||||
}
|
||||
|
||||
/* spit out a header */
|
||||
@ -1550,9 +1554,9 @@ glmWriteOBJ(GLMmodel* model, char* filename, unsigned int mode)
|
||||
fprintf(file, "# %d vertices\n", model->numvertices);
|
||||
for (i = 1; i <= model->numvertices; i++) {
|
||||
fprintf(file, "v %f %f %f\n",
|
||||
model->vertices[3 * i + 0],
|
||||
model->vertices[3 * i + 1],
|
||||
model->vertices[3 * i + 2]);
|
||||
model->vertices[3 * i + 0],
|
||||
model->vertices[3 * i + 1],
|
||||
model->vertices[3 * i + 2]);
|
||||
}
|
||||
|
||||
/* spit out the smooth/flat normals */
|
||||
@ -1561,18 +1565,18 @@ glmWriteOBJ(GLMmodel* model, char* filename, unsigned int mode)
|
||||
fprintf(file, "# %d normals\n", model->numnormals);
|
||||
for (i = 1; i <= model->numnormals; i++) {
|
||||
fprintf(file, "vn %f %f %f\n",
|
||||
model->normals[3 * i + 0],
|
||||
model->normals[3 * i + 1],
|
||||
model->normals[3 * i + 2]);
|
||||
model->normals[3 * i + 0],
|
||||
model->normals[3 * i + 1],
|
||||
model->normals[3 * i + 2]);
|
||||
}
|
||||
} else if (mode & GLM_FLAT) {
|
||||
fprintf(file, "\n");
|
||||
fprintf(file, "# %d normals\n", model->numfacetnorms);
|
||||
for (i = 1; i <= model->numnormals; i++) {
|
||||
fprintf(file, "vn %f %f %f\n",
|
||||
model->facetnorms[3 * i + 0],
|
||||
model->facetnorms[3 * i + 1],
|
||||
model->facetnorms[3 * i + 2]);
|
||||
model->facetnorms[3 * i + 0],
|
||||
model->facetnorms[3 * i + 1],
|
||||
model->facetnorms[3 * i + 2]);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1582,8 +1586,8 @@ glmWriteOBJ(GLMmodel* model, char* filename, unsigned int mode)
|
||||
fprintf(file, "# %d texcoords\n", model->numtexcoords);
|
||||
for (i = 1; i <= model->numtexcoords; i++) {
|
||||
fprintf(file, "vt %f %f\n",
|
||||
model->texcoords[2 * i + 0],
|
||||
model->texcoords[2 * i + 1]);
|
||||
model->texcoords[2 * i + 0],
|
||||
model->texcoords[2 * i + 1]);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1599,53 +1603,53 @@ glmWriteOBJ(GLMmodel* model, char* filename, unsigned int mode)
|
||||
fprintf(file, "usemtl %s\n", model->materials[group->material].name);
|
||||
for (i = 0; i < group->numtriangles; i++) {
|
||||
if (mode & GLM_SMOOTH && mode & GLM_TEXTURE) {
|
||||
fprintf(file, "f %d/%d/%d %d/%d/%d %d/%d/%d\n",
|
||||
T(group->triangles[i]).vindices[0],
|
||||
T(group->triangles[i]).nindices[0],
|
||||
T(group->triangles[i]).tindices[0],
|
||||
T(group->triangles[i]).vindices[1],
|
||||
T(group->triangles[i]).nindices[1],
|
||||
T(group->triangles[i]).tindices[1],
|
||||
T(group->triangles[i]).vindices[2],
|
||||
T(group->triangles[i]).nindices[2],
|
||||
T(group->triangles[i]).tindices[2]);
|
||||
fprintf(file, "f %d/%d/%d %d/%d/%d %d/%d/%d\n",
|
||||
T(group->triangles[i]).vindices[0],
|
||||
T(group->triangles[i]).nindices[0],
|
||||
T(group->triangles[i]).tindices[0],
|
||||
T(group->triangles[i]).vindices[1],
|
||||
T(group->triangles[i]).nindices[1],
|
||||
T(group->triangles[i]).tindices[1],
|
||||
T(group->triangles[i]).vindices[2],
|
||||
T(group->triangles[i]).nindices[2],
|
||||
T(group->triangles[i]).tindices[2]);
|
||||
} else if (mode & GLM_FLAT && mode & GLM_TEXTURE) {
|
||||
fprintf(file, "f %d/%d %d/%d %d/%d\n",
|
||||
T(group->triangles[i]).vindices[0],
|
||||
T(group->triangles[i]).findex,
|
||||
T(group->triangles[i]).vindices[1],
|
||||
T(group->triangles[i]).findex,
|
||||
T(group->triangles[i]).vindices[2],
|
||||
T(group->triangles[i]).findex);
|
||||
fprintf(file, "f %d/%d %d/%d %d/%d\n",
|
||||
T(group->triangles[i]).vindices[0],
|
||||
T(group->triangles[i]).findex,
|
||||
T(group->triangles[i]).vindices[1],
|
||||
T(group->triangles[i]).findex,
|
||||
T(group->triangles[i]).vindices[2],
|
||||
T(group->triangles[i]).findex);
|
||||
} else if (mode & GLM_TEXTURE) {
|
||||
fprintf(file, "f %d/%d %d/%d %d/%d\n",
|
||||
T(group->triangles[i]).vindices[0],
|
||||
T(group->triangles[i]).tindices[0],
|
||||
T(group->triangles[i]).vindices[1],
|
||||
T(group->triangles[i]).tindices[1],
|
||||
T(group->triangles[i]).vindices[2],
|
||||
T(group->triangles[i]).tindices[2]);
|
||||
fprintf(file, "f %d/%d %d/%d %d/%d\n",
|
||||
T(group->triangles[i]).vindices[0],
|
||||
T(group->triangles[i]).tindices[0],
|
||||
T(group->triangles[i]).vindices[1],
|
||||
T(group->triangles[i]).tindices[1],
|
||||
T(group->triangles[i]).vindices[2],
|
||||
T(group->triangles[i]).tindices[2]);
|
||||
} else if (mode & GLM_SMOOTH) {
|
||||
fprintf(file, "f %d//%d %d//%d %d//%d\n",
|
||||
T(group->triangles[i]).vindices[0],
|
||||
T(group->triangles[i]).nindices[0],
|
||||
T(group->triangles[i]).vindices[1],
|
||||
T(group->triangles[i]).nindices[1],
|
||||
T(group->triangles[i]).vindices[2],
|
||||
T(group->triangles[i]).nindices[2]);
|
||||
fprintf(file, "f %d//%d %d//%d %d//%d\n",
|
||||
T(group->triangles[i]).vindices[0],
|
||||
T(group->triangles[i]).nindices[0],
|
||||
T(group->triangles[i]).vindices[1],
|
||||
T(group->triangles[i]).nindices[1],
|
||||
T(group->triangles[i]).vindices[2],
|
||||
T(group->triangles[i]).nindices[2]);
|
||||
} else if (mode & GLM_FLAT) {
|
||||
fprintf(file, "f %d//%d %d//%d %d//%d\n",
|
||||
T(group->triangles[i]).vindices[0],
|
||||
T(group->triangles[i]).findex,
|
||||
T(group->triangles[i]).vindices[1],
|
||||
T(group->triangles[i]).findex,
|
||||
T(group->triangles[i]).vindices[2],
|
||||
T(group->triangles[i]).findex);
|
||||
fprintf(file, "f %d//%d %d//%d %d//%d\n",
|
||||
T(group->triangles[i]).vindices[0],
|
||||
T(group->triangles[i]).findex,
|
||||
T(group->triangles[i]).vindices[1],
|
||||
T(group->triangles[i]).findex,
|
||||
T(group->triangles[i]).vindices[2],
|
||||
T(group->triangles[i]).findex);
|
||||
} else {
|
||||
fprintf(file, "f %d %d %d\n",
|
||||
T(group->triangles[i]).vindices[0],
|
||||
T(group->triangles[i]).vindices[1],
|
||||
T(group->triangles[i]).vindices[2]);
|
||||
fprintf(file, "f %d %d %d\n",
|
||||
T(group->triangles[i]).vindices[0],
|
||||
T(group->triangles[i]).vindices[1],
|
||||
T(group->triangles[i]).vindices[2]);
|
||||
}
|
||||
}
|
||||
fprintf(file, "\n");
|
||||
@ -1677,7 +1681,7 @@ glmWeld(GLMmodel* model, GLfloat epsilon)
|
||||
copies = _glmWeldVectors(vectors, &numvectors, epsilon);
|
||||
|
||||
printf("glmWeld(): %d redundant vertices.\n",
|
||||
model->numvertices - numvectors - 1);
|
||||
model->numvertices - numvectors - 1);
|
||||
|
||||
for (i = 0; i < model->numtriangles; i++) {
|
||||
T(i).vindices[0] = (unsigned int)vectors[3 * T(i).vindices[0] + 0];
|
||||
@ -1691,7 +1695,7 @@ glmWeld(GLMmodel* model, GLfloat epsilon)
|
||||
/* allocate space for the new vertices */
|
||||
model->numvertices = numvectors;
|
||||
model->vertices = (GLfloat*)malloc(sizeof(GLfloat) *
|
||||
3 * (model->numvertices + 1));
|
||||
3 * (model->numvertices + 1));
|
||||
|
||||
/* copy the optimized vertices into the actual vertex list */
|
||||
for (i = 1; i <= model->numvertices; i++) {
|
||||
@ -1712,7 +1716,7 @@ glmWeld(GLMmodel* model, GLfloat epsilon)
|
||||
copies = _glmOptimizeVectors(vectors, &numvectors);
|
||||
|
||||
printf("glmOptimize(): %d redundant normals.\n",
|
||||
model->numnormals - numvectors);
|
||||
model->numnormals - numvectors);
|
||||
|
||||
for (i = 0; i < model->numtriangles; i++) {
|
||||
T(i).nindices[0] = (unsigned int)vectors[3 * T(i).nindices[0] + 0];
|
||||
@ -1726,7 +1730,7 @@ glmWeld(GLMmodel* model, GLfloat epsilon)
|
||||
/* allocate space for the new normals */
|
||||
model->numnormals = numvectors;
|
||||
model->normals = (GLfloat*)malloc(sizeof(GLfloat) *
|
||||
3 * (model->numnormals + 1));
|
||||
3 * (model->numnormals + 1));
|
||||
|
||||
/* copy the optimized vertices into the actual vertex list */
|
||||
for (i = 1; i <= model->numnormals; i++) {
|
||||
@ -1745,7 +1749,7 @@ glmWeld(GLMmodel* model, GLfloat epsilon)
|
||||
copies = _glmOptimizeVectors(vectors, &numvectors);
|
||||
|
||||
printf("glmOptimize(): %d redundant texcoords.\n",
|
||||
model->numtexcoords - numvectors);
|
||||
model->numtexcoords - numvectors);
|
||||
|
||||
for (i = 0; i < model->numtriangles; i++) {
|
||||
for (j = 0; j < 3; j++) {
|
||||
@ -1759,7 +1763,7 @@ glmWeld(GLMmodel* model, GLfloat epsilon)
|
||||
/* allocate space for the new texcoords */
|
||||
model->numtexcoords = numvectors;
|
||||
model->texcoords = (GLfloat*)malloc(sizeof(GLfloat) *
|
||||
2 * (model->numtexcoords + 1));
|
||||
2 * (model->numtexcoords + 1));
|
||||
|
||||
/* copy the optimized vertices into the actual vertex list */
|
||||
for (i = 1; i <= model->numtexcoords; i++) {
|
||||
@ -1778,9 +1782,9 @@ glmWeld(GLMmodel* model, GLfloat epsilon)
|
||||
for (i = 1; i <= model->numvertices; i++) {
|
||||
for (j = 0; j < model->numtriangles; i++) {
|
||||
if (T(j).vindices[0] == i ||
|
||||
T(j).vindices[1] == i ||
|
||||
T(j).vindices[1] == i)
|
||||
break;
|
||||
T(j).vindices[1] == i ||
|
||||
T(j).vindices[1] == i)
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
@ -24,12 +24,12 @@
|
||||
|
||||
|
||||
/* defines */
|
||||
#define GLM_NONE (0) /* render with only vertices */
|
||||
#define GLM_FLAT (1 << 0) /* render with facet normals */
|
||||
#define GLM_SMOOTH (1 << 1) /* render with vertex normals */
|
||||
#define GLM_TEXTURE (1 << 2) /* render with texture coords */
|
||||
#define GLM_COLOR (1 << 3) /* render with colors */
|
||||
#define GLM_MATERIAL (1 << 4) /* render with materials */
|
||||
#define GLM_NONE (0) /* render with only vertices */
|
||||
#define GLM_FLAT (1 << 0) /* render with facet normals */
|
||||
#define GLM_SMOOTH (1 << 1) /* render with vertex normals */
|
||||
#define GLM_TEXTURE (1 << 2) /* render with texture coords */
|
||||
#define GLM_COLOR (1 << 3) /* render with colors */
|
||||
#define GLM_MATERIAL (1 << 4) /* render with materials */
|
||||
|
||||
|
||||
/* structs */
|
||||
@ -38,25 +38,27 @@
|
||||
*/
|
||||
struct GLMmaterial
|
||||
{
|
||||
char* name; /* name of material */
|
||||
GLfloat diffuse[4]; /* diffuse component */
|
||||
GLfloat ambient[4]; /* ambient component */
|
||||
GLfloat specular[4]; /* specular component */
|
||||
GLfloat emmissive[4]; /* emmissive component */
|
||||
GLfloat shininess; /* specular exponent */
|
||||
char* name; /* name of material */
|
||||
GLfloat diffuse[4]; /* diffuse component */
|
||||
GLfloat ambient[4]; /* ambient component */
|
||||
GLfloat specular[4]; /* specular component */
|
||||
GLfloat emmissive[4]; /* emmissive component */
|
||||
GLfloat shininess; /* specular exponent */
|
||||
char* textureName; /* name of any attached texture, add by RO */
|
||||
bool textureReflection; /* true if texture is a reflection map */
|
||||
float alpha; /* alpha */
|
||||
|
||||
void init()
|
||||
{
|
||||
name = NULL;
|
||||
diffuse[0] = diffuse[1] = diffuse[2] = 0.8f; diffuse[3] = 1.0f;
|
||||
ambient[0] = ambient[1] = ambient[2] = 0.2f; ambient[3] = 1.0f;
|
||||
specular[0] = specular[1] = specular[2] = 0.0f; specular[3] = 1.0f;
|
||||
emmissive[0] = emmissive[1] = emmissive[2] = 0.0f; emmissive[3] = 1.0f;
|
||||
shininess = 0.0f;
|
||||
textureName = NULL;
|
||||
textureReflection = false;
|
||||
name = NULL;
|
||||
diffuse[0] = diffuse[1] = diffuse[2] = 0.8f; diffuse[3] = 1.0f;
|
||||
ambient[0] = ambient[1] = ambient[2] = 0.2f; ambient[3] = 1.0f;
|
||||
specular[0] = specular[1] = specular[2] = 0.0f; specular[3] = 1.0f;
|
||||
emmissive[0] = emmissive[1] = emmissive[2] = 0.0f; emmissive[3] = 1.0f;
|
||||
shininess = 0.0f;
|
||||
textureName = NULL;
|
||||
textureReflection = false;
|
||||
alpha = 1.0f;
|
||||
}
|
||||
|
||||
};
|
||||
@ -64,97 +66,97 @@ struct GLMmaterial
|
||||
/* GLMtriangle: Structure that defines a triangle in a model.
|
||||
*/
|
||||
struct GLMtriangle {
|
||||
unsigned int vindices[3]; /* array of triangle vertex indices */
|
||||
unsigned int nindices[3]; /* array of triangle normal indices */
|
||||
unsigned int tindices[3]; /* array of triangle texcoord indices*/
|
||||
unsigned int findex; /* index of triangle facet normal */
|
||||
unsigned int vindices[3]; /* array of triangle vertex indices */
|
||||
unsigned int nindices[3]; /* array of triangle normal indices */
|
||||
unsigned int tindices[3]; /* array of triangle texcoord indices*/
|
||||
unsigned int findex; /* index of triangle facet normal */
|
||||
void init()
|
||||
{
|
||||
vindices[0] = vindices[2] = vindices[2] = 0 ;
|
||||
nindices[0] = nindices[2] = nindices[2] = 0 ;
|
||||
tindices[0] = tindices[2] = tindices[2] = 0 ;
|
||||
findex=0;
|
||||
vindices[0] = vindices[2] = vindices[2] = 0 ;
|
||||
nindices[0] = nindices[2] = nindices[2] = 0 ;
|
||||
tindices[0] = tindices[2] = tindices[2] = 0 ;
|
||||
findex=0;
|
||||
}
|
||||
};
|
||||
|
||||
/* GLMgroup: Structure that defines a group in a model.
|
||||
*/
|
||||
struct GLMgroup {
|
||||
char* name; /* name of this group */
|
||||
unsigned int numtriangles; /* number of triangles in this group */
|
||||
unsigned int* triangles; /* array of triangle indices */
|
||||
char* name; /* name of this group */
|
||||
unsigned int numtriangles; /* number of triangles in this group */
|
||||
unsigned int* triangles; /* array of triangle indices */
|
||||
unsigned int material; /* index to material for group */
|
||||
bool hastexcoords; /* set to true if triangles have texture coords */
|
||||
struct GLMgroup* next; /* pointer to next group in model */
|
||||
struct GLMgroup* next; /* pointer to next group in model */
|
||||
|
||||
void init()
|
||||
{
|
||||
name = NULL;
|
||||
numtriangles = 0;
|
||||
triangles = NULL;
|
||||
material = 0;
|
||||
name = NULL;
|
||||
numtriangles = 0;
|
||||
triangles = NULL;
|
||||
material = 0;
|
||||
hastexcoords = false;
|
||||
next = NULL;
|
||||
next = NULL;
|
||||
}
|
||||
};
|
||||
|
||||
/* GLMmodel: Structure that defines a model.
|
||||
*/
|
||||
struct GLMmodel {
|
||||
char* pathname; /* path to this model */
|
||||
char* mtllibname; /* name of the material library */
|
||||
char* pathname; /* path to this model */
|
||||
char* mtllibname; /* name of the material library */
|
||||
|
||||
unsigned int numvertices; /* number of vertices in model */
|
||||
GLfloat* vertices; /* array of vertices */
|
||||
unsigned int numvertices; /* number of vertices in model */
|
||||
GLfloat* vertices; /* array of vertices */
|
||||
|
||||
unsigned int numnormals; /* number of normals in model */
|
||||
GLfloat* normals; /* array of normals */
|
||||
unsigned int numnormals; /* number of normals in model */
|
||||
GLfloat* normals; /* array of normals */
|
||||
|
||||
unsigned int numtexcoords; /* number of texcoords in model */
|
||||
GLfloat* texcoords; /* array of texture coordinates */
|
||||
unsigned int numtexcoords; /* number of texcoords in model */
|
||||
GLfloat* texcoords; /* array of texture coordinates */
|
||||
|
||||
unsigned int numfacetnorms; /* number of facetnorms in model */
|
||||
GLfloat* facetnorms; /* array of facetnorms */
|
||||
unsigned int numfacetnorms; /* number of facetnorms in model */
|
||||
GLfloat* facetnorms; /* array of facetnorms */
|
||||
|
||||
unsigned int numtriangles; /* number of triangles in model */
|
||||
GLMtriangle* triangles; /* array of triangles */
|
||||
unsigned int numtriangles; /* number of triangles in model */
|
||||
GLMtriangle* triangles; /* array of triangles */
|
||||
|
||||
unsigned int nummaterials; /* number of materials in model */
|
||||
GLMmaterial* materials; /* array of materials */
|
||||
unsigned int nummaterials; /* number of materials in model */
|
||||
GLMmaterial* materials; /* array of materials */
|
||||
|
||||
unsigned int numgroups; /* number of groups in model */
|
||||
GLMgroup* groups; /* linked list of groups */
|
||||
unsigned int numgroups; /* number of groups in model */
|
||||
GLMgroup* groups; /* linked list of groups */
|
||||
|
||||
GLfloat position[3]; /* position of the model */
|
||||
GLfloat position[3]; /* position of the model */
|
||||
|
||||
|
||||
void init()
|
||||
{
|
||||
pathname = NULL;
|
||||
mtllibname = NULL;
|
||||
pathname = NULL;
|
||||
mtllibname = NULL;
|
||||
|
||||
numvertices = 0;
|
||||
vertices = NULL;
|
||||
numvertices = 0;
|
||||
vertices = NULL;
|
||||
|
||||
numnormals = 0;
|
||||
normals = NULL;
|
||||
numnormals = 0;
|
||||
normals = NULL;
|
||||
|
||||
numtexcoords = 0;
|
||||
texcoords = NULL;
|
||||
numtexcoords = 0;
|
||||
texcoords = NULL;
|
||||
|
||||
numfacetnorms = 0;
|
||||
facetnorms = NULL;
|
||||
numfacetnorms = 0;
|
||||
facetnorms = NULL;
|
||||
|
||||
numtriangles = 0;
|
||||
triangles = NULL;
|
||||
numtriangles = 0;
|
||||
triangles = NULL;
|
||||
|
||||
nummaterials = 0;
|
||||
materials = NULL;
|
||||
nummaterials = 0;
|
||||
materials = NULL;
|
||||
|
||||
numgroups = 0;
|
||||
groups = NULL;
|
||||
numgroups = 0;
|
||||
groups = NULL;
|
||||
|
||||
position[0] = position[1] = position[2] = 0.0f;
|
||||
position[0] = position[1] = position[2] = 0.0f;
|
||||
|
||||
}
|
||||
|
||||
|
@ -103,7 +103,7 @@ bool Geometry_readLocalData(Object& obj, Input& fr)
|
||||
{
|
||||
// post 0.9.3 releases.
|
||||
++fr;
|
||||
Vec3Array* vertices = dynamic_cast<Vec3Array*>(Array_readLocalData(fr));
|
||||
Array* vertices = Array_readLocalData(fr);
|
||||
if (vertices)
|
||||
{
|
||||
geom.setVertexArray(vertices);
|
||||
|
@ -62,6 +62,14 @@ bool Text_readLocalData(osg::Object &obj, osgDB::Input &fr)
|
||||
}
|
||||
}
|
||||
|
||||
if (fr.matchSequence("characterSizeMode %w"))
|
||||
{
|
||||
std::string str = fr[1].getStr();
|
||||
if (str=="OBJECT_COORDS") text.setCharacterSizeMode(osgText::Text::OBJECT_COORDS);
|
||||
else if (str=="SCREEN_COORDS") text.setCharacterSizeMode(osgText::Text::SCREEN_COORDS);
|
||||
else if (str=="OBJECT_COORDS_WITH_MAXIMUM_SCREEN_SIZE_CAPPED_BY_FONT_HEIGHT") text.setCharacterSizeMode(osgText::Text::OBJECT_COORDS_WITH_MAXIMUM_SCREEN_SIZE_CAPPED_BY_FONT_HEIGHT);
|
||||
}
|
||||
|
||||
// maximum dimentsions of text box.
|
||||
if (fr[0].matchWord("maximumWidth"))
|
||||
{
|
||||
@ -127,24 +135,6 @@ bool Text_readLocalData(osg::Object &obj, osgDB::Input &fr)
|
||||
}
|
||||
}
|
||||
|
||||
if (fr.matchSequence("scale %f"))
|
||||
{
|
||||
float scale;
|
||||
fr[1].getFloat(scale);
|
||||
text.setScale(scale);
|
||||
fr += 2;
|
||||
itAdvanced = true;
|
||||
}
|
||||
|
||||
if (fr.matchSequence("autoUpdateEyeMovementTolerance %f"))
|
||||
{
|
||||
float scale;
|
||||
fr[1].getFloat(scale);
|
||||
text.setAutoUpdateEyeMovementTolerance(scale);
|
||||
fr += 2;
|
||||
itAdvanced = true;
|
||||
}
|
||||
|
||||
if (fr.matchSequence("autoRotateToScreen TRUE"))
|
||||
{
|
||||
text.setAutoRotateToScreen(true);
|
||||
@ -154,7 +144,7 @@ bool Text_readLocalData(osg::Object &obj, osgDB::Input &fr)
|
||||
|
||||
if (fr.matchSequence("autoScaleToLimitScreenSizeToFontResolution TRUE"))
|
||||
{
|
||||
text.setAutoScaleToLimitScreenSizeToFontResolution(true);
|
||||
text.setCharacterSizeMode(osgText::Text::SCREEN_COORDS);
|
||||
fr += 2;
|
||||
itAdvanced = true;
|
||||
}
|
||||
@ -263,6 +253,14 @@ bool Text_writeLocalData(const osg::Object &obj, osgDB::Output &fw)
|
||||
// charater size.
|
||||
fw.indent() << "characterSize " << text.getCharacterHeight() << " " << text.getCharacterAspectRatio() << std::endl;
|
||||
|
||||
fw.indent() << "characterSizeMode ";
|
||||
switch(text.getCharacterSizeMode())
|
||||
{
|
||||
case osgText::Text::OBJECT_COORDS : fw<<"OBJECT_COORDS"<<std::endl; break;
|
||||
case osgText::Text::SCREEN_COORDS : fw<<"SCREEN_COORDS"<<std::endl; break;
|
||||
case osgText::Text::OBJECT_COORDS_WITH_MAXIMUM_SCREEN_SIZE_CAPPED_BY_FONT_HEIGHT: fw<<"OBJECT_COORDS_WITH_MAXIMUM_SCREEN_SIZE_CAPPED_BY_FONT_HEIGHT"<<std::endl; break;
|
||||
}
|
||||
|
||||
// maximum dimension of text box.
|
||||
if (text.getMaximumWidth()>0.0f)
|
||||
{
|
||||
@ -301,25 +299,11 @@ bool Text_writeLocalData(const osg::Object &obj, osgDB::Output &fw)
|
||||
fw.indent() << "rotation " << text.getRotation() << std::endl;
|
||||
}
|
||||
|
||||
if (text.getScale()!=1.0f)
|
||||
{
|
||||
fw.indent() << "scale " << text.getScale() << std::endl;
|
||||
}
|
||||
|
||||
if (text.getAutoUpdateEyeMovementTolerance()!=0.0f)
|
||||
{
|
||||
fw.indent() << "autoUpdateEyeMovementTolerance " << text.getAutoUpdateEyeMovementTolerance() << std::endl;
|
||||
}
|
||||
|
||||
if (text.getAutoRotateToScreen())
|
||||
{
|
||||
fw.indent() << "autoRotateToScreen TRUE"<< std::endl;
|
||||
}
|
||||
|
||||
if (text.getAutoScaleToLimitScreenSizeToFontResolution())
|
||||
{
|
||||
fw.indent() << "autoScaleToLimitScreenSizeToFontResolution TRUE"<< std::endl;
|
||||
}
|
||||
|
||||
// layout
|
||||
fw.indent() << "layout ";
|
||||
|
@ -28,6 +28,7 @@ TerrapageNode::~TerrapageNode()
|
||||
{
|
||||
// will the page manger delete the archive?
|
||||
delete _pageManager;
|
||||
_pageManager = 0L;
|
||||
}
|
||||
|
||||
void TerrapageNode::traverse(osg::NodeVisitor& nv)
|
||||
|
@ -199,7 +199,7 @@ bool OSGPageManager::StartThread(ThreadMode mode,ThreadID &newThread)
|
||||
DWORD dwThreadId=0;
|
||||
LPVOID dwThrdParam = (LPVOID) this;
|
||||
|
||||
newThread = CreateThread(
|
||||
threadID = newThread = CreateThread(
|
||||
NULL, // default security attributes
|
||||
0, // use default stack size
|
||||
ThreadFunc, // thread function
|
||||
@ -223,6 +223,7 @@ bool OSGPageManager::StartThread(ThreadMode mode,ThreadID &newThread)
|
||||
threadMode = mode;
|
||||
if( pthread_create( &newThread, 0L, ThreadFunc, (void *)this ) != 0 )
|
||||
threadMode = ThreadNone;
|
||||
threadID = newThread;
|
||||
#endif
|
||||
return threadMode != ThreadNone;
|
||||
}
|
||||
@ -232,10 +233,18 @@ bool OSGPageManager::StartThread(ThreadMode mode,ThreadID &newThread)
|
||||
*/
|
||||
bool OSGPageManager::EndThread()
|
||||
{
|
||||
cancel = true;
|
||||
// claer the path for thred loop to finish
|
||||
osgSetEvent(locationChangeEvent);
|
||||
#ifdef _WIN32
|
||||
DWORD res = STILL_ACTIVE;
|
||||
while(res==STILL_ACTIVE){
|
||||
GetExitCodeThread(threadID,&res);
|
||||
Sleep(100);
|
||||
}
|
||||
#else
|
||||
// Need a handle to the thread ID here.
|
||||
//pthread_cancel( ?newThread? );
|
||||
pthread_join( threadID, 0 );
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
@ -251,9 +260,10 @@ bool OSGPageManager::ThreadLoop()
|
||||
if (threadMode != ThreadFree)
|
||||
throw 1;
|
||||
|
||||
bool done = false;
|
||||
bool pagingActive = false;
|
||||
while (!done) {
|
||||
cancel = false;
|
||||
|
||||
while (!cancel) {
|
||||
/* Here's how we do it:
|
||||
Wait for position change
|
||||
Update manager w/ position
|
||||
@ -308,36 +318,39 @@ bool OSGPageManager::ThreadLoop()
|
||||
#endif
|
||||
|
||||
// Now do a single load
|
||||
tile = pageManage->GetNextLoad();
|
||||
osg::Group *tileGroup=NULL;
|
||||
pagingActive = false;
|
||||
if (tile) {
|
||||
osg::Group *parentNode = NULL;
|
||||
tileGroup = archive->LoadTile(NULL,pageManage,tile,&parentNode);
|
||||
pageManage->AckLoad();
|
||||
if (tileGroup) {
|
||||
while( (tile = pageManage->GetNextLoad()) ) // Sasa's new code - more frame drops, but less missing tiles.
|
||||
//if( (tile = pageManage->GetNextLoad()) ) // original code (0.9.4 and before) - less frame drops, more missing tiles.
|
||||
{
|
||||
osg::Group *tileGroup=NULL;
|
||||
pagingActive = false;
|
||||
osg::Group *parentNode = NULL;
|
||||
tileGroup = archive->LoadTile(NULL,pageManage,tile,&parentNode);
|
||||
pageManage->AckLoad();
|
||||
if (tileGroup) {
|
||||
#ifdef USE_THREADLOOP_DELETE
|
||||
// Make an extra reference to it because we want it back for deletion
|
||||
// RO, commenting out as we don't want to do delete here, we want it to happen in the merge thread.
|
||||
tileGroup->ref();
|
||||
// Make an extra reference to it because we want it back for deletion
|
||||
// RO, commenting out as we don't want to do delete here, we want it to happen in the merge thread.
|
||||
tileGroup->ref();
|
||||
#endif
|
||||
} else {
|
||||
int x,y,lod;
|
||||
tile->GetTileLoc(x,y,lod);
|
||||
fprintf(stderr,"Failed to load tile (%d,%d,%d)\n",x,y,lod);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int x,y,lod;
|
||||
tile->GetTileLoc(x,y,lod);
|
||||
fprintf(stderr,"Failed to load tile (%d,%d,%d)\n",x,y,lod);
|
||||
}
|
||||
|
||||
// Now add this tile to the merge list
|
||||
if (tileGroup) {
|
||||
osgLockMutex(changeListMutex);
|
||||
toMerge.push_back(tileGroup);
|
||||
toMergeParent.push_back(parentNode);
|
||||
osgUnLockMutex(changeListMutex);
|
||||
}
|
||||
// We're not necessarily done paging, we're just handing control back
|
||||
// It's likely we'll be back here
|
||||
pagingActive = true;
|
||||
}
|
||||
// Now add this tile to the merge list
|
||||
if (tileGroup) {
|
||||
osgLockMutex(changeListMutex);
|
||||
toMerge.push_back(tileGroup);
|
||||
toMergeParent.push_back(parentNode);
|
||||
osgUnLockMutex(changeListMutex);
|
||||
}
|
||||
// We're not necessarily done paging, we're just handing control back
|
||||
// It's likely we'll be back here
|
||||
pagingActive = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -146,6 +146,8 @@ namespace txp
|
||||
// Unhook list is filled in by the paging thread
|
||||
std::vector<osg::Group *> toUnhook;
|
||||
|
||||
volatile bool cancel;
|
||||
|
||||
#ifdef USE_THREADLOOP_DELETE
|
||||
// Main thread moves groups to the delete list as soon as they are unhooked
|
||||
std::vector<osg::Group *> toDelete;
|
||||
|
@ -18,4 +18,11 @@ LIB = $(LIB_PREFIX)$(TARGET_BASENAME).$(LIB_EXT)
|
||||
INC += $(PRODUCER_INCLUDE_DIR) -I/usr/X11R6/include
|
||||
LDFLAGS += $(PRODUCER_LIB_DIR)
|
||||
|
||||
ifeq ($(USE_OPEN_THREAD),1)
|
||||
DEF += -D_USE_OPEN_THREAD
|
||||
INC += $(INC_OPEN_THREAD)
|
||||
LDFLAGS += $(LIB_OPEN_THREAD)
|
||||
LIBS += -lOpenThread
|
||||
endif
|
||||
|
||||
include $(TOPDIR)/Make/makerules
|
||||
|
@ -187,24 +187,26 @@ void OsgCameraGroup::setUpSceneViewsWithData()
|
||||
{
|
||||
for(SceneHandlerList::iterator p = _shvec.begin(); p != _shvec.end(); p++ )
|
||||
{
|
||||
osgUtil::SceneView* sv = (*p)->getSceneView();
|
||||
|
||||
if (_scene_decorator.valid())
|
||||
{
|
||||
(*p)->setSceneData( _scene_decorator.get() );
|
||||
sv->setSceneData( _scene_decorator.get() );
|
||||
}
|
||||
else if (_scene_data.valid())
|
||||
{
|
||||
(*p)->setSceneData( _scene_data.get() );
|
||||
sv->setSceneData( _scene_data.get() );
|
||||
}
|
||||
else
|
||||
{
|
||||
(*p)->setSceneData( 0 );
|
||||
sv->setSceneData( 0 );
|
||||
}
|
||||
|
||||
(*p)->setFrameStamp( _frameStamp.get() );
|
||||
(*p)->setGlobalStateSet( _global_stateset.get() );
|
||||
(*p)->setBackgroundColor( _background_color );
|
||||
(*p)->setLODScale( _LODScale );
|
||||
(*p)->setFusionDistance( _fusionDistanceMode, _fusionDistanceValue );
|
||||
sv->setFrameStamp( _frameStamp.get() );
|
||||
sv->setGlobalStateSet( _global_stateset.get() );
|
||||
sv->setBackgroundColor( _background_color );
|
||||
sv->setLODScale( _LODScale );
|
||||
sv->setFusionDistance( _fusionDistanceMode, _fusionDistanceValue );
|
||||
}
|
||||
}
|
||||
|
||||
@ -317,14 +319,17 @@ bool OsgCameraGroup::realize()
|
||||
|
||||
// create the scene handler.
|
||||
osgProducer::OsgSceneHandler *sh = new osgProducer::OsgSceneHandler(_ds.get());
|
||||
sh->setDefaults();
|
||||
sh->getState()->setContextID(i);
|
||||
|
||||
osgUtil::SceneView* sv = sh->getSceneView();
|
||||
sv->setDefaults();
|
||||
|
||||
sh->setContextID(i);
|
||||
|
||||
_shvec.push_back( sh );
|
||||
cam->setSceneHandler( sh );
|
||||
|
||||
// set up the clear mask.
|
||||
osgUtil::RenderStage *stage = sh->getRenderStage();
|
||||
osgUtil::RenderStage *stage = sv->getRenderStage();
|
||||
if (stage) stage->setClearMask(clear_mask);
|
||||
|
||||
// set the realize callback.
|
||||
@ -363,7 +368,7 @@ bool OsgCameraGroup::realize()
|
||||
if( _global_stateset == NULL && _shvec.size() > 0 )
|
||||
{
|
||||
SceneHandlerList::iterator p = _shvec.begin();
|
||||
_global_stateset = (*p)->getGlobalStateSet();
|
||||
_global_stateset = (*p)->getSceneView()->getGlobalStateSet();
|
||||
}
|
||||
|
||||
setUpSceneViewsWithData();
|
||||
@ -430,9 +435,9 @@ void OsgCameraGroup::setView(const osg::Matrix& matrix)
|
||||
const osg::Matrix OsgCameraGroup::getViewMatrix() const
|
||||
{
|
||||
osg::Matrix matrix;
|
||||
if (_cfg && _cfg->getNumberOfCameras()>=1)
|
||||
if (_cfg.valid() && _cfg->getNumberOfCameras()>=1)
|
||||
{
|
||||
Producer::Camera *cam = _cfg->getCamera(0);
|
||||
const Producer::Camera *cam = _cfg->getCamera(0);
|
||||
matrix.set(cam->getViewMatrix());
|
||||
}
|
||||
return matrix;
|
||||
|
@ -18,10 +18,10 @@ using namespace osgUtil;
|
||||
using namespace osgProducer;
|
||||
|
||||
OsgSceneHandler::OsgSceneHandler( osg::DisplaySettings *ds) :
|
||||
osgUtil::SceneView(ds)
|
||||
_sceneView(new osgUtil::SceneView(ds))
|
||||
{
|
||||
setProjectionMatrix( new osg::RefMatrix );
|
||||
setModelViewMatrix( new osg::RefMatrix );
|
||||
_sceneView->setProjectionMatrix( new osg::RefMatrix );
|
||||
_sceneView->setModelViewMatrix( new osg::RefMatrix );
|
||||
}
|
||||
|
||||
void OsgSceneHandler::init()
|
||||
@ -31,7 +31,7 @@ void OsgSceneHandler::init()
|
||||
mutex.lock();
|
||||
osg::notify(osg::INFO)<<" running "<<this<<" init."<<std::endl;
|
||||
|
||||
SceneView::init();
|
||||
_sceneView->SceneView::init();
|
||||
|
||||
osg::notify(osg::INFO)<<" done "<<this<<" init."<<std::endl;
|
||||
mutex.unlock();
|
||||
@ -46,24 +46,24 @@ void OsgSceneHandler::clearImplementation(Producer::Camera& /*camera*/)
|
||||
void OsgSceneHandler::cullImplementation(Producer::Camera &cam)
|
||||
{
|
||||
|
||||
getProjectionMatrix()->set(cam.getProjectionMatrix());
|
||||
getModelViewMatrix()->set(cam.getPositionAndAttitudeMatrix());
|
||||
_sceneView->getProjectionMatrix()->set(cam.getProjectionMatrix());
|
||||
_sceneView->getModelViewMatrix()->set(cam.getPositionAndAttitudeMatrix());
|
||||
|
||||
int x, y;
|
||||
unsigned int w, h;
|
||||
cam.getProjectionRectangle( x, y, w, h );
|
||||
|
||||
setViewport( x, y, w, h );
|
||||
_sceneView->setViewport( x, y, w, h );
|
||||
|
||||
SceneView::cull();
|
||||
_sceneView->cull();
|
||||
}
|
||||
|
||||
void OsgSceneHandler::drawImplementation(Producer::Camera &)
|
||||
{
|
||||
SceneView::draw();
|
||||
_sceneView->SceneView::draw();
|
||||
}
|
||||
|
||||
void OsgSceneHandler::setContextID( int id )
|
||||
{
|
||||
getState()->setContextID( id );
|
||||
_sceneView->getState()->setContextID( id );
|
||||
}
|
||||
|
@ -128,7 +128,7 @@ private:
|
||||
// osgProducer::Viewer implemention
|
||||
//
|
||||
Viewer::Viewer():
|
||||
_done(0),
|
||||
_done(false),
|
||||
_kbmcb(0),
|
||||
_recordingAnimationPath(false)
|
||||
{
|
||||
@ -231,8 +231,8 @@ void Viewer::setUpViewer(unsigned int options)
|
||||
}
|
||||
|
||||
|
||||
if (!_updateVisitor) _updateVisitor = new osgUtil::UpdateVisitor;
|
||||
|
||||
_updateVisitor = new osgUtil::UpdateVisitor;
|
||||
_updateVisitor->setFrameStamp(_frameStamp.get());
|
||||
|
||||
if (options&TRACKBALL_MANIPULATOR) addCameraManipulator(new osgGA::TrackballManipulator);
|
||||
@ -320,7 +320,7 @@ bool Viewer::realize()
|
||||
// draw traversal.
|
||||
for(SceneHandlerList::iterator p=_shvec.begin(); p!=_shvec.end(); p++ )
|
||||
{
|
||||
(*p)->getState()->setAbortRenderingPtr(&_done);
|
||||
(*p)->getSceneView()->getState()->setAbortRenderingPtr(&_done);
|
||||
}
|
||||
|
||||
return _realized;
|
||||
@ -433,11 +433,12 @@ bool Viewer::computeNearFarPoints(float x,float y,unsigned int cameraNum,osg::Ve
|
||||
if (cameraNum>=getSceneHandlerList().size()) return false;
|
||||
|
||||
OsgSceneHandler* scenehandler = getSceneHandlerList()[cameraNum].get();
|
||||
osgUtil::SceneView* sv = scenehandler->getSceneView();
|
||||
|
||||
float pixel_x,pixel_y;
|
||||
if (computePixelCoords(x,y,cameraNum,pixel_x,pixel_y))
|
||||
{
|
||||
return scenehandler->projectWindowXYIntoObject((int)(pixel_x+0.5f),(int)(pixel_y+0.5f),near_point,far_point);
|
||||
return sv->projectWindowXYIntoObject((int)(pixel_x+0.5f),(int)(pixel_y+0.5f),near_point,far_point);
|
||||
}
|
||||
return false;
|
||||
|
||||
@ -462,11 +463,12 @@ bool Viewer::computeIntersections(float x,float y,unsigned int cameraNum,osgUtil
|
||||
//std::cout << " rx "<<rx<<" "<<ry<<std::endl;
|
||||
|
||||
osgProducer::OsgSceneHandler* sh = dynamic_cast<osgProducer::OsgSceneHandler*>(camera->getSceneHandler());
|
||||
osgUtil::SceneView* sv = sh?sh->getSceneView():0;
|
||||
osg::Matrix vum;
|
||||
if (sh!=0 && sh->getModelViewMatrix()!=0 && sh->getProjectionMatrix()!=0)
|
||||
if (sv!=0 && sv->getModelViewMatrix()!=0 && sv->getProjectionMatrix()!=0)
|
||||
{
|
||||
vum.set((*(sh->getModelViewMatrix())) *
|
||||
(*(sh->getProjectionMatrix())));
|
||||
vum.set((*(sv->getModelViewMatrix())) *
|
||||
(*(sv->getProjectionMatrix())));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -138,17 +138,18 @@ void ViewerEventHandler::StatsAndHelpDrawCallback::operator()( const Producer::C
|
||||
_viewport->setViewport(x,y,width,height);
|
||||
|
||||
OsgSceneHandler* osh = _veh->getOsgCameraGroup()->getSceneHandlerList()[_cameraNumber].get();
|
||||
osh->getState()->pushStateSet(_stateset.get());
|
||||
osgUtil::SceneView* sv = osh->getSceneView();
|
||||
sv->getState()->pushStateSet(_stateset.get());
|
||||
|
||||
if (_veh->getDisplayHelp()) displayHelp();
|
||||
|
||||
if (_veh->getFrameStatsMode()!=ViewerEventHandler::NO_STATS && camera.getInstrumentationMode())
|
||||
{
|
||||
osh->getState()->apply();
|
||||
sv->getState()->apply();
|
||||
displayStats();
|
||||
}
|
||||
|
||||
osh->getState()->popStateSet();
|
||||
sv->getState()->popStateSet();
|
||||
|
||||
}
|
||||
|
||||
@ -157,6 +158,7 @@ void ViewerEventHandler::StatsAndHelpDrawCallback::displayHelp()
|
||||
if (!_helpInitialized) createHelpText();
|
||||
|
||||
OsgSceneHandler* osh = _veh->getOsgCameraGroup()->getSceneHandlerList()[_cameraNumber].get();
|
||||
osgUtil::SceneView* sv = osh->getSceneView();
|
||||
|
||||
// should possibly update _viewport...
|
||||
|
||||
@ -180,21 +182,21 @@ void ViewerEventHandler::StatsAndHelpDrawCallback::displayHelp()
|
||||
ditr!=_descriptionList.end();
|
||||
++ditr)
|
||||
{
|
||||
(*ditr)->draw(*(osh->getState()));
|
||||
(*ditr)->draw(*(sv->getState()));
|
||||
}
|
||||
|
||||
for(TextList::iterator oitr=_optionList.begin();
|
||||
oitr!=_optionList.end();
|
||||
++oitr)
|
||||
{
|
||||
(*oitr)->draw(*(osh->getState()));
|
||||
(*oitr)->draw(*(sv->getState()));
|
||||
}
|
||||
|
||||
for(TextList::iterator eitr=_explanationList.begin();
|
||||
eitr!=_explanationList.end();
|
||||
++eitr)
|
||||
{
|
||||
(*eitr)->draw(*(osh->getState()));
|
||||
(*eitr)->draw(*(sv->getState()));
|
||||
}
|
||||
|
||||
|
||||
@ -360,6 +362,7 @@ void ViewerEventHandler::StatsAndHelpDrawCallback::displayStats()
|
||||
if (!_statsInitialized) createStatsText();
|
||||
|
||||
OsgSceneHandler* osh = _veh->getOsgCameraGroup()->getSceneHandlerList()[_cameraNumber].get();
|
||||
osgUtil::SceneView* sv = osh->getSceneView();
|
||||
|
||||
// render the text
|
||||
if (_veh->getFrameStatsMode()>=ViewerEventHandler::FRAME_RATE)
|
||||
@ -384,7 +387,7 @@ void ViewerEventHandler::StatsAndHelpDrawCallback::displayStats()
|
||||
|
||||
char tmpText[128];
|
||||
|
||||
_frameRateLabelText->draw(*(osh->getState()));
|
||||
_frameRateLabelText->draw(*(sv->getState()));
|
||||
|
||||
if (_fs.size()>1)
|
||||
{
|
||||
@ -394,7 +397,7 @@ void ViewerEventHandler::StatsAndHelpDrawCallback::displayStats()
|
||||
sprintf(tmpText,"%4.2f",1.0/timePerFrame);
|
||||
_frameRateCounterText->setText(tmpText);
|
||||
}
|
||||
_frameRateCounterText->draw(*(osh->getState()));
|
||||
_frameRateCounterText->draw(*(sv->getState()));
|
||||
|
||||
|
||||
if (_veh->getFrameStatsMode()>=ViewerEventHandler::CAMERA_STATS)
|
||||
@ -405,7 +408,7 @@ void ViewerEventHandler::StatsAndHelpDrawCallback::displayStats()
|
||||
itr!=_statsLabelList.end();
|
||||
++itr)
|
||||
{
|
||||
(*itr)->draw(*(osh->getState()));
|
||||
(*itr)->draw(*(sv->getState()));
|
||||
}
|
||||
|
||||
double updateTime = 0.0;
|
||||
@ -429,7 +432,7 @@ void ViewerEventHandler::StatsAndHelpDrawCallback::displayStats()
|
||||
sprintf(tmpText,"%4.2f",1000.0*updateTime/(double)_fs.size());
|
||||
_updateTimeText->setText(tmpText);
|
||||
|
||||
_updateTimeText->draw(*(osh->getState()));
|
||||
_updateTimeText->draw(*(sv->getState()));
|
||||
|
||||
CameraTimes::iterator titr;
|
||||
for(itr=_cullTimeText.begin(),titr = _cullTimes.begin();
|
||||
@ -438,7 +441,7 @@ void ViewerEventHandler::StatsAndHelpDrawCallback::displayStats()
|
||||
{
|
||||
sprintf(tmpText,"%4.2f",1000.0*(*titr)/(double)_fs.size());
|
||||
(*itr)->setText(tmpText);
|
||||
(*itr)->draw(*(osh->getState()));
|
||||
(*itr)->draw(*(sv->getState()));
|
||||
}
|
||||
for(itr=_drawTimeText.begin(),titr = _drawTimes.begin();
|
||||
itr!=_drawTimeText.end() && titr!=_cullTimes.end();
|
||||
@ -446,7 +449,7 @@ void ViewerEventHandler::StatsAndHelpDrawCallback::displayStats()
|
||||
{
|
||||
sprintf(tmpText,"%4.2f",1000.0*(*titr)/(double)_fs.size());
|
||||
(*itr)->setText(tmpText);
|
||||
(*itr)->draw(*(osh->getState()));
|
||||
(*itr)->draw(*(sv->getState()));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -10,6 +10,8 @@ CXXFILES = \
|
||||
Sector.cpp\
|
||||
Version.cpp\
|
||||
|
||||
# SphereSegment.cpp\
|
||||
|
||||
DEF += -DOSGSIM_LIBRARY
|
||||
|
||||
LIBS += -losg -losgUtil $(GL_LIBS) $(OTHER_LIBS)
|
||||
|
@ -41,7 +41,6 @@ LightPointDrawable::LightPointDrawable():
|
||||
_colorMaskOff = new osg::ColorMask;
|
||||
_colorMaskOff->setMask(false,false,false,false);
|
||||
|
||||
_point = new osg::Point;
|
||||
}
|
||||
|
||||
LightPointDrawable::LightPointDrawable(const LightPointDrawable& lpd,const osg::CopyOp& copyop):
|
||||
|
@ -116,7 +116,6 @@ class OSGSIM_EXPORT LightPointDrawable : public osg::Drawable
|
||||
osg::ref_ptr<osg::BlendFunc> _blendOne;
|
||||
osg::ref_ptr<osg::BlendFunc> _blendOneMinusSrcAlpha;
|
||||
osg::ref_ptr<osg::ColorMask> _colorMaskOff;
|
||||
osg::ref_ptr<osg::Point> _point;
|
||||
|
||||
|
||||
};
|
||||
|
@ -24,13 +24,29 @@
|
||||
|
||||
#include <typeinfo>
|
||||
|
||||
using namespace osgSim;
|
||||
namespace osgSim
|
||||
{
|
||||
|
||||
osg::StateSet* getSingletonLightPointStateSet()
|
||||
{
|
||||
static osg::ref_ptr<osg::StateSet> s_stateset = 0;
|
||||
if (!s_stateset)
|
||||
{
|
||||
s_stateset = new osg::StateSet;
|
||||
// force light point nodes to be drawn after everything else by picking a renderin bin number after
|
||||
// the transparent bin.
|
||||
s_stateset->setRenderBinDetails(20,"DepthSortedBin");
|
||||
}
|
||||
return s_stateset.get();
|
||||
}
|
||||
|
||||
|
||||
LightPointNode::LightPointNode():
|
||||
_minPixelSize(0.0f),
|
||||
_maxPixelSize(30.0f),
|
||||
_maxVisableDistance2(FLT_MAX)
|
||||
{
|
||||
setStateSet(getSingletonLightPointStateSet());
|
||||
}
|
||||
|
||||
/** Copy constructor using CopyOp to manage deep vs shallow copy.*/
|
||||
@ -66,6 +82,12 @@ bool LightPointNode::computeBound() const
|
||||
_bsphere.init();
|
||||
_bbox.init();
|
||||
|
||||
if (_lightPointList.empty())
|
||||
{
|
||||
_bsphere_computed=true;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
LightPointList::const_iterator itr;
|
||||
for(itr=_lightPointList.begin();
|
||||
@ -96,6 +118,12 @@ bool LightPointNode::computeBound() const
|
||||
|
||||
void LightPointNode::traverse(osg::NodeVisitor& nv)
|
||||
{
|
||||
if (_lightPointList.empty())
|
||||
{
|
||||
// no light points so no op.
|
||||
return;
|
||||
}
|
||||
|
||||
//#define USE_TIMER
|
||||
#ifdef USE_TIMER
|
||||
osg::Timer timer;
|
||||
@ -363,3 +391,4 @@ void LightPointNode::traverse(osg::NodeVisitor& nv)
|
||||
}
|
||||
|
||||
|
||||
} // end of namespace
|
||||
|
@ -1,3 +1,4 @@
|
||||
|
||||
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2003 Robert Osfield
|
||||
*
|
||||
* This library is open source and may be redistributed and/or modified under
|
||||
@ -459,6 +460,20 @@ void Font::GlyphTexture::apply(osg::State& state) const
|
||||
|
||||
}
|
||||
|
||||
static const GLubyte* s_renderer = 0;
|
||||
static bool s_subloadAllGlyphsTogether = false;
|
||||
if (!s_renderer)
|
||||
{
|
||||
s_renderer = glGetString(GL_RENDERER);
|
||||
osg::notify(osg::INFO)<<"glGetString(GL_RENDERER)=="<<s_renderer<<std::endl;
|
||||
if (strstr((const char*)s_renderer,"IMPACT")!=0)
|
||||
{
|
||||
// we're running on an Octane, so need to work around its
|
||||
// subloading bugs by loading all at once.
|
||||
s_subloadAllGlyphsTogether = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// now subload the glyphs that are outstanding for this graphics context.
|
||||
GlyphPtrList& glyphsWereSubloading = _glyphsToSubload[contextID];
|
||||
@ -466,15 +481,74 @@ void Font::GlyphTexture::apply(osg::State& state) const
|
||||
if (!glyphsWereSubloading.empty())
|
||||
{
|
||||
|
||||
for(GlyphPtrList::iterator itr=glyphsWereSubloading.begin();
|
||||
itr!=glyphsWereSubloading.end();
|
||||
++itr)
|
||||
if (!s_subloadAllGlyphsTogether)
|
||||
{
|
||||
(*itr)->subload();
|
||||
}
|
||||
// default way of subloading as required.
|
||||
|
||||
// clear the list since we have now subloaded them.
|
||||
glyphsWereSubloading.clear();
|
||||
//std::cout<<"subloading"<<std::endl;
|
||||
|
||||
for(GlyphPtrList::iterator itr=glyphsWereSubloading.begin();
|
||||
itr!=glyphsWereSubloading.end();
|
||||
++itr)
|
||||
{
|
||||
(*itr)->subload();
|
||||
}
|
||||
|
||||
// clear the list since we have now subloaded them.
|
||||
glyphsWereSubloading.clear();
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
//std::cout<<"all loading"<<std::endl;
|
||||
|
||||
// Octane has bugs in OGL driver which mean that subloads smaller
|
||||
// than 32x32 produce errors, and also cannot handle general alignment,
|
||||
// so to get round this copy all glyphs into a temporary image and
|
||||
// then subload the whole lot in one go.
|
||||
|
||||
int tsize = 2 * getTextureHeight() * getTextureWidth();
|
||||
unsigned char *local_data = new unsigned char[tsize];
|
||||
memset( local_data, 0L, tsize);
|
||||
|
||||
for(GlyphRefList::const_iterator itr=_glyphs.begin();
|
||||
itr!=_glyphs.end();
|
||||
++itr)
|
||||
{
|
||||
//(*itr)->subload();
|
||||
|
||||
// Rather than subloading to graphics, we'll write the values
|
||||
// of the glyphs into some intermediate data and subload the
|
||||
// whole thing at the end
|
||||
for( int t = 0; t < (*itr)->t(); t++ )
|
||||
{
|
||||
for( int s = 0; s < (*itr)->s(); s++ )
|
||||
{
|
||||
int sindex = 2 * (t*(*itr)->s()+s);
|
||||
int dindex = 2 *
|
||||
((((*itr)->getTexturePositionY()+t) * getTextureWidth()) +
|
||||
((*itr)->getTexturePositionX()+s));
|
||||
|
||||
const unsigned char *sptr = &(*itr)->data()[sindex];
|
||||
unsigned char *dptr = &local_data[dindex];
|
||||
|
||||
(*dptr++) = (*sptr++);
|
||||
(*dptr) = (*sptr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// clear the list since we have now subloaded them.
|
||||
glyphsWereSubloading.clear();
|
||||
|
||||
// Subload the image once
|
||||
glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0,
|
||||
getTextureWidth(),
|
||||
getTextureHeight(),
|
||||
GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, local_data );
|
||||
|
||||
delete [] local_data;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -556,7 +630,7 @@ void Font::Glyph::subload() const
|
||||
"\t "<<s()<<" ,"<<t()<<std::endl<<hex<<
|
||||
"\t 0x"<<(GLenum)getPixelFormat()<<std::endl<<
|
||||
"\t 0x"<<(GLenum)getDataType()<<std::endl<<
|
||||
"\t 0x"<<(unsigned int)data()<<");"<<dec<<std::endl;
|
||||
"\t 0x"<<(unsigned long)data()<<");"<<dec<<std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -22,121 +22,22 @@
|
||||
|
||||
using namespace osgText;
|
||||
|
||||
struct TextCullCallback : public osg::Drawable::CullCallback
|
||||
{
|
||||
|
||||
struct PositionData
|
||||
{
|
||||
PositionData():
|
||||
_traversalNumber(-1),
|
||||
_previousWidth(0),
|
||||
_previousHeight(0) {}
|
||||
|
||||
int _traversalNumber;
|
||||
int _previousWidth;
|
||||
int _previousHeight;
|
||||
osg::Vec3 _eyePosition;
|
||||
};
|
||||
|
||||
TextCullCallback(osgText::Text* text):
|
||||
_text(text) {}
|
||||
|
||||
/** do customized cull code.*/
|
||||
virtual bool cull(osg::NodeVisitor *nv, osg::Drawable*, osg::State*) const
|
||||
{
|
||||
osgUtil::CullVisitor* cs = static_cast<osgUtil::CullVisitor*>(nv);
|
||||
if (!cs) return false;
|
||||
|
||||
unsigned int contextID = cs->getState() ? cs->getState()->getContextID() : 0;
|
||||
|
||||
PositionData& positionData = _positions[contextID];
|
||||
|
||||
int width = positionData._previousWidth;
|
||||
int height = positionData._previousHeight;
|
||||
|
||||
osg::Viewport* viewport = cs->getViewport();
|
||||
if (viewport)
|
||||
{
|
||||
width = viewport->width();
|
||||
height = viewport->height();
|
||||
}
|
||||
|
||||
osg::Vec3 eyePoint = cs->getEyeLocal();
|
||||
|
||||
bool doUpdate = positionData._traversalNumber==-1;
|
||||
if (positionData._traversalNumber>=0)
|
||||
{
|
||||
osg::Vec3 dv = positionData._eyePosition-eyePoint;
|
||||
if (dv.length2()>_text->getAutoUpdateEyeMovementTolerance()*(eyePoint-_text->getPosition()).length2())
|
||||
{
|
||||
doUpdate = true;
|
||||
}
|
||||
else if (width!=positionData._previousWidth || height!=positionData._previousHeight)
|
||||
{
|
||||
doUpdate = true;
|
||||
}
|
||||
}
|
||||
|
||||
positionData._traversalNumber = nv->getTraversalNumber();
|
||||
positionData._previousWidth = width;
|
||||
positionData._previousHeight = height;
|
||||
|
||||
if (doUpdate)
|
||||
{
|
||||
|
||||
float scale=_text->getScale(contextID);
|
||||
|
||||
if (_text->getAutoScaleToLimitScreenSizeToFontResolution())
|
||||
{
|
||||
float numPixels = cs->pixelSize(_text->getPosition(),_text->getCharacterHeight());
|
||||
if (numPixels>_text->getFontHeight())
|
||||
{
|
||||
scale = _text->getFontHeight()/numPixels;
|
||||
}
|
||||
|
||||
//float size = 1.0f/cs->pixelSize(_text->getPosition(),1.0f);
|
||||
//_text->setScale(size);
|
||||
}
|
||||
|
||||
osg::Quat rotation = _text->getRotation(contextID);
|
||||
if (_text->getAutoRotateToScreen())
|
||||
{
|
||||
rotation.set(cs->getModelViewMatrix());
|
||||
rotation = rotation.inverse();
|
||||
}
|
||||
|
||||
_text->setScaleAndRotation(contextID,scale,rotation);
|
||||
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
typedef osg::buffered_object<PositionData> PositionList;
|
||||
mutable PositionList _positions;
|
||||
mutable osgText::Text* _text;
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
Text::Text():
|
||||
_fontWidth(32),
|
||||
_fontHeight(32),
|
||||
_characterHeight(32),
|
||||
_characterAspectRatio(1.0f),
|
||||
_characterSizeMode(OBJECT_COORDS),
|
||||
_maximumWidth(0.0f),
|
||||
_maximumHeight(0.0f),
|
||||
_alignment(BASE_LINE),
|
||||
_autoUpdateEyeMovementTolerance(0.0f),
|
||||
_autoRotateToScreen(false),
|
||||
_autoScaleToLimitScreenSizeToFontResolution(false),
|
||||
_layout(LEFT_TO_RIGHT),
|
||||
_color(1.0f,1.0f,1.0f,1.0f),
|
||||
_drawMode(TEXT)
|
||||
{
|
||||
setUseDisplayList(false);
|
||||
setScale(1.0f);
|
||||
}
|
||||
|
||||
Text::Text(const Text& text,const osg::CopyOp& copyop):
|
||||
@ -146,21 +47,18 @@ Text::Text(const Text& text,const osg::CopyOp& copyop):
|
||||
_fontHeight(text._fontHeight),
|
||||
_characterHeight(text._characterHeight),
|
||||
_characterAspectRatio(text._characterAspectRatio),
|
||||
_characterSizeMode(text._characterSizeMode),
|
||||
_maximumWidth(text._maximumWidth),
|
||||
_maximumHeight(text._maximumHeight),
|
||||
_text(text._text),
|
||||
_position(text._position),
|
||||
_alignment(text._alignment),
|
||||
_rotation(text._rotation),
|
||||
_scale(text._scale),
|
||||
_autoUpdateEyeMovementTolerance(text._autoUpdateEyeMovementTolerance),
|
||||
_autoRotateToScreen(text._autoRotateToScreen),
|
||||
_autoScaleToLimitScreenSizeToFontResolution(text._autoScaleToLimitScreenSizeToFontResolution),
|
||||
_layout(text._layout),
|
||||
_color(text._color),
|
||||
_drawMode(text._drawMode)
|
||||
{
|
||||
setUpAutoCallback();
|
||||
computeGlyphRepresentation();
|
||||
}
|
||||
|
||||
@ -189,7 +87,6 @@ void Text::setFontResolution(unsigned int width, unsigned int height)
|
||||
computeGlyphRepresentation();
|
||||
}
|
||||
|
||||
|
||||
void Text::setCharacterSize(float height,float aspectRatio)
|
||||
{
|
||||
_characterHeight = height;
|
||||
@ -278,75 +175,19 @@ void Text::setAxisAlignment(AxisAlignment axis)
|
||||
|
||||
void Text::setRotation(const osg::Quat& quat)
|
||||
{
|
||||
for(unsigned int i=0;i<_rotation.size();++i)
|
||||
{
|
||||
setRotation(i,quat);
|
||||
}
|
||||
_rotation = quat;
|
||||
computePositions();
|
||||
}
|
||||
|
||||
void Text::setRotation(unsigned int contextID, const osg::Quat& quat)
|
||||
{
|
||||
if (_rotation[contextID]==quat) return;
|
||||
|
||||
_rotation[contextID] = quat;
|
||||
computePositions(contextID);
|
||||
}
|
||||
|
||||
void Text::setScale(float scale)
|
||||
{
|
||||
for(unsigned int i=0;i<_scale.size();++i)
|
||||
{
|
||||
setScale(i,scale);
|
||||
}
|
||||
}
|
||||
|
||||
void Text::setScale(unsigned int contextID, float scale)
|
||||
{
|
||||
if (_scale[contextID]==scale) return;
|
||||
|
||||
_scale[contextID] = scale;
|
||||
computePositions(contextID);
|
||||
}
|
||||
|
||||
void Text::setScaleAndRotation(unsigned int contextID, float scale,const osg::Quat& quat)
|
||||
{
|
||||
if (_scale[contextID]==scale && _rotation[contextID]==quat) return;
|
||||
|
||||
_scale[contextID] = scale;
|
||||
_rotation[contextID] = quat;
|
||||
|
||||
computePositions(contextID);
|
||||
}
|
||||
|
||||
void Text::setAutoScaleToLimitScreenSizeToFontResolution(bool autoScaleToScreen)
|
||||
{
|
||||
if (_autoScaleToLimitScreenSizeToFontResolution==autoScaleToScreen) return;
|
||||
|
||||
_autoScaleToLimitScreenSizeToFontResolution = autoScaleToScreen;
|
||||
setUpAutoCallback();
|
||||
}
|
||||
|
||||
void Text::setAutoRotateToScreen(bool autoRotateToScreen)
|
||||
{
|
||||
if (_autoRotateToScreen==autoRotateToScreen) return;
|
||||
|
||||
_autoRotateToScreen = autoRotateToScreen;
|
||||
setUpAutoCallback();
|
||||
}
|
||||
|
||||
|
||||
void Text::setUpAutoCallback()
|
||||
{
|
||||
if (_autoRotateToScreen || _autoScaleToLimitScreenSizeToFontResolution)
|
||||
{
|
||||
if (!getCullCallback())
|
||||
{
|
||||
setCullCallback(new TextCullCallback(this));
|
||||
}
|
||||
}
|
||||
else setCullCallback(0);
|
||||
}
|
||||
|
||||
void Text::setLayout(Layout layout)
|
||||
{
|
||||
if (_layout==layout) return;
|
||||
@ -369,7 +210,7 @@ void Text::setDrawMode(unsigned int mode)
|
||||
_drawMode=mode;
|
||||
if (_drawMode&TEXT_PIXMAP)
|
||||
{
|
||||
setAutoScaleToLimitScreenSizeToFontResolution(true);
|
||||
setCharacterSizeMode(SCREEN_COORDS);
|
||||
setAutoRotateToScreen(true);
|
||||
}
|
||||
computeGlyphRepresentation();
|
||||
@ -388,9 +229,9 @@ bool Text::computeBound() const
|
||||
if (_textBB.valid())
|
||||
{
|
||||
|
||||
for(unsigned int i=0;i<_matrix.size();++i)
|
||||
for(unsigned int i=0;i<_autoTransformCache.size();++i)
|
||||
{
|
||||
osg::Matrix& matrix = _matrix[i];
|
||||
osg::Matrix& matrix = _autoTransformCache[i]._matrix;
|
||||
_bbox.expandBy(osg::Vec3(_textBB.xMin(),_textBB.yMin(),_textBB.zMin())*matrix);
|
||||
_bbox.expandBy(osg::Vec3(_textBB.xMax(),_textBB.yMin(),_textBB.zMin())*matrix);
|
||||
_bbox.expandBy(osg::Vec3(_textBB.xMax(),_textBB.yMax(),_textBB.zMin())*matrix);
|
||||
@ -605,13 +446,13 @@ void Text::computeGlyphRepresentation()
|
||||
|
||||
void Text::computePositions()
|
||||
{
|
||||
for(unsigned int i=0;i<_matrix.size();++i)
|
||||
for(unsigned int i=0;i<_autoTransformCache.size();++i)
|
||||
{
|
||||
computePositions(i);
|
||||
}
|
||||
}
|
||||
|
||||
void Text::computePositions(unsigned int contextID)
|
||||
void Text::computePositions(unsigned int contextID) const
|
||||
{
|
||||
|
||||
switch(_alignment)
|
||||
@ -632,18 +473,92 @@ void Text::computePositions(unsigned int contextID)
|
||||
case RIGHT_BASE_LINE: _offset.set((_textBB.xMax()+_textBB.xMin()),0.0f,0.0f); break;
|
||||
}
|
||||
|
||||
osg::Matrix& matrix = _matrix[contextID];
|
||||
|
||||
if (_scale[contextID]!=1.0f || !_rotation[contextID].zeroRotation())
|
||||
|
||||
AutoTransformCache& atc = _autoTransformCache[contextID];
|
||||
osg::Matrix& matrix = atc._matrix;
|
||||
|
||||
if (_characterSizeMode!=OBJECT_COORDS || _autoRotateToScreen)
|
||||
{
|
||||
|
||||
matrix.makeTranslate(-_offset);
|
||||
|
||||
if (_scale[contextID]!=1.0f)
|
||||
matrix.postMult(osg::Matrix::scale(_scale[contextID],_scale[contextID],_scale[contextID]));
|
||||
if (!_rotation[contextID].zeroRotation())
|
||||
matrix.postMult(osg::Matrix::rotate(_rotation[contextID]));
|
||||
osg::Matrix rotate_matrix;
|
||||
if (_autoRotateToScreen)
|
||||
{
|
||||
osg::Vec3 trans(atc._modelview.getTrans());
|
||||
atc._modelview.setTrans(0.0f,0.0f,0.0f);
|
||||
|
||||
rotate_matrix.invert(atc._modelview);
|
||||
|
||||
atc._modelview.setTrans(trans);
|
||||
}
|
||||
|
||||
if (_characterSizeMode!=OBJECT_COORDS)
|
||||
{
|
||||
|
||||
osg::Matrix M(rotate_matrix*osg::Matrix::translate(_position)*atc._modelview);
|
||||
osg::Matrix& P = atc._projection;
|
||||
|
||||
// compute the pixel size vector.
|
||||
|
||||
// pre adjust P00,P20,P23,P33 by multiplying them by the viewport window matrix.
|
||||
// here we do it in short hand with the knowledge of how the window matrix is formed
|
||||
// note P23,P33 are multiplied by an implicit 1 which would come from the window matrix.
|
||||
// Robert Osfield, June 2002.
|
||||
|
||||
// scaling for horizontal pixels
|
||||
float P00 = P(0,0)*atc._width*0.5f;
|
||||
float P20_00 = P(2,0)*atc._width*0.5f + P(2,3)*atc._width*0.5f;
|
||||
osg::Vec3 scale_00(M(0,0)*P00 + M(0,2)*P20_00,
|
||||
M(1,0)*P00 + M(1,2)*P20_00,
|
||||
M(2,0)*P00 + M(2,2)*P20_00);
|
||||
|
||||
// scaling for vertical pixels
|
||||
float P10 = P(1,1)*atc._height*0.5f;
|
||||
float P20_10 = P(2,1)*atc._height*0.5f + P(2,3)*atc._height*0.5f;
|
||||
osg::Vec3 scale_10(M(0,1)*P10 + M(0,2)*P20_10,
|
||||
M(1,1)*P10 + M(1,2)*P20_10,
|
||||
M(2,1)*P10 + M(2,2)*P20_10);
|
||||
|
||||
float P23 = P(2,3);
|
||||
float P33 = P(3,3);
|
||||
|
||||
float pixelSizeVector_w = M(3,2)*P23 + M(3,3)*P33;
|
||||
|
||||
float pixelSize = (_characterHeight*sqrtf(scale_00.length2()+scale_10.length2()))/(pixelSizeVector_w*0.701f);
|
||||
|
||||
if (_characterSizeMode==SCREEN_COORDS)
|
||||
{
|
||||
float scale_font = _characterHeight/pixelSize;
|
||||
matrix.postMult(osg::Matrix::scale(scale_font, scale_font,1.0f));
|
||||
}
|
||||
else if (pixelSize>_fontHeight)
|
||||
{
|
||||
float scale_font = _fontHeight/pixelSize;
|
||||
matrix.postMult(osg::Matrix::scale(scale_font, scale_font,1.0f));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
if (_autoRotateToScreen)
|
||||
{
|
||||
matrix.postMult(rotate_matrix);
|
||||
|
||||
}
|
||||
|
||||
if (!_rotation.zeroRotation() )
|
||||
{
|
||||
matrix.postMult(osg::Matrix::rotate(_rotation));
|
||||
}
|
||||
|
||||
matrix.postMult(osg::Matrix::translate(_position));
|
||||
}
|
||||
else if (!_rotation.zeroRotation())
|
||||
{
|
||||
matrix.makeTranslate(-_offset);
|
||||
matrix.postMult(osg::Matrix::rotate(_rotation));
|
||||
matrix.postMult(osg::Matrix::translate(_position));
|
||||
}
|
||||
else
|
||||
@ -652,6 +567,7 @@ void Text::computePositions(unsigned int contextID)
|
||||
}
|
||||
|
||||
|
||||
|
||||
// now apply matrix to the glyphs.
|
||||
for(TextureGlyphQuadMap::iterator titr=_textureGlyphQuadMap.begin();
|
||||
titr!=_textureGlyphQuadMap.end();
|
||||
@ -676,13 +592,60 @@ void Text::computePositions(unsigned int contextID)
|
||||
_normal = osg::Matrix::transform3x3(osg::Vec3(0.0f,0.0f,1.0f),matrix);
|
||||
_normal.normalize();
|
||||
|
||||
dirtyBound();
|
||||
const_cast<Text*>(this)->dirtyBound();
|
||||
}
|
||||
|
||||
void Text::drawImplementation(osg::State& state) const
|
||||
{
|
||||
unsigned int contextID = state.getContextID();
|
||||
|
||||
if (_characterSizeMode!=OBJECT_COORDS || _autoRotateToScreen)
|
||||
{
|
||||
int frameNumber = state.getFrameStamp()?state.getFrameStamp()->getFrameNumber():0;
|
||||
AutoTransformCache& atc = _autoTransformCache[contextID];
|
||||
const osg::Matrix& modelview = state.getModelViewMatrix();
|
||||
|
||||
osg::Vec3 newTransformedPosition = _position*modelview;
|
||||
|
||||
int width = atc._width;
|
||||
int height = atc._height;
|
||||
|
||||
const osg::Viewport* viewport = state.getCurrentViewport();
|
||||
if (viewport)
|
||||
{
|
||||
width = viewport->width();
|
||||
height = viewport->height();
|
||||
}
|
||||
|
||||
bool doUpdate = atc._traversalNumber==-1;
|
||||
if (atc._traversalNumber>=0)
|
||||
{
|
||||
if (atc._modelview!=modelview)
|
||||
{
|
||||
doUpdate = true;
|
||||
}
|
||||
else if (width!=atc._width || height!=atc._height)
|
||||
{
|
||||
doUpdate = true;
|
||||
}
|
||||
}
|
||||
|
||||
atc._traversalNumber = frameNumber;
|
||||
atc._width = width;
|
||||
atc._height = height;
|
||||
|
||||
if (doUpdate)
|
||||
{
|
||||
atc._transformedPosition = newTransformedPosition;
|
||||
atc._projection = state.getProjectionMatrix();
|
||||
atc._modelview = modelview;
|
||||
|
||||
computePositions(contextID);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
glNormal3fv(_normal.ptr());
|
||||
glColor4fv(_color.ptr());
|
||||
|
||||
@ -745,7 +708,7 @@ void Text::drawImplementation(osg::State& state) const
|
||||
{
|
||||
state.applyTextureMode(0,GL_TEXTURE_2D,osg::StateAttribute::OFF);
|
||||
|
||||
osg::Matrix& matrix = _matrix[contextID];
|
||||
const osg::Matrix& matrix = _autoTransformCache[contextID]._matrix;
|
||||
|
||||
osg::Vec3 c00(osg::Vec3(_textBB.xMin(),_textBB.yMin(),_textBB.zMin())*matrix);
|
||||
osg::Vec3 c10(osg::Vec3(_textBB.xMax(),_textBB.yMin(),_textBB.zMin())*matrix);
|
||||
@ -767,9 +730,9 @@ void Text::drawImplementation(osg::State& state) const
|
||||
{
|
||||
glColor4f(1.0f,0.0f,1.0f,1.0f);
|
||||
|
||||
float cursorsize = _characterHeight*0.5f*_scale[contextID];
|
||||
float cursorsize = _characterHeight*0.5f;
|
||||
|
||||
osg::Matrix& matrix = _matrix[contextID];
|
||||
const osg::Matrix& matrix = _autoTransformCache[contextID]._matrix;
|
||||
|
||||
osg::Vec3 hl(osg::Vec3(_offset.x()-cursorsize,_offset.y(),_offset.z())*matrix);
|
||||
osg::Vec3 hr(osg::Vec3(_offset.x()+cursorsize,_offset.y(),_offset.z())*matrix);
|
||||
@ -814,14 +777,6 @@ void Text::accept(osg::Drawable::PrimitiveFunctor& pf) const
|
||||
pf.setVertexArray(glyphquad._transformedCoords[0].size(),&(glyphquad._transformedCoords[0].front()));
|
||||
pf.drawArrays(GL_QUADS,0,glyphquad._transformedCoords[0].size());
|
||||
|
||||
// pf.begin(GL_QUADS);
|
||||
// for(GlyphQuads::Coords3::const_iterator itr = glyphquad._transformedCoords.begin();
|
||||
// itr!=glyphquad._transformedCoords.end();
|
||||
// ++itr)
|
||||
// {
|
||||
// pf.vertex(*itr);
|
||||
// }
|
||||
// pf.end();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -524,7 +524,7 @@ bool IntersectVisitor::intersect(Drawable& drawable)
|
||||
|
||||
if (geometry)
|
||||
{
|
||||
osg::Vec3Array* vertices = geometry->getVertexArray();
|
||||
osg::Vec3Array* vertices = dynamic_cast<osg::Vec3Array*>(geometry->getVertexArray());
|
||||
if (vertices)
|
||||
{
|
||||
osg::Vec3* first = &(vertices->front());
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include <osgUtil/Optimizer>
|
||||
|
||||
#include <osg/Transform>
|
||||
#include <osg/TransformAttributeFunctor>
|
||||
#include <osg/MatrixTransform>
|
||||
#include <osg/PositionAttitudeTransform>
|
||||
#include <osg/LOD>
|
||||
@ -106,45 +107,6 @@ void Optimizer::optimize(osg::Node* node, unsigned int options)
|
||||
|
||||
}
|
||||
|
||||
class TransformFunctor : public osg::Drawable::AttributeFunctor
|
||||
{
|
||||
public:
|
||||
|
||||
osg::Matrix _m;
|
||||
osg::Matrix _im;
|
||||
|
||||
TransformFunctor(const osg::Matrix& m)
|
||||
{
|
||||
_m = m;
|
||||
_im.invert(_m);
|
||||
}
|
||||
|
||||
virtual ~TransformFunctor() {}
|
||||
|
||||
virtual void apply(osg::Drawable::AttributeType type,unsigned int count,osg::Vec3* begin)
|
||||
{
|
||||
if (type == osg::Drawable::VERTICES)
|
||||
{
|
||||
osg::Vec3* end = begin+count;
|
||||
for (osg::Vec3* itr=begin;itr<end;++itr)
|
||||
{
|
||||
(*itr) = (*itr)*_m;
|
||||
}
|
||||
}
|
||||
else if (type == osg::Drawable::NORMALS)
|
||||
{
|
||||
osg::Vec3* end = begin+count;
|
||||
for (osg::Vec3* itr=begin;itr<end;++itr)
|
||||
{
|
||||
// note post mult by inverse for normals.
|
||||
(*itr) = osg::Matrix::transform3x3(_im,(*itr));
|
||||
(*itr).normalize();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// Optimize State Visitor
|
||||
@ -535,7 +497,7 @@ void CollectLowestTransformsVisitor::doTransform(osg::Object* obj,osg::Matrix& m
|
||||
osg::Drawable* drawable = dynamic_cast<osg::Drawable*>(obj);
|
||||
if (drawable)
|
||||
{
|
||||
TransformFunctor tf(matrix);
|
||||
osg::TransformAttributeFunctor tf(matrix);
|
||||
drawable->accept(tf);
|
||||
drawable->dirtyBound();
|
||||
return;
|
||||
@ -570,7 +532,7 @@ void CollectLowestTransformsVisitor::doTransform(osg::Object* obj,osg::Matrix& m
|
||||
osg::Matrix matrix_no_trans = matrix;
|
||||
matrix_no_trans.setTrans(0.0f,0.0f,0.0f);
|
||||
|
||||
TransformFunctor tf(matrix_no_trans);
|
||||
osg::TransformAttributeFunctor tf(matrix_no_trans);
|
||||
|
||||
osg::Vec3 axis = osg::Matrix::transform3x3(tf._im,billboard->getAxis());
|
||||
axis.normalize();
|
||||
@ -1362,14 +1324,62 @@ bool Optimizer::MergeGeometryVisitor::geometryContainsSharedArrays(osg::Geometry
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
class MergeArrayVisitor : public osg::ArrayVisitor
|
||||
{
|
||||
public:
|
||||
|
||||
osg::Array* _lhs;
|
||||
|
||||
MergeArrayVisitor() :
|
||||
_lhs(0) {}
|
||||
|
||||
|
||||
void merge(osg::Array* lhs,osg::Array* rhs)
|
||||
{
|
||||
if (lhs==0 || rhs==0) return;
|
||||
if (lhs->getType()!=rhs->getType()) return;
|
||||
|
||||
_lhs = lhs;
|
||||
|
||||
rhs->accept(*this);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void _merge(T& rhs)
|
||||
{
|
||||
T* lhs = static_cast<T*>(_lhs);
|
||||
lhs->insert(lhs->end(),rhs.begin(),rhs.end());
|
||||
}
|
||||
|
||||
|
||||
virtual void apply(osg::Array&) { osg::notify(osg::WARN) << "Warning: Optimizer's MergeArrayVisitor cannot merge Array type." << std::endl; }
|
||||
virtual void apply(osg::ByteArray& rhs) { _merge(rhs); }
|
||||
virtual void apply(osg::ShortArray& rhs) { _merge(rhs); }
|
||||
virtual void apply(osg::IntArray& rhs) { _merge(rhs); }
|
||||
virtual void apply(osg::UByteArray& rhs) { _merge(rhs); }
|
||||
virtual void apply(osg::UShortArray& rhs) { _merge(rhs); }
|
||||
virtual void apply(osg::UIntArray& rhs) { _merge(rhs); }
|
||||
virtual void apply(osg::UByte4Array& rhs) { _merge(rhs); }
|
||||
virtual void apply(osg::FloatArray& rhs) { _merge(rhs); }
|
||||
virtual void apply(osg::Vec2Array& rhs) { _merge(rhs); }
|
||||
virtual void apply(osg::Vec3Array& rhs) { _merge(rhs); }
|
||||
virtual void apply(osg::Vec4Array& rhs) { _merge(rhs); }
|
||||
};
|
||||
|
||||
bool Optimizer::MergeGeometryVisitor::mergeGeometry(osg::Geometry& lhs,osg::Geometry& rhs)
|
||||
{
|
||||
|
||||
MergeArrayVisitor merger;
|
||||
|
||||
unsigned int base = 0;
|
||||
if (lhs.getVertexArray() && rhs.getVertexArray())
|
||||
{
|
||||
base = lhs.getVertexArray()->size();
|
||||
lhs.getVertexArray()->insert(lhs.getVertexArray()->end(),rhs.getVertexArray()->begin(),rhs.getVertexArray()->end());
|
||||
|
||||
base = lhs.getVertexArray()->getNumElements();
|
||||
|
||||
merger.merge(lhs.getVertexArray(),rhs.getVertexArray());
|
||||
|
||||
}
|
||||
else if (rhs.getVertexArray())
|
||||
{
|
||||
@ -1378,7 +1388,7 @@ bool Optimizer::MergeGeometryVisitor::mergeGeometry(osg::Geometry& lhs,osg::Geom
|
||||
|
||||
if (lhs.getNormalArray() && rhs.getNormalArray() && lhs.getNormalBinding()!=osg::Geometry::BIND_OVERALL)
|
||||
{
|
||||
lhs.getNormalArray()->insert(lhs.getNormalArray()->end(),rhs.getNormalArray()->begin(),rhs.getNormalArray()->end());
|
||||
merger.merge(lhs.getNormalArray(),rhs.getNormalArray());
|
||||
}
|
||||
else if (rhs.getNormalArray())
|
||||
{
|
||||
@ -1387,34 +1397,34 @@ bool Optimizer::MergeGeometryVisitor::mergeGeometry(osg::Geometry& lhs,osg::Geom
|
||||
|
||||
if (lhs.getColorArray() && rhs.getColorArray() && lhs.getColorBinding()!=osg::Geometry::BIND_OVERALL)
|
||||
{
|
||||
// we need to add the handling of the other array types...
|
||||
osg::Vec4Array* col_lhs = dynamic_cast<osg::Vec4Array*>(lhs.getColorArray());
|
||||
osg::Vec4Array* col_rhs = dynamic_cast<osg::Vec4Array*>(rhs.getColorArray());
|
||||
|
||||
if (col_lhs && col_rhs)
|
||||
{
|
||||
col_lhs->insert(col_lhs->end(),col_rhs->begin(),col_rhs->end());
|
||||
}
|
||||
merger.merge(lhs.getColorArray(),rhs.getColorArray());
|
||||
}
|
||||
else if (rhs.getColorArray())
|
||||
{
|
||||
lhs.setColorArray(rhs.getColorArray());
|
||||
}
|
||||
|
||||
// need to implement handle secondary color array.
|
||||
if (lhs.getSecondaryColorArray() && rhs.getSecondaryColorArray() && lhs.getSecondaryColorBinding()!=osg::Geometry::BIND_OVERALL)
|
||||
{
|
||||
merger.merge(lhs.getSecondaryColorArray(),rhs.getSecondaryColorArray());
|
||||
}
|
||||
else if (rhs.getColorArray())
|
||||
{
|
||||
lhs.setSecondaryColorArray(rhs.getSecondaryColorArray());
|
||||
}
|
||||
|
||||
// need to implement handle fog coord array.
|
||||
if (lhs.getFogCoordArray() && rhs.getFogCoordArray() && lhs.getFogCoordBinding()!=osg::Geometry::BIND_OVERALL)
|
||||
{
|
||||
merger.merge(lhs.getFogCoordArray(),rhs.getFogCoordArray());
|
||||
}
|
||||
else if (rhs.getColorArray())
|
||||
{
|
||||
lhs.setFogCoordArray(rhs.getFogCoordArray());
|
||||
}
|
||||
|
||||
for(unsigned int unit=0;unit<lhs.getNumTexCoordArrays();++unit)
|
||||
{
|
||||
// we need to add the handling of the other array types...
|
||||
osg::Vec2Array* tex_lhs = dynamic_cast<osg::Vec2Array*>(lhs.getTexCoordArray(unit));
|
||||
osg::Vec2Array* tex_rhs = dynamic_cast<osg::Vec2Array*>(rhs.getTexCoordArray(unit));
|
||||
|
||||
if (tex_lhs && tex_rhs)
|
||||
{
|
||||
tex_lhs->insert(tex_lhs->end(),tex_rhs->begin(),tex_rhs->end());
|
||||
}
|
||||
merger.merge(lhs.getTexCoordArray(unit),rhs.getTexCoordArray(unit));
|
||||
}
|
||||
|
||||
// shift the indices of the incomming primitives to account for the pre exisiting geometry.
|
||||
|
@ -65,6 +65,16 @@ SceneView::~SceneView()
|
||||
|
||||
void SceneView::setDefaults()
|
||||
{
|
||||
if (!_projectionMatrix)
|
||||
{
|
||||
_projectionMatrix = new RefMatrix();
|
||||
_projectionMatrix->makePerspective(50.0f,1.4f,1.0f,10000.0f);
|
||||
}
|
||||
if (!_modelviewMatrix)
|
||||
{
|
||||
_modelviewMatrix = new RefMatrix();
|
||||
}
|
||||
|
||||
_globalStateSet = new osg::StateSet;
|
||||
|
||||
_lightingMode=HEADLIGHT;
|
||||
|
@ -109,7 +109,7 @@ void SmoothingVisitor::smooth(osg::Geometry& geom)
|
||||
|
||||
if (!numSurfacePrimitives) return;
|
||||
|
||||
osg::Vec3Array *coords = geom.getVertexArray();
|
||||
osg::Vec3Array *coords = dynamic_cast<osg::Vec3Array*>(geom.getVertexArray());
|
||||
if (!coords || !coords->size()) return;
|
||||
|
||||
osg::Vec3Array *normals = new osg::Vec3Array(coords->size());
|
||||
|
@ -149,7 +149,7 @@ class InsertNewVertices : public osg::ArrayVisitor
|
||||
|
||||
void Tesselator::retesselatePolygons(osg::Geometry& geom)
|
||||
{
|
||||
Vec3Array* vertices = geom.getVertexArray();
|
||||
osg::Vec3Array* vertices = dynamic_cast<osg::Vec3Array*>(geom.getVertexArray());
|
||||
if (!vertices || vertices->empty() || geom.getPrimitiveSetList().empty()) return;
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user