示例#1
0
/** If a mesh does not yet exist, create it as a CC3Mesh with interleaved vertices. */
CC3Mesh* CC3MeshNode::ensureMesh()
{
	if ( !_mesh ) 
		setMesh( makeMesh() );

	return _mesh;
}
示例#2
0
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;
}
示例#3
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;
}
示例#4
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;
}
示例#5
0
//===========================================================================
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;
    
}
示例#7
0
//===========================================================================
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_;
    }
}
示例#8
0
//===================================================================
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();
}
示例#9
0
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();
}
示例#10
0
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;
    
}
示例#12
0
 Mesh(const Geometry& geom){
     makeMesh(geom);
 }
示例#13
0
/*-------------------------------------------------------------------------
 * 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 );
}