trpage_geom.cpp
来自「最新osg包」· C++ 代码 · 共 840 行 · 第 1/2 页
CPP
840 行
return true;}bool trpgGeometry::GetNormals(float64 *v) const{ unsigned int i; if (!isValid()) return false; if (normDataFloat.size() != 0) for (i=0;i<normDataFloat.size();i++) v[i] = normDataFloat[i]; else for (i=0;i<normDataDouble.size();i++) v[i] = normDataDouble[i]; return true;}bool trpgGeometry::GetNumColorSets(int &n) const{ if (!isValid()) return false; n = colors.size(); return true;}bool trpgGeometry::GetColorSet(int id,trpgColorInfo *ci) const{ if (!isValid() || id < 0 || id >= (int)colors.size()) return false; *ci = colors[id]; return true;}bool trpgGeometry::GetNumTexCoordSets(int &n) const{ if (!isValid()) return false; n = texData.size(); return true;}bool trpgGeometry::GetTexCoordSet(int id,trpgTexData *tx) const{ if (!isValid() || id < 0 || id >= (int)texData.size()) return false; *tx = texData[id]; return true;}const trpgTexData *trpgGeometry::GetTexCoordSet(int id) const{ if (!isValid() || id < 0 || id >= (int)texData.size()) return 0; return &(texData[id]);}bool trpgGeometry::GetNumEdgeFlag(int &n) const{ if (!isValid()) return false; n = edgeFlags.size(); return true;}bool trpgGeometry::GetEdgeFlags(char *e) const{ if (!isValid()) return false; for (unsigned int i=0;i<edgeFlags.size();i++) e[i] = edgeFlags[i]; return true;}// Validity check// Note: maybe I should do this sometimebool trpgGeometry::isValid() const{ return true;}// Write geometry fields.// Order doesn't matter very much for thisbool trpgGeometry::Write(trpgWriteBuffer &buf){ unsigned int i,j; if (!isValid()) return false; buf.Begin(TRPG_GEOMETRY); /* Primitive info Primitive Type Number of primitives Primitive array lengths */ buf.Begin(TRPG_GEOM_PRIM); buf.Add(primType); buf.Add(numPrim); if (primLength.size() != 0) { buf.Add((uint8)1); for (i=0;i<(unsigned int)numPrim;i++) buf.Add(primLength[i]); } else buf.Add((uint8)0); buf.End(); /* Material info Num materials Material indicies */ if (materials.size() > 0) { buf.Begin(TRPG_GEOM_MATERIAL); buf.Add((int32)materials.size()); for (i=0;i<materials.size();i++) buf.Add(materials[i]); buf.End(); } /* Vertices Float and Double should never both be here Num vertex Vertex data */ if (vertDataFloat.size() > 0) { buf.Begin(TRPG_GEOM_VERT32); int32 num = vertDataFloat.size()/3; buf.Add(num); for (i=0;i<(unsigned int)3*num;i++) buf.Add(vertDataFloat[i]); buf.End(); } if (vertDataDouble.size() > 0) { buf.Begin(TRPG_GEOM_VERT64); int32 num = vertDataDouble.size()/3; buf.Add(num); for (i=0;i<(unsigned int)3*num;i++) buf.Add(vertDataDouble[i]); buf.End(); } /* Normals Normal binding Num normals Normal data */ if (normDataFloat.size() > 0) { buf.Begin(TRPG_GEOM_NORM32); buf.Add((int32)normBind); int32 num = normDataFloat.size()/3; buf.Add(num); for (i=0;i<(unsigned int)3*num;i++) buf.Add(normDataFloat[i]); buf.End(); } if (normDataDouble.size() > 0) { buf.Begin(TRPG_GEOM_NORM64); buf.Add((int32)normBind); int32 num = normDataDouble.size()/3; buf.Add(num); for (i=0;i<(unsigned int)3*num;i++) buf.Add(normDataDouble[i]); buf.End(); } /* Colors Color binding Num colors Colors */ if (colors.size() > 0) { for (i=0;i<colors.size();i++) { trpgColorInfo &ci = colors[i]; if (ci.data.size()) { buf.Begin(TRPG_GEOM_COLOR); buf.Add((int32)ci.type); buf.Add((int32)ci.bind); buf.Add((int32)ci.data.size()); for (j=0;j<ci.data.size();j++) buf.Add(ci.data[j]); buf.End(); } } } /* Texture coordinates Binding Num coords Texture coords */ for (i=0;i<texData.size();i++) { trpgTexData &td = texData[i]; if (td.floatData.size()) { buf.Begin(TRPG_GEOM_TEX32); buf.Add((int32)td.bind); int32 num = td.floatData.size()/2; buf.Add(num); for (j=0;j<(unsigned int)num*2;j++) buf.Add(td.floatData[j]); buf.End(); } if (td.doubleData.size()) { buf.Begin(TRPG_GEOM_TEX64); buf.Add((int32)td.bind); int32 num = td.doubleData.size()/2; buf.Add(num); for (j=0;j<(unsigned int)num*2;j++) buf.Add(td.doubleData[j]); buf.End(); float u; for (j=0;j<(unsigned int)num*2;j++) u = (float)td.doubleData[j]; } } // Edge flags (for triangle strips, etc..) if (edgeFlags.size() > 0) { buf.Begin(TRPG_GEOM_EFLAG); buf.Add((int32)edgeFlags.size()); for (i=0;i<edgeFlags.size();i++) buf.Add(edgeFlags[i]); buf.End(); } buf.End(); return true;}// Geometry class is made up of individual tokens.class geomCB : public trpgr_Callback {public: void *Parse(trpgToken,trpgReadBuffer &buf); trpgGeometry *geom;};void *geomCB::Parse(trpgToken tok,trpgReadBuffer &buf){ int32 *iData; int32 num,primType,bind,type; float32 *fData; float64 *dData; trpgColor *cData; char *charData; uint8 hasPrimLen; try { switch (tok) { case TRPG_GEOM_PRIM: buf.Get(primType); geom->SetPrimType((trpgGeometry::PrimType)primType); buf.Get(num); if (num < 0) throw 1; geom->SetNumPrims(num); buf.Get(hasPrimLen); if (hasPrimLen) { buf.GetArray(num,&iData); if (ALIGNMENT_WORKAROUND) { int32 *aligned; aligned = (int32 *)calloc (num, sizeof(int32)); memcpy (aligned, iData, num * sizeof(int32)); geom->SetPrimLengths(num, aligned); free (aligned); } else geom->SetPrimLengths(num,iData); } break; case TRPG_GEOM_MATERIAL: buf.Get(num); if (num < 0) throw 1; buf.GetArray(num,&iData); if (ALIGNMENT_WORKAROUND) { int32 *aligned; aligned = (int32 *)calloc (num, sizeof(int32)); memcpy (aligned, iData, num * sizeof(int32)); geom->SetMaterials(num,aligned); free (aligned); } else geom->SetMaterials(num,iData); break; case TRPG_GEOM_VERT32: buf.Get(num); if (num < 0) throw 1; buf.GetArray(3*num,&fData); if (ALIGNMENT_WORKAROUND) { float32 *aligned; aligned = (float32 *)calloc (3*num, sizeof(float32)); memcpy (aligned, fData, 3*num * sizeof(float32)); geom->SetVertices(num,aligned); free (aligned); } else geom->SetVertices(num,fData); break; case TRPG_GEOM_VERT64: buf.Get(num); if (num < 0) throw 1; buf.GetArray(3*num,&dData); if (ALIGNMENT_WORKAROUND) { float64 *aligned; aligned = (float64 *)calloc (3*num, sizeof(float64)); memcpy (aligned, dData, 3*num * sizeof(float64)); geom->SetVertices(num,aligned); free (aligned); } else geom->SetVertices(num,dData); break; case TRPG_GEOM_NORM32: buf.Get(bind); buf.Get(num); if (num < 0) throw 1; buf.GetArray(3*num,&fData); if (ALIGNMENT_WORKAROUND) { float32 *aligned; aligned = (float32 *)calloc (3*num, sizeof(float32)); memcpy (aligned, fData, 3*num * sizeof(float32)); geom->SetNormals(num,(trpgGeometry::BindType)bind,aligned); free (aligned); } else geom->SetNormals(num,(trpgGeometry::BindType)bind,fData); break; case TRPG_GEOM_NORM64: buf.Get(bind); buf.Get(num); if (num < 0) throw 1; buf.GetArray(3*num,&dData); if (ALIGNMENT_WORKAROUND) { float64 *aligned; aligned = (float64 *)calloc (3*num, sizeof(float64)); memcpy (aligned, dData, 3*num * sizeof(float64)); geom->SetNormals(num,(trpgGeometry::BindType)bind,aligned); free (aligned); } else geom->SetNormals(num,(trpgGeometry::BindType)bind,dData); break; case TRPG_GEOM_COLOR: buf.Get(num); if (num < 0) throw 1; buf.Get(type); buf.Get(bind); buf.GetArray(num,&cData); if (ALIGNMENT_WORKAROUND) { trpgColor *aligned; aligned = (trpgColor *)calloc (num, sizeof(trpgColor)); memcpy (aligned, cData, num * sizeof(trpgColor)); geom->SetColors(num,(trpgGeometry::ColorType)type,(trpgGeometry::BindType)bind,aligned); free (aligned); } else geom->SetColors(num,(trpgGeometry::ColorType)type,(trpgGeometry::BindType)bind,cData); break; case TRPG_GEOM_TEX32: buf.Get(bind); buf.Get(num); if (num < 0) throw 1; buf.GetArray(2*num,&fData); if (ALIGNMENT_WORKAROUND) { float32 *aligned; aligned = (float32 *)calloc (2*num, sizeof(float32)); memcpy (aligned, fData, 2*num * sizeof(float32)); geom->SetTexCoords(num,(trpgGeometry::BindType)bind,aligned); free (aligned); } else geom->SetTexCoords(num,(trpgGeometry::BindType)bind,fData); break; case TRPG_GEOM_TEX64: buf.Get(bind); buf.Get(num); if (num < 0) throw 1; buf.GetArray(2*num,&dData); if (ALIGNMENT_WORKAROUND) { float64 *aligned; aligned = (float64 *)calloc (2*num, sizeof(float64)); memcpy (aligned, dData, 2*num * sizeof(float64)); geom->SetTexCoords(num,(trpgGeometry::BindType)bind,aligned); free (aligned); } else geom->SetTexCoords(num,(trpgGeometry::BindType)bind,dData); break; case TRPG_GEOM_EFLAG: buf.Get(num); if (num < 0) throw 1; buf.GetArray(num,&charData); geom->SetEdgeFlags(num,charData); break; default: // Skip break; } } catch (...) { return NULL; } return geom;}// Read Geometrybool trpgGeometry::Read(trpgReadBuffer &buf){ trpgr_Parser parse; geomCB gcb; gcb.geom = this; parse.AddCallback(TRPG_GEOM_PRIM,&gcb,false); parse.AddCallback(TRPG_GEOM_MATERIAL,&gcb,false); parse.AddCallback(TRPG_GEOM_VERT32,&gcb,false); parse.AddCallback(TRPG_GEOM_VERT64,&gcb,false); parse.AddCallback(TRPG_GEOM_NORM32,&gcb,false); parse.AddCallback(TRPG_GEOM_NORM64,&gcb,false); parse.AddCallback(TRPG_GEOM_COLOR,&gcb,false); parse.AddCallback(TRPG_GEOM_TEX32,&gcb,false); parse.AddCallback(TRPG_GEOM_TEX64,&gcb,false); parse.AddCallback(TRPG_GEOM_EFLAG,&gcb,false); parse.Parse(buf); return isValid();}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?