本文整理汇总了C++中SMeshBuffer::setHardwareMappingHint方法的典型用法代码示例。如果您正苦于以下问题:C++ SMeshBuffer::setHardwareMappingHint方法的具体用法?C++ SMeshBuffer::setHardwareMappingHint怎么用?C++ SMeshBuffer::setHardwareMappingHint使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类SMeshBuffer
的用法示例。
在下文中一共展示了SMeshBuffer::setHardwareMappingHint方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: createMeshFromSoftBody
IMesh* MeshTools::createMeshFromSoftBody(btSoftBody* softBody)
{
SMeshBuffer* buffer = new SMeshBuffer();
video::S3DVertex vtx;
vtx.Color.set(255,255,255,255);
/* Each soft body contain an array of vertices (nodes/particles_mass) */
btSoftBody::tNodeArray& nodes(softBody->m_nodes);
// Convert bullet nodes to vertices
for(int i=0;i<nodes.size();++i)
{
const btSoftBody::Node& n=nodes[i];
const btVector3 normal=n.m_n;
const btVector3 pos=n.m_x;
vtx.Pos.set(pos.getX(), pos.getY(), pos.getZ());
vtx.Normal.set(normal.getX(), normal.getY(), normal.getZ());
// TODO: calculate texture coords
//vtx.TCoords.set(tsx, tsy);
buffer->Vertices.push_back(vtx);
}
// Convert triangles of the softbody to an index list
for(int i=0;i<softBody->m_faces.size();++i)
{
auto faces = softBody->m_faces;
btSoftBody::Node* node_0=faces[i].m_n[0];
btSoftBody::Node* node_1=faces[i].m_n[1];
btSoftBody::Node* node_2=faces[i].m_n[2];
const int indices[] =
{
int(node_0-&nodes[0]),
int(node_1-&nodes[0]),
int(node_2-&nodes[0])
};
for(int j=0;j<3;++j)
buffer->Indices.push_back(indices[j]);
}
buffer->recalculateBoundingBox();
// Default the mesh to stream because most likely we will be updating
// the vertex positions every frame to deal with softbody movement.
buffer->setHardwareMappingHint(EHM_STREAM);
SMesh* mesh = new SMesh();
mesh->addMeshBuffer(buffer);
mesh->recalculateBoundingBox();
buffer->drop();
return mesh;
}
示例2: createMeshFromHeightmap
//.........这里部分代码省略.........
vert.Pos.set(x, y, thisHeight);
// I'm only averaging normals along the 4 compass directions. It's
// arguable whether diagonals should count; I chose to ignore diagonals.
// Ignoring diagonals allows me to assume the "run" in rise/run is always
// just one unit; if you add diagonals here you'll also need to change
// the slope calculation to use the actual distance instead of assuming 1.
vector2di offsetsArray[] = {
vector2di( 1, 0), // 3 o'clock
vector2di( 0, 1), // 12 o'clock
vector2di(-1, 0), // 9 o'clock
vector2di( 0,-1) // 6 o'clock
};
// Calculate the normals of the surrounding slopes.
// Uses the image, not just the tile patch size, so it will
// calculate correct normals for vertices on tile edges.
for (size_t i=-0; i < 4; ++i)
{
vector2di offset = vector2di(x,y) + offsetsArray[i];
// Skip this offset if it's outside the image
if (offset.X < 0 || offset.Y < 0 || offset.X >= (s32)imageDimension.Width || offset.Y >= (s32)imageDimension.Height)
continue;
vector2di otherPixelPos(
startAtPixel.X+x+offset.X,
startAtPixel.Y-y-offset.Y
);
float otherHeight = 255 - image->getPixel((u32)otherPixelPos.X, (u32)otherPixelPos.Y).getAverage();
// The code Irrlicht's in terrain scene node does all kinds of complicated
// business with cross products and such - waaay over complicated. You don't need
// all that stuff. Dude it' s a heightmap: all you need to worray about is
// rise over run on unit intervals! Algebra 1 type stuff, y = mx + c
// Calculate the rise of the line over the run, taking into account the fact
// that the offset could be in either direction.
float rise = (offset.X < 0 || offset.Y < 0)? thisHeight - otherHeight : otherHeight - thisHeight;
// Assuming that run = 1, m = rise / run is just m = rise.
float m = rise;
// The the slope of the normal is just the negative of the reciprocal of the line slope.
float n = -1.0f / rise;
// The X,Y of the normal vector is just going to be the X and Y of the offset
// (think about it - obviously the normal of the slope must tilt in the direction of the run)
// and the Z of the normal vector is just the slope of the normal over that run.
vector3df normVect(offset.X, offset.Y, n);
//vert.Normal += normVect;
}
//vert.Normal.normalize();
vert.Normal.set(0,0,-1.0f);
}
}
// Pre-allocate index data to 2*3*Width*Height for triangles.
// There is actually 1 less square per count of vertices though,
// for instance if you had 2x2 vertices, you only have 1 square.
buffer->Indices.set_used(2*3*(useTileSize.Width-1)*(useTileSize.Height-1));
// Start with 1 and generate all the triangles from their top right corners.
// Like this (A is top right corner at x,y):
//
// y=1 B---A
// | / |
// y=0 C---D
// x=0 x=1
for (u32 dst=0, x=1; x < useTileSize.Width; ++x)
{
for (u32 y=1; y < useTileSize.Height; ++y)
{
u32 A = getIndex(useTileSize, x, y );
u32 B = getIndex(useTileSize, x-1, y );
u32 C = getIndex(useTileSize, x-1, y-1 );
u32 D = getIndex(useTileSize, x, y-1 );
buffer->Indices[dst++] = C;
buffer->Indices[dst++] = B;
buffer->Indices[dst++] = A;
buffer->Indices[dst++] = D;
buffer->Indices[dst++] = C;
buffer->Indices[dst++] = A;
}
}
buffer->recalculateBoundingBox();
buffer->setHardwareMappingHint(EHM_STATIC);
SMesh* mesh = new SMesh();
mesh->addMeshBuffer(buffer);
mesh->recalculateBoundingBox();
buffer->drop();
return mesh;
}
示例3: splitMeshZ
//.........这里部分代码省略.........
// 1 cont. AB' AB' AB' replaces B in P
// 2 - B B proper is in Q and not in P
// 2 cont. - - Link B-C is not split
// 3 - C C proper is in Q and not in P
// 3 cont. CA' CA' CA' replaces C in P
//
// Now, read the columns P and Q vertically top to bottom to see the resultant vertex order.
// The triangle P is trivially still the correct winding order; it is just a smaller triangle now.
// The new quad Q retains the old triangle's winding order property for the following reason:
// As you wrapped around a full circle in old triangle A-B-C you would have traversed C-A then A-B.
// The link C-A has been cut and vertex CA' inserted.
// The link A-B has been cut and vertex AB' inserted.
// If you traverse the new shape starting from the _middle_ you follow the following path:
// B-C C-CA' CA'-AB' AB'-B B-C (again)
// Compare to old triangle:
// B-C C-A A-B B-C (again)
// Even though vertex A has been cut off and replaced with two vertices, the two
// new vertices lie along the path that the old links took and are in the new shape in the right order.
mid1 = linkSplitter.processLink(leftShape, rightShape, a, b);
mid2 = linkSplitter.processLink(leftShape, rightShape, b, c);
mid3 = linkSplitter.processLink(leftShape, rightShape, c, a);
}
// If a triangle was split then two of those three midpoints are inhabited by a vertex.
// We want to get them both in mid1 and mid2 AND we need them in correct order.
PsblVertPtr cut1 = (mid1 && mid2)? mid1 : mid2;
PsblVertPtr cut2 = (mid2 && mid3)? mid3 : mid2;
if (cut1 && cut2)
{
vector<PsblVertPtr> chain = linkSplitter.chopLink(cut1, cut2, 1);
linkSplitter.insertPoints(leftShape, cut1, cut2, chain);
linkSplitter.insertPoints(rightShape, cut1, cut2, chain);
}
linkSplitter.addConvexShape(leftShape, leftMeshBuf, -offset/2);
linkSplitter.addConvexShape(rightShape, rightMeshBuf, offset/2);
// Add any edges of the left shape that lie along the border.
linkSplitter.addEdgeLinks(leftShape, leftEdgeLinks);
// Right side polys that share a border with left side ones will have
// opposite winding order. In order for set_intersection to consider them
// as matches, we'll store the right side links in reversed order.
std::reverse(rightShape.begin(), rightShape.end());
linkSplitter.addEdgeLinks(rightShape, rightEdgeLinks);
}
SMesh* leftMesh = new SMesh();
leftMeshBuf->recalculateBoundingBox();
leftMeshBuf->setHardwareMappingHint(EHM_STATIC);
leftMesh->addMeshBuffer(leftMeshBuf);
leftMesh->recalculateBoundingBox();
leftMeshBuf->drop(); // we drop the buf, mesh obj has it now
SMesh* rightMesh = new SMesh();
rightMeshBuf->recalculateBoundingBox();
rightMeshBuf->setHardwareMappingHint(EHM_STATIC);
rightMesh->addMeshBuffer(rightMeshBuf);
rightMesh->recalculateBoundingBox();
rightMeshBuf->drop(); // we drop the buf, mesh obj has it now
SMesh* middleMesh = NULL;
if (zInsert > 0)
{
set<pair<PsblVertPtr,PsblVertPtr>> result;
std::set_intersection(
leftEdgeLinks.begin(), leftEdgeLinks.end(),
rightEdgeLinks.begin(), rightEdgeLinks.end(),
std::inserter(result, result.begin())
);
size_t debugsize = result.size();
if (result.size() > 0)
{
SMeshBuffer* middleMeshBuf = new SMeshBuffer();
vector<PsblVertPtr> shape(4);
for (auto it=result.begin(); it!=result.end(); ++it)
{
shape[0] = it->second;
shape[1] = it->first;
shape[2] = it->first->duplicate(offset);
shape[3] = it->second->duplicate(offset);
linkSplitter.addConvexShape(shape, middleMeshBuf, -offset/2);
}
middleMesh = new SMesh();
middleMeshBuf->recalculateBoundingBox();
middleMeshBuf->setHardwareMappingHint(EHM_STATIC);
middleMesh->addMeshBuffer(middleMeshBuf);
middleMesh->recalculateBoundingBox();
middleMeshBuf->drop(); // we drop the buf, mesh obj has it now
}
}
return SplitMeshResult {leftMesh, middleMesh, rightMesh};
}
示例4: crosses
//.........这里部分代码省略.........
}
};
Visitor visitor;
tree.triangulate(triangles, section, min_height, max_height, &visitor);
//tree.sweep(triangles, section, &visitor);
//cout << "num triangle points: " << triangles.size() << endl;
vector<QuadTreePtr> leaves;
tree.dumpLeaves(leaves);
//cout << "num leaves: " << leaves.size() << endl;
/*
for (QuadTreePtr p1 : leaves)
for (QuadTreePtr p2 : leaves)
if (p1 != p2)
if (p1->isAdjacent(p2))
if (!visitor.has(p1, p2))
{
auto sz1 = p1->region.getSize();
auto sz2 = p2->region.getSize();
auto c1 = p1->region.getCenter();
auto c2 = p2->region.getCenter();
char const* path1 = p1->getPath().c_str();
char const* path2 = p2->getPath().c_str();
cout << path1 << endl;
cout << path2 << endl;
cout << "Missing pair of adjacent vertices." << endl;
}
float x1 = section.UpperLeftCorner.X;
float x2 = section.LowerRightCorner.X;
float y1 = section.UpperLeftCorner.Y;
float y2 = section.LowerRightCorner.Y;
*/
/*
d---c
| / |
a---b
*/
/*
S3DVertex sa;
sa.Pos = vector3df(x1, y1, 0);
PsblVertPtr a = new PossibleVertex(sa);
S3DVertex sb;
sb.Pos = vector3df(x2, y1, 0);
PsblVertPtr b = new PossibleVertex(sb);
S3DVertex sc;
sc.Pos = vector3df(x2, y2, 0);
PsblVertPtr c = new PossibleVertex(sc);
S3DVertex sd;
sd.Pos = vector3df(x1, y2, 0);
PsblVertPtr d = new PossibleVertex(sd);
// a-b-c
// a-c-d
triangles.push_back(a);
triangles.push_back(b);
triangles.push_back(c);
triangles.push_back(a);
triangles.push_back(c);
triangles.push_back(d);
triangles.push_back(c);
triangles.push_back(b);
triangles.push_back(a);
triangles.push_back(d);
triangles.push_back(c);
triangles.push_back(a);
*/
SMeshBuffer* buffer = new SMeshBuffer();
for (auto pv : triangles)
pv->addToMeshBuf(buffer, vector3df());
if (buffer->getIndexCount() % 3 > 0)
throw std::logic_error("SurfaceQuadTree triangulation added a 'triangle' with less than 3 vertices in it.");
//cout << "num vertices " << buffer->getVertexCount() << endl;
//cout << "num indices " << buffer->getIndexCount() << endl;
buffer->recalculateBoundingBox();
buffer->setHardwareMappingHint(EHM_STATIC);
SMesh* mesh = new SMesh();
mesh->addMeshBuffer(buffer);
mesh->recalculateBoundingBox();
buffer->drop();
return mesh;
}