/** If a mesh does not yet exist, create it as a CC3Mesh with interleaved vertices. */ CC3Mesh* CC3MeshNode::ensureMesh() { if ( !_mesh ) setMesh( makeMesh() ); return _mesh; }
int main(int argc, char *argv[]) { argList::noParallel(); argList::validArgs.append("SAMM mesh file prefix"); argList::addOption ( "scale", "factor", "geometry scaling factor - default is 1" ); argList args(argc, argv); if (!args.check()) { FatalError.exit(); } const scalar scaleFactor = args.optionLookupOrDefault("scale", 1.0); # include "createTime.H" sammMesh makeMesh(args[1], runTime, scaleFactor); // Set the precision of the points data to 10 IOstream::defaultPrecision(10); Info<< "Writing mesh" << endl; makeMesh.writeMesh(); Info<< "\nEnd\n" << endl; return 0; }
int main(int argc, char *argv[]) { argList::noParallel(); argList::validArgs.append("STAR mesh file prefix"); argList::validOptions.insert("scale", "scale factor"); argList args(argc, argv); if (!args.check()) { FatalError.exit(); } scalar scaleFactor = 1.0; args.optionReadIfPresent("scale", scaleFactor); # include "createTime.H" fileName starMeshFile(args.additionalArgs()[0]); starMesh makeMesh(starMeshFile, runTime, scaleFactor); // Set the precision of the points data to 10 IOstream::defaultPrecision(10); Info << "Writing mesh" << endl; makeMesh.writeMesh(); Info<< nl << "End" << nl << endl; return 0; }
//=========================================================================== RotatedBox ParamCurveInt::getRotatedBox(std::vector<Point>& axis) const //=========================================================================== { int size = 100; makeMesh(size); RotatedBox box(&mesh_[0], dimension(), (int)mesh_.size(), 1, &axis[0]); return box; }
//=========================================================================== vector<double>::iterator ParamCurveInt::getMesh() //=========================================================================== { int meshsize = 5; if (mesh_.size() == 0) makeMesh(meshsize); return mesh_.begin(); }
bool Cterrain::init(const string&heightMapFileName,const Cc3dRect&rect,float heightScale,int quadtreeDepth, Cc3dTexture*texture){ assert(rect.getWidth()==rect.getHeight()); m_heightScale=heightScale; m_quadtreeDepth=quadtreeDepth; m_heightMapFileName=heightMapFileName; //生成mesh Cc3dMesh*mesh=new Cc3dMesh(); mesh->init(); mesh->autorelease(); addMesh(mesh); //读取高程数据--abc readLandMat(); //求高度范围--abc float Hmin=c3d_INF; float Hmax=-c3d_INF; for(int i=0;i<(int)landMat.size();i++){//倒序--abc for(int j=0;j<(int)landMat[i].size();j++){//正序--abc if(landMat[i][j]>Hmax){ Hmax=landMat[i][j]; } if(landMat[i][j]<Hmin){ Hmin=landMat[i][j]; } } }//得到Hmin和Hmax //设置m_range m_range.init(rect.getMinX(), rect.getMaxX(), Hmin, Hmax, rect.getMinY(), rect.getMaxY()); //计算步长--abc int markMatSideLength=pow(2.0,m_quadtreeDepth-1)+1;//do not use 2, should use 2.0, see: http://www.360doc.com/content/11/0826/15/7566064_143451209.shtml gridSize=m_range.getSpanX()/(markMatSideLength-1); //填充法向数据--abc fillNormalMat(); //markmat开辟空间--abc markmat.resize(markMatSideLength); for(int i=0;i<(int)markmat.size();i++){ markmat[i].resize(markMatSideLength); for(int j=0;j<(int)markmat[i].size();j++){ markmat[i][j]=0; } } //制作ground submesh Cc3dSubMesh*submesh=new Cc3dSubMesh(); submesh->autorelease(); submesh->init(); submesh->setTexture(texture); submesh->getIndexVBO()->genBuffers(); this->getMesh()->addSubMesh(submesh); //make submesh makeMesh(); return true; }
//=========================================================================== int ParamCurveInt::getMeshSize(int dir) //=========================================================================== { int meshsize = 5; if (dir != 0) return 1; else { if (mesh_.size() == 0) makeMesh(meshsize); return (int)mesh_.size()/dim_; } }
//=================================================================== AnnulusMesh::AnnulusMesh(float rou, float rin, int nseg, QObject *parent) : Mesh(parent), mRin(rin), mRou(rou), mSeg(nseg) { // ctor setObjectName("Annulus"); if (rou < rin) { qWarning("Annulus::Annulus: outer radius must be larger than inner radius"); exit(QtWarningMsg); } makeMesh(); }
void testApp::generateMesh(vector<ofVec3f> * array) { //Create initial mesh float depth = panel.getValueF("depth"); float radius = panel.getValueF("radius"); int maxDays = panel.getValueI("maxDays"); array->clear(); for(int days=1; days<=maxDays; days++) { for(int hours=0; hours<23; hours++) { unwrapPoint = 1.0f; float rotation = (hours*(TWO_PI * unwrapPoint)) / 23; float x = radius * cos(rotation); float y = radius * sin(rotation); float z = (depth * (hours+1)/24) + (depth * days); ofVec3f clockPosition(x,y,z); array->push_back(clockPosition); } } makeMesh(); }
Exporter::Result Exporter::exportMesh(NiNodeRef &ninode, INode *node, TimeValue t) { ObjectState os = node->EvalWorldState(t); bool local = !mFlattenHierarchy; TriObject *tri = (TriObject *)os.obj->ConvertToType(t, Class_ID(TRIOBJ_CLASS_ID, 0)); if (!tri) return Skip; Mesh *copymesh = NULL; Mesh *mesh = &tri->GetMesh(); Matrix3 mtx(true), rtx(true); if (Exporter::mCollapseTransforms) { mtx = GetNodeLocalTM(node, t); mtx.NoTrans(); Quat q(mtx); q.MakeMatrix(rtx); mesh = copymesh = new Mesh(*mesh); { int n = mesh->getNumVerts(); for ( unsigned int i = 0; i < n; ++i ) { Point3& vert = mesh->getVert(i); vert = mtx * vert; } mesh->checkNormals(TRUE); #if VERSION_3DSMAX > ((5000<<16)+(15<<8)+0) // Version 6+ MeshNormalSpec *specNorms = mesh->GetSpecifiedNormals (); if (NULL != specNorms) { specNorms->CheckNormals(); for ( unsigned int i = 0; i < specNorms->GetNumNormals(); ++i ) { Point3& norm = specNorms->Normal(i); norm = (rtx * norm).Normalize(); } } #endif } } // Note that calling setVCDisplayData will clear things like normals so we set this up first vector<Color4> vertColors; if (mVertexColors) { bool hasvc = false; if (mesh->mapSupport(MAP_ALPHA)) { mesh->setVCDisplayData(MAP_ALPHA); int n = mesh->getNumVertCol(); if (n > vertColors.size()) vertColors.assign(n, Color4(1.0f, 1.0f, 1.0f, 1.0f)); VertColor *vertCol = mesh->vertColArray; if (vertCol) { for (int i=0; i<n; ++i) { VertColor c = vertCol[ i ]; float a = (c.x + c.y + c.z) / 3.0f; vertColors[i].a = a; hasvc |= (a != 1.0f); } } } if (mesh->mapSupport(0)) { mesh->setVCDisplayData(0); VertColor *vertCol = mesh->vertColArray; int n = mesh->getNumVertCol(); if (n > vertColors.size()) vertColors.assign(n, Color4(1.0f, 1.0f, 1.0f, 1.0f)); if (vertCol) { for (int i=0; i<n; ++i) { VertColor col = vertCol[ i ]; vertColors[i] = Color4(col.x, col.y, col.z, vertColors[i].a); hasvc |= (col.x != 1.0f || col.y != 1.0f || col.z != 1.0f); } } } if (!hasvc) vertColors.clear(); } #if VERSION_3DSMAX <= ((5000<<16)+(15<<8)+0) // Version 5 mesh->checkNormals(TRUE); #else MeshNormalSpec *specNorms = mesh->GetSpecifiedNormals (); if (NULL != specNorms) { specNorms->CheckNormals(); if (specNorms->GetNumNormals() == 0) mesh->checkNormals(TRUE); } else { mesh->checkNormals(TRUE); } #endif Result result = Ok; Modifier* geomMorpherMod = GetMorpherModifier(node); bool noSplit = FALSE; // bool noSplit = (NULL != geomMorpherMod); while (1) { FaceGroups grps; if (!splitMesh(node, *mesh, grps, t, vertColors, noSplit)) { result = Error; break; } bool exportStrips = mTriStrips && (Exporter::mNifVersionInt > VER_4_2_2_0); Matrix44 tm = Matrix44::IDENTITY; if ( mExportExtraNodes || (mExportType != NIF_WO_ANIM && isNodeKeyed(node) ) ) { tm = TOMATRIX4(getObjectTransform(node, t, false) * Inverse(getNodeTransform(node, t, false))); } else { Matrix33 rot; Vector3 trans; objectTransform(rot, trans, node, t, local); tm = Matrix44(trans, rot, 1.0f); } tm = TOMATRIX4(Inverse(mtx)) * tm; TSTR basename = node->NodeName(); TSTR format = (!basename.isNull() && grps.size() > 1) ? "%s:%d" : "%s"; int i=1; FaceGroups::iterator grp; for (grp=grps.begin(); grp!=grps.end(); ++grp, ++i) { string name = FormatString(format, basename.data(), i); NiTriBasedGeomRef shape = makeMesh(ninode, getMaterial(node, grp->first), grp->second, exportStrips); if (shape == NULL) { result = Error; break; } if (node->IsHidden()) shape->SetVisibility(false); shape->SetName(name); shape->SetLocalTransform(tm); if (Exporter::mZeroTransforms) { shape->ApplyTransforms(); } makeSkin(shape, node, grp->second, t); if (geomMorpherMod) { vector<Vector3> verts = shape->GetData()->GetVertices(); exportGeomMorpherControl(geomMorpherMod, verts, shape->GetData()->GetVertexIndices(), shape); shape->GetData()->SetConsistencyFlags(CT_VOLATILE); } } break; } if (tri != os.obj) tri->DeleteMe(); if (copymesh) delete copymesh; return result; }
bool Cterrain::init(const string&heightMapFileName,const Cc3dRect&rect,float heightScale,int quadtreeDepth, Cc3dTexture*texture){ assert(rect.getWidth()==rect.getHeight()); m_heightScale=heightScale; m_quadtreeDepth=quadtreeDepth; m_heightMapFileName=heightMapFileName; //生成model Cc3dModel*model=new Cc3dModel(); model->init(); model->autorelease(); addModel(model); //读取高程数据 readLandMat(); //求高度范围 float Hmin=c3d_INF; float Hmax=-c3d_INF; for(int i=0;i<(int)landMat.size();i++){//倒序 for(int j=0;j<(int)landMat[i].size();j++){//正序 if(landMat[i][j]>Hmax){ Hmax=landMat[i][j]; } if(landMat[i][j]<Hmin){ Hmin=landMat[i][j]; } } }//得到Hmin和Hmax //设置m_range m_range.init(rect.getMinX(), rect.getMaxX(), Hmin, Hmax, rect.getMinY(), rect.getMaxY()); //计算步长 int markMatSideLength=pow(2,m_quadtreeDepth-1)+1; gridSize=m_range.getSpanX()/(markMatSideLength-1); //填充法向数据 fillNormalMat(); //markmat开辟空间 markmat.resize(markMatSideLength); for(int i=0;i<(int)markmat.size();i++){ markmat[i].resize(markMatSideLength); for(int j=0;j<(int)markmat[i].size();j++){ markmat[i][j]=0; } } //制作ground mesh Cc3dMesh*mesh=new Cc3dMesh(); mesh->autorelease(); mesh->init(); mesh->setTexture(texture); mesh->getIndexVBO()->genBuffers(); this->getModel()->addMesh(mesh); //make mesh makeMesh(); //xxxx下面要去掉 //申请空间不光要考虑矩形,还要考虑三角形 //另外注意一个矩形要拆成两个三角形,所以是六个顶点(而非四个) //矩形最大数量:BMPHEIGHT*BMPWIDTH //矩形分裂出的最大三角形数量:BMPHEIGHT*BMPWIDTH*2 //补洞三角形最大数量:等于mesh网格的非边缘边个数,等于BMPHEIGHT*(BMPWIDTH-1)+BMPWIDTH*(BMPHEIGHT-1) //所以总共有BMPHEIGHT*BMPWIDTH*2+(BMPHEIGHT*(BMPWIDTH-1)+BMPWIDTH*(BMPHEIGHT-1))个三角形 int bmpHeight=(int)landMat.size(); int bmpWidth=(int)landMat[0].size(); this->getModel()->getMeshByIndex(0)->getMeshData()->IDtriList.reserve(bmpHeight*bmpWidth*2+(bmpHeight*(bmpWidth-1)+bmpWidth*(bmpHeight-1))); return true; }
Mesh(const Geometry& geom){ makeMesh(geom); }
/*------------------------------------------------------------------------- * mapmesh2f - evaluate a mesh of points on lattice *------------------------------------------------------------------------- */ void _SoNurbsSurfaceEvaluator::mapmesh2f( long style, long umin, long umax, long vmin, long vmax ) { makeMesh( umin, umax, vmin, vmax ); }