Fixed the MS version number check in Optiizer.cpp. Fixes to memory handling
in ReaderWriterDW.cpp. Submissions from Geoff Michel.
This commit is contained in:
parent
eb0587b5fb
commit
49e7be88a7
@ -1,7 +1,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
// reading a design workshop file utility
|
// reading a design workshop file utility
|
||||||
// (c) GW Michel, 2001.
|
// (c) GW Michel, 2001-2002.
|
||||||
// Design Workshop format files can be downloaded from www.artifice.com
|
// Design Workshop format files can be downloaded from www.artifice.com
|
||||||
// Design Workshop editor can be downloaded from www.artifice.com = Mac & Win95/98/NT versions are available.
|
// Design Workshop editor can be downloaded from www.artifice.com = Mac & Win95/98/NT versions are available.
|
||||||
// DW Lite is completely free, produces textured 3D models
|
// DW Lite is completely free, produces textured 3D models
|
||||||
@ -52,8 +52,10 @@ public:
|
|||||||
if (!dstate) dstate = new StateSet;
|
if (!dstate) dstate = new StateSet;
|
||||||
if (isTextured()) { // shares common textures
|
if (isTextured()) { // shares common textures
|
||||||
if (!ctx || !tx) { // new texture needed
|
if (!ctx || !tx) { // new texture needed
|
||||||
if (fname.length()>0) {
|
if (fname.length()>0) {
|
||||||
|
// char *nm=osgDB::findFileInPath(fname.c_str(),"C:/osgraph");
|
||||||
ctx=osgDB::readImageFile(fname.c_str());
|
ctx=osgDB::readImageFile(fname.c_str());
|
||||||
|
//ctx=osgDB::readImageFile(nm);
|
||||||
if (ctx) {
|
if (ctx) {
|
||||||
ctx->setFileName(fname);
|
ctx->setFileName(fname);
|
||||||
tx=new Texture;
|
tx=new Texture;
|
||||||
@ -210,35 +212,34 @@ public:
|
|||||||
n.normalize(); // unit norm
|
n.normalize(); // unit norm
|
||||||
}
|
}
|
||||||
const Vec3 getnorm(void) const { return nrm; } // use the predefined normal
|
const Vec3 getnorm(void) const { return nrm; } // use the predefined normal
|
||||||
void getside12(Vec3 &s1, Vec3 &s2, const Vec3 verts[]) const {
|
void getside12(Vec3 &s1, Vec3 &s2, const std::vector<Vec3> verts) const {
|
||||||
int ic=1; // counter for later vertices to ensure not coincident
|
int ic=0; // counter for later vertices to ensure not coincident
|
||||||
int i1=idx[0]; // first vertex of face
|
int i1=idx[0]; // first vertex of face
|
||||||
int i2=idx[1]; // second, must be non-coincident
|
int i2=idx[1]; // second, must be non-coincident
|
||||||
while (i2==i1) {
|
while (i2==i1 && ic<nv-1) {
|
||||||
ic++;
|
ic++;
|
||||||
i2=idx[ic];
|
i2=idx[ic];
|
||||||
}
|
}
|
||||||
int i3=idx[ic]; // second, must be non-coincident
|
int i3=idx[ic]; // third, must be non-coincident
|
||||||
while (i3==i2 || i3==i1) {
|
while (ic<nv-1 && (i3==i2 || i3==i1)) {
|
||||||
ic++;
|
ic++;
|
||||||
i3=idx[ic];
|
i3=idx[ic];
|
||||||
}
|
}
|
||||||
|
if(ic>=nv) {
|
||||||
|
printf("Invalid vertices %d of %d. I1-3 %d %d %d.\n", ic, nv, i1, i2, i3);
|
||||||
|
}
|
||||||
|
if(i1>=verts.size() || i2>=verts.size() || i3>=verts.size()) {
|
||||||
|
printf("Invalid indices %d, %d, %d max allowed %d.\n", i1,i2,i3,verts.size());//, errm
|
||||||
|
}
|
||||||
s1=(verts[i2]-verts[i1]); // side 1 of face
|
s1=(verts[i2]-verts[i1]); // side 1 of face
|
||||||
s2=(verts[i3]-verts[i2]); // side 2 of face
|
s2=(verts[i3]-verts[i2]); // side 2 of face
|
||||||
}
|
}
|
||||||
void getnorm(const Vec3 verts[]) {
|
void getnorm(const std::vector<Vec3> verts) {
|
||||||
Vec3 side, s2; // used in cross product to find normal
|
Vec3 side, s2; // used in cross product to find normal
|
||||||
getside12(side,s2, verts);
|
getside12(side,s2, verts);
|
||||||
norm(nrm, s2, side);
|
norm(nrm, s2, side);
|
||||||
}
|
}
|
||||||
void getsides(float *wid, float *ht, const Vec3 verts[]) const
|
void settrans(Matrix &mx, const Vec3 nrm, const std::vector<Vec3> verts, const dwmaterial *mat) const {
|
||||||
{
|
|
||||||
Vec3 side, s2; // used in cross product to find normal
|
|
||||||
getside12(side,s2, verts);
|
|
||||||
*wid=side.length();
|
|
||||||
*ht=s2.length();
|
|
||||||
}
|
|
||||||
void settrans(Matrix &mx, const Vec3 nrm, const Vec3 verts[], const dwmaterial *mat) const {
|
|
||||||
// define the matrix perpendcular to normal for mapping textures
|
// define the matrix perpendcular to normal for mapping textures
|
||||||
float wid=mat->getRepWid();
|
float wid=mat->getRepWid();
|
||||||
float ht=mat->getRepHt();
|
float ht=mat->getRepHt();
|
||||||
@ -246,11 +247,14 @@ public:
|
|||||||
if (mat->isFullFace()) { // set wid, ht from polygon
|
if (mat->isFullFace()) { // set wid, ht from polygon
|
||||||
Vec3 s2; // want transformed u coordinate parallel to 'r1'
|
Vec3 s2; // want transformed u coordinate parallel to 'r1'
|
||||||
getside12(r1,s2, verts); // r1 = edge of first side
|
getside12(r1,s2, verts); // r1 = edge of first side
|
||||||
getsides(&ht, &wid, verts); // get the lengths of sides for transformation of xyz to uv
|
// printf("fullface s2 %f %f %f\n", s2.x(),s2.y(),s2.z());//, errm
|
||||||
r3=nrm;
|
r3=nrm;
|
||||||
r1.normalize();
|
float len=r1.length();
|
||||||
|
r1=r1/len;
|
||||||
r2=r3^r1;
|
r2=r3^r1;
|
||||||
} else {
|
r1=r1/len;
|
||||||
|
r2=r2/s2.length();
|
||||||
|
} else {
|
||||||
// mat.nrm= (0,0,1) AND mat (0,1,0) => (0,a,b)
|
// mat.nrm= (0,0,1) AND mat (0,1,0) => (0,a,b)
|
||||||
// the transformation is unitary - preserves lengths; and
|
// the transformation is unitary - preserves lengths; and
|
||||||
// converts points on a plane into (s,t, constant) coords for use with texturing
|
// converts points on a plane into (s,t, constant) coords for use with texturing
|
||||||
@ -273,17 +277,17 @@ public:
|
|||||||
mx(2,j)=r3[j];
|
mx(2,j)=r3[j];
|
||||||
}
|
}
|
||||||
// mx.postTrans(mx,0.5f,0.5f,0.0f);
|
// mx.postTrans(mx,0.5f,0.5f,0.0f);
|
||||||
mx(0,0)*=1.0f/wid;
|
|
||||||
mx(1,0)*=1.0f/wid;
|
|
||||||
mx(0,1)*=1.0f/ht;
|
|
||||||
mx(1,1)*=1.0f/ht;
|
|
||||||
if (mat->isFullFace()) { // set offset such that mx*verts[idx[0]] -> uv=(0,0)
|
if (mat->isFullFace()) { // set offset such that mx*verts[idx[0]] -> uv=(0,0)
|
||||||
Vec3 pos;
|
Vec3 pos;
|
||||||
pos=mx*verts[idx[0]];
|
pos=mx*verts[idx[0]];
|
||||||
mx(0,3)=pos.x();
|
mx(0,3)=-pos.x();
|
||||||
mx(1,3)=pos.y();
|
mx(1,3)=-pos.y();
|
||||||
mx(2,3)=pos.z();
|
mx(2,3)=-pos.z();
|
||||||
} else { // scale inversely to the texture preferred repeat size
|
} else { // scale inversely to the texture preferred repeat size
|
||||||
|
mx(0,0)*=1.0f/wid;
|
||||||
|
mx(1,0)*=1.0f/wid;
|
||||||
|
mx(0,1)*=1.0f/ht;
|
||||||
|
mx(1,1)*=1.0f/ht;
|
||||||
mx(0,3)=0.5f/wid;
|
mx(0,3)=0.5f/wid;
|
||||||
mx(1,3)=0.5f/ht;
|
mx(1,3)=0.5f/ht;
|
||||||
}
|
}
|
||||||
@ -308,7 +312,7 @@ public:
|
|||||||
for (int i=0; i<nop; i++) ntot+=opening[i].getnv();
|
for (int i=0; i<nop; i++) ntot+=opening[i].getnv();
|
||||||
return ntot;
|
return ntot;
|
||||||
}
|
}
|
||||||
void setnorm(const Vec3 *verts) { // set the face normal
|
void setnorm(const std::vector<Vec3> verts) { // set the face normal
|
||||||
getnorm(verts);
|
getnorm(verts);
|
||||||
for (int i=0; i<nop; i++) {
|
for (int i=0; i<nop; i++) {
|
||||||
opening[i].setnorm(verts);
|
opening[i].setnorm(verts);
|
||||||
@ -318,19 +322,19 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void setposes(avertex &poses, const int j, const Vec3 verts[]) const {
|
void setposes(avertex &poses, const int j, const std::vector<Vec3> verts) const {
|
||||||
poses.pos[0]=verts[idx[j]].x();
|
poses.pos[0]=verts[idx[j]].x();
|
||||||
poses.pos[1]=verts[idx[j]].y();
|
poses.pos[1]=verts[idx[j]].y();
|
||||||
poses.pos[2]=verts[idx[j]].z();
|
poses.pos[2]=verts[idx[j]].z();
|
||||||
poses.nrmv=nrm;
|
poses.nrmv=nrm;
|
||||||
poses.idx=idx[j];
|
poses.idx=idx[j];
|
||||||
}
|
}
|
||||||
void tesselate(const Vec3 verts[], const dwmaterial *themat,
|
void tesselate(const std::vector<Vec3> verts, const dwmaterial *themat,
|
||||||
GLUtesselator *ts, _dwobj *dwob, const Matrix *tmat) const;
|
GLUtesselator *ts, _dwobj *dwob, const Matrix *tmat) const;
|
||||||
void link(const int idop, const _face *f2, const int idop2,const Vec3 verts[], const dwmaterial *themat) const; // to join up opposed faces of a hole
|
void link(const int idop, const _face *f2, const int idop2,const std::vector<Vec3> verts, const dwmaterial *themat) const; // to join up opposed faces of a hole
|
||||||
inline const int getidx(int i) const { return idx[i];}
|
inline const int getidx(int i) const { return idx[i];}
|
||||||
private:
|
private:
|
||||||
void linkholes(const Vec3 verts[], const dwmaterial *themat, const _face *f2) const;
|
void linkholes(const std::vector<Vec3> verts, const dwmaterial *themat, const _face *f2) const;
|
||||||
void reverse() { // reverse order of the vertices
|
void reverse() { // reverse order of the vertices
|
||||||
for (int j=0; j<nv/2; j++) {
|
for (int j=0; j<nv/2; j++) {
|
||||||
int it=idx[j];
|
int it=idx[j];
|
||||||
@ -401,7 +405,7 @@ public:
|
|||||||
}
|
}
|
||||||
void combine( GLdouble coords[3], avertex *d[4],
|
void combine( GLdouble coords[3], avertex *d[4],
|
||||||
GLfloat w[4], avertex **dataOut , _dwobj *dwob);
|
GLfloat w[4], avertex **dataOut , _dwobj *dwob);
|
||||||
void linkholes(const Vec3 verts[], const dwmaterial *themat,
|
void linkholes(const std::vector<Vec3> verts, const dwmaterial *themat,
|
||||||
const _face *f1, const _face *f2,
|
const _face *f1, const _face *f2,
|
||||||
const int ipr[2], const int idx[], const int nv) {
|
const int ipr[2], const int idx[], const int nv) {
|
||||||
gsidx[nload]=f1->getidx(ipr[1]); // vertex position index
|
gsidx[nload]=f1->getidx(ipr[1]); // vertex position index
|
||||||
@ -440,13 +444,13 @@ public:
|
|||||||
nff=0;
|
nff=0;
|
||||||
nload=0;
|
nload=0;
|
||||||
}
|
}
|
||||||
void tesselate(const _face &fc, const Vec3 verts[], const dwmaterial *themat,GLUtesselator* ts, _dwobj *dwob)
|
void tesselate(const _face &fc, const std::vector<Vec3> verts, const dwmaterial *themat,GLUtesselator* ts, _dwobj *dwob)
|
||||||
{ // generates a set of primitives all of one type (eg tris, qstrip trifan...)
|
{ // generates a set of primitives all of one type (eg tris, qstrip trifan...)
|
||||||
nbegin=0; // number of triangle strips etc generated
|
nbegin=0; // number of triangle strips etc generated
|
||||||
fc.tesselate(verts, themat, ts, dwob, tmat);
|
fc.tesselate(verts, themat, ts, dwob, tmat);
|
||||||
nff+=nbegin; // the number of primitives generated
|
nff+=nbegin; // the number of primitives generated
|
||||||
}
|
}
|
||||||
void buildDrawable(Group *grp, Vec3 verts[], dwmaterial *themat, const int nverts) {
|
void buildDrawable(Group *grp, const std::vector<Vec3> verts, dwmaterial *themat, const int nverts) {
|
||||||
if (nload>0 && nff>0) { // there are some strips of this type
|
if (nload>0 && nff>0) { // there are some strips of this type
|
||||||
Geode *geode = new Geode;
|
Geode *geode = new Geode;
|
||||||
GeoSet *gset = new GeoSet;
|
GeoSet *gset = new GeoSet;
|
||||||
@ -482,7 +486,7 @@ public:
|
|||||||
// this may get destroyed if multiple combines are made by the tesselator
|
// this may get destroyed if multiple combines are made by the tesselator
|
||||||
// extending the array of vertices and freeing some memory GWM Feb 2002,
|
// extending the array of vertices and freeing some memory GWM Feb 2002,
|
||||||
for (i=0; i<nverts; i++) {
|
for (i=0; i<nverts; i++) {
|
||||||
vts[i].set(verts[i].x(),verts[i].y(),verts[i].z());
|
vts[i]=verts[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
geode->addDrawable(gset);
|
geode->addDrawable(gset);
|
||||||
@ -589,7 +593,7 @@ void CALLBACK error (GLenum errno)
|
|||||||
printf("tesselator error %d %s\n", errno,errm);//, errm
|
printf("tesselator error %d %s\n", errno,errm);//, errm
|
||||||
}
|
}
|
||||||
//==========
|
//==========
|
||||||
void _face::linkholes(const Vec3 verts[], const dwmaterial *themat, const _face *f2) const
|
void _face::linkholes(const std::vector<Vec3> verts, const dwmaterial *themat, const _face *f2) const
|
||||||
{
|
{
|
||||||
int ipr[2];
|
int ipr[2];
|
||||||
ipr[0]=nv-1;
|
ipr[0]=nv-1;
|
||||||
@ -599,7 +603,7 @@ void _face::linkholes(const Vec3 verts[], const dwmaterial *themat, const _face
|
|||||||
ipr[0]=ipr[1];
|
ipr[0]=ipr[1];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void _face::link(const int idop, const _face *f2, const int idop2,const Vec3 verts[], const dwmaterial *themat) const
|
void _face::link(const int idop, const _face *f2, const int idop2,const std::vector<Vec3> verts, const dwmaterial *themat) const
|
||||||
{ // to join up opposed faces of a hole; starts using hole[idop] in THIS, ands at f2.Hole[idop2]
|
{ // to join up opposed faces of a hole; starts using hole[idop] in THIS, ands at f2.Hole[idop2]
|
||||||
opening[idop].linkholes(verts, themat, &f2->opening[idop2]);
|
opening[idop].linkholes(verts, themat, &f2->opening[idop2]);
|
||||||
}
|
}
|
||||||
@ -615,8 +619,9 @@ private:
|
|||||||
//===================
|
//===================
|
||||||
class _dwobj { // class for design workshop read of a single object
|
class _dwobj { // class for design workshop read of a single object
|
||||||
public:
|
public:
|
||||||
_dwobj() {oldv=verts=NULL; nverts=nfaces=0; openings=NULL;faces=NULL; tmat=NULL; edges=NULL;
|
_dwobj() { nverts=nfaces=0; openings=NULL;faces=NULL; tmat=NULL; edges=NULL;
|
||||||
nopens=nfaceverts=0; fc1=fc2=NULL; colour[0]=colour[1]=colour[2]=colour[3]=1;
|
nopens=nfaceverts=0; fc1=fc2=NULL; colour[0]=colour[1]=colour[2]=colour[3]=1;
|
||||||
|
// oldv=verts=NULL;
|
||||||
}
|
}
|
||||||
~_dwobj() {/*delete verts; delete faces;delete openings;*/
|
~_dwobj() {/*delete verts; delete faces;delete openings;*/
|
||||||
delete fc1;delete fc2;
|
delete fc1;delete fc2;
|
||||||
@ -704,7 +709,7 @@ public:
|
|||||||
void setcolour(const float rgb[3]) {
|
void setcolour(const float rgb[3]) {
|
||||||
colour[0]=rgb[0]; colour[1]=rgb[1]; colour[2]=rgb[2];
|
colour[0]=rgb[0]; colour[1]=rgb[1]; colour[2]=rgb[2];
|
||||||
}
|
}
|
||||||
void reset() { faces=NULL; verts=NULL;
|
void reset() { faces=NULL; //verts=NULL;
|
||||||
nverts=nfaces=nfaceverts=nopens=nedges=0;
|
nverts=nfaces=nfaceverts=nopens=nedges=0;
|
||||||
}
|
}
|
||||||
void setmat(dwmaterial *mt) {
|
void setmat(dwmaterial *mt) {
|
||||||
@ -714,27 +719,24 @@ public:
|
|||||||
{ // read up to nexpected vertices
|
{ // read up to nexpected vertices
|
||||||
int ntot=nverts+nexpected;
|
int ntot=nverts+nexpected;
|
||||||
char buff[256];
|
char buff[256];
|
||||||
Vec3 *oldv=verts; // extend the vertex list
|
verts.reserve(ntot);
|
||||||
verts= new Vec3[ntot];
|
|
||||||
for (int i=0; i<nverts; i++) verts[i]=oldv[i];
|
|
||||||
delete [] oldv;
|
|
||||||
while (nverts<ntot) {
|
while (nverts<ntot) {
|
||||||
if (dwfgets(buff, sizeof( buff ), fp )) {
|
if (dwfgets(buff, sizeof( buff ), fp )) {
|
||||||
float x,y,z;
|
float x,y,z;
|
||||||
if (verts) {
|
sscanf(buff,"%f %f %f", &x, &y, &z);
|
||||||
sscanf(buff,"%f %f %f", &x, &y, &z);
|
Vec3 pos(x,-y,z);
|
||||||
verts[nverts].set(x,-y,z); // note DW uses a LH coord system (why??)
|
verts.push_back(pos);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
nverts++;
|
nverts++;
|
||||||
}
|
}
|
||||||
|
// osg::notify(osg::NOTICE) << nverts<<" inp "<<verts[nverts-1].x()<<
|
||||||
|
// " "<<verts[nverts-1].y()<<" "<<verts[nverts-1].z()<<" "<<verts.size()<< std::endl;
|
||||||
|
|
||||||
return nverts;
|
return nverts;
|
||||||
}
|
}
|
||||||
int addvtx(float x, float y, float z) { // add a single vertex to the object
|
int addvtx(float x, float y, float z) { // add a single vertex to the object
|
||||||
oldv=verts; // extend the vertex list
|
Vec3 pos(x,y,z);
|
||||||
verts= new Vec3[nverts+1];
|
verts.push_back(pos); //
|
||||||
for (int i=0; i<nverts; i++) verts[i]=oldv[i];
|
|
||||||
verts[nverts].set(x,y,z); //
|
|
||||||
nverts++;
|
nverts++;
|
||||||
return nverts-1;
|
return nverts-1;
|
||||||
}
|
}
|
||||||
@ -753,8 +755,7 @@ public:
|
|||||||
inline void setmx(Matrix *m) { mx=m;}
|
inline void setmx(Matrix *m) { mx=m;}
|
||||||
private:
|
private:
|
||||||
Vec4 colour;
|
Vec4 colour;
|
||||||
Vec3 *verts;
|
std::vector<Vec3> verts;
|
||||||
Vec3 *oldv; // may be deleted after a tesselation
|
|
||||||
dwmaterial *themat;
|
dwmaterial *themat;
|
||||||
osg::ushort nverts,nfaces,nedges;
|
osg::ushort nverts,nfaces,nedges;
|
||||||
osg::ushort nfaceverts;
|
osg::ushort nfaceverts;
|
||||||
@ -767,7 +768,7 @@ private:
|
|||||||
Matrix *mx; // current uvw transform for currently tessealting face
|
Matrix *mx; // current uvw transform for currently tessealting face
|
||||||
};
|
};
|
||||||
|
|
||||||
void _face::tesselate(const Vec3 verts[], const dwmaterial *themat,
|
void _face::tesselate(const std::vector<Vec3> verts, const dwmaterial *themat,
|
||||||
GLUtesselator *ts, _dwobj *dwob, const Matrix *tmat) const {
|
GLUtesselator *ts, _dwobj *dwob, const Matrix *tmat) const {
|
||||||
int nvall=getallverts();
|
int nvall=getallverts();
|
||||||
int nused=0;
|
int nused=0;
|
||||||
@ -864,11 +865,12 @@ void _dwobj::buildDrawable(Group *grp)
|
|||||||
faces[fc1[i]].link(openings[i*2], &faces[fc2[i]],openings[i*2+1],verts, themat);
|
faces[fc1[i]].link(openings[i*2], &faces[fc2[i]],openings[i*2+1],verts, themat);
|
||||||
}
|
}
|
||||||
prd.buildDrawable(grp, verts, themat, nverts);
|
prd.buildDrawable(grp, verts, themat, nverts);
|
||||||
if (oldv) delete [] oldv;
|
// if (oldv) delete [] oldv;
|
||||||
oldv=NULL;
|
// oldv=NULL;
|
||||||
}
|
}
|
||||||
gluDeleteTess(ts);
|
gluDeleteTess(ts);
|
||||||
} // primitive types
|
} // primitive types
|
||||||
|
verts.clear();
|
||||||
}
|
}
|
||||||
////////// tesselation complete
|
////////// tesselation complete
|
||||||
|
|
||||||
@ -892,7 +894,7 @@ class ReaderWriterDW : public osgDB::ReaderWriter
|
|||||||
}
|
}
|
||||||
|
|
||||||
virtual ReadResult readNode(const std::string& fileName,const osgDB::ReaderWriter::Options*)
|
virtual ReadResult readNode(const std::string& fileName,const osgDB::ReaderWriter::Options*)
|
||||||
{
|
{
|
||||||
_dwobj obj;
|
_dwobj obj;
|
||||||
enum reading {NONE, MATERIAL, OBJECT};
|
enum reading {NONE, MATERIAL, OBJECT};
|
||||||
//osg::ushort nrecs=0; // number of records read after a divider (numVerts, numFaces, numOpenings...)
|
//osg::ushort nrecs=0; // number of records read after a divider (numVerts, numFaces, numOpenings...)
|
||||||
@ -908,6 +910,9 @@ class ReaderWriterDW : public osgDB::ReaderWriter
|
|||||||
char buff[256];
|
char buff[256];
|
||||||
|
|
||||||
notify(INFO)<< "ReaderWriterDW::readNode( "<<fileName.c_str()<<" )\n";
|
notify(INFO)<< "ReaderWriterDW::readNode( "<<fileName.c_str()<<" )\n";
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
notify(osg::NOTICE)<< "MS Visual C++ version "<<_MSC_VER<<"\n";
|
||||||
|
#endif
|
||||||
|
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ void Optimizer::optimize(osg::Node* node, unsigned int options)
|
|||||||
|
|
||||||
if (options & SHARE_DUPLICATE_STATE)
|
if (options & SHARE_DUPLICATE_STATE)
|
||||||
{
|
{
|
||||||
#if (defined(_MSC_VER) && _MSC_VER<13 && !defined(_STLPORT_VERSION))
|
#if (defined(_MSC_VER) && _MSC_VER<1300 && !defined(_STLPORT_VERSION))
|
||||||
osg::notify(osg::INFO)<<"Warning: VisualStudio 6.0 build, unable to run state optimizer"<<std::endl;
|
osg::notify(osg::INFO)<<"Warning: VisualStudio 6.0 build, unable to run state optimizer"<<std::endl;
|
||||||
#else
|
#else
|
||||||
StateVisitor osv;
|
StateVisitor osv;
|
||||||
|
Loading…
Reference in New Issue
Block a user