本文整理汇总了C++中VertexBufferAccessor::GetNumVertices方法的典型用法代码示例。如果您正苦于以下问题:C++ VertexBufferAccessor::GetNumVertices方法的具体用法?C++ VertexBufferAccessor::GetNumVertices怎么用?C++ VertexBufferAccessor::GetNumVertices使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类VertexBufferAccessor
的用法示例。
在下文中一共展示了VertexBufferAccessor::GetNumVertices方法的8个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: CreatePlatonicUVs
//----------------------------------------------------------------------------
void StandardMesh::CreatePlatonicUVs (VertexBufferAccessor& vba)
{
for (int unit = 0; unit < MAX_UNITS; ++unit)
{
if (mHasTCoords[unit])
{
const int numVertices = vba.GetNumVertices();
for (int i = 0; i < numVertices; ++i)
{
if (Mathf::FAbs(vba.Position<Float3>(i)[2]) < 1.0f)
{
vba.TCoord<Float2>(unit, i)[0] = 0.5f*(1.0f +
Mathf::ATan2(vba.Position<Float3>(i)[1],
vba.Position<Float3>(i)[0])*Mathf::INV_PI);
}
else
{
vba.TCoord<Float2>(unit, i)[0] = 0.5f;
}
vba.TCoord<Float2>(unit, i)[1] = Mathf::ACos(
vba.Position<Float3>(i)[2])*Mathf::INV_PI;
}
}
}
}
示例2: CreatePlatonicNormals
//----------------------------------------------------------------------------
void StandardMesh::CreatePlatonicNormals (VertexBufferAccessor& vba)
{
if (mHasNormals)
{
const int numVertices = vba.GetNumVertices();
for (int i = 0; i < numVertices; ++i)
{
vba.Normal<Float3>(i) = vba.Position<Float3>(i);
}
}
}
示例3: UpdateModelNormals
//----------------------------------------------------------------------------
void Triangles::UpdateModelNormals (VertexBufferAccessor& vba)
{
// Calculate normals from vertices by weighted averages of facet planes
// that contain the vertices.
const int numVertices = vba.GetNumVertices();
int i;
for (i = 0; i < numVertices; ++i)
{
vba.Normal<Float3>(i) = Float3(0.0f, 0.0f, 0.0f);
}
const int numTriangles = GetNumTriangles();
for (i = 0; i < numTriangles; ++i)
{
// Get the vertex indices for the triangle.
int v0, v1, v2;
if (!GetTriangle(i, v0, v1, v2))
{
continue;
}
// Get the vertex positions.
APoint pos0 = vba.Position<Float3>(v0);
APoint pos1 = vba.Position<Float3>(v1);
APoint pos2 = vba.Position<Float3>(v2);
// Compute the triangle normal. The length of this normal is used in
// the weighted sum of normals.
AVector triEdge1 = pos1 - pos0;
AVector triEdge2 = pos2 - pos0;
AVector triNormal = triEdge1.Cross(triEdge2);
// Add the triangle normal to the vertices' normal sums.
vba.Normal<AVector>(v0) += triNormal;
vba.Normal<AVector>(v1) += triNormal;
vba.Normal<AVector>(v2) += triNormal;
}
// The vertex normals must be unit-length vectors.
for (i = 0; i < numVertices; ++i)
{
vba.Normal<AVector>(i).Normalize();
}
}
示例4: TransformData
//----------------------------------------------------------------------------
void StandardMesh::TransformData (VertexBufferAccessor& vba)
{
if (mTransform.IsIdentity())
{
return;
}
const int numVertices = vba.GetNumVertices();
int i;
for (i = 0; i < numVertices; ++i)
{
APoint position = vba.Position<Float3>(i);
vba.Position<Float3>(i) = mTransform*position;
}
if (mHasNormals)
{
for (i = 0; i < numVertices; ++i)
{
vba.Normal<AVector>(i).Normalize();
}
}
}
示例5: UpdateModelTangentsUseTCoords
//----------------------------------------------------------------------------
void Triangles::UpdateModelTangentsUseTCoords (VertexBufferAccessor& vba)
{
// Each vertex can be visited multiple times, so compute the tangent
// space only on the first visit. Use the zero vector as a flag for the
// tangent vector not being computed.
const int numVertices = vba.GetNumVertices();
bool hasTangent = vba.HasTangent();
Float3 zero(0.0f, 0.0f, 0.0f);
int i;
if (hasTangent)
{
for (i = 0; i < numVertices; ++i)
{
vba.Tangent<Float3>(i) = zero;
}
}
else
{
for (i = 0; i < numVertices; ++i)
{
vba.Binormal<Float3>(i) = zero;
}
}
const int numTriangles = GetNumTriangles();
for (i = 0; i < numTriangles; i++)
{
// Get the triangle vertices' positions, normals, tangents, and
// texture coordinates.
int v0, v1, v2;
if (!GetTriangle(i, v0, v1, v2))
{
continue;
}
APoint locPosition[3] =
{
vba.Position<Float3>(v0),
vba.Position<Float3>(v1),
vba.Position<Float3>(v2)
};
AVector locNormal[3] =
{
vba.Normal<Float3>(v0),
vba.Normal<Float3>(v1),
vba.Normal<Float3>(v2)
};
AVector locTangent[3] =
{
(hasTangent ? vba.Tangent<Float3>(v0) : vba.Binormal<Float3>(v0)),
(hasTangent ? vba.Tangent<Float3>(v1) : vba.Binormal<Float3>(v1)),
(hasTangent ? vba.Tangent<Float3>(v2) : vba.Binormal<Float3>(v2))
};
Float2 locTCoord[3] =
{
vba.TCoord<Float2>(0, v0),
vba.TCoord<Float2>(0, v1),
vba.TCoord<Float2>(0, v2)
};
for (int curr = 0; curr < 3; ++curr)
{
Float3 currLocTangent = (Float3)locTangent[curr];
if (currLocTangent != zero)
{
// This vertex has already been visited.
continue;
}
// Compute the tangent space at the vertex.
AVector norvec = locNormal[curr];
int prev = ((curr + 2) % 3);
int next = ((curr + 1) % 3);
AVector tanvec = ComputeTangent(
locPosition[curr], locTCoord[curr],
locPosition[next], locTCoord[next],
locPosition[prev], locTCoord[prev]);
// Project T into the tangent plane by projecting out the surface
// normal N, and then making it unit length.
tanvec -= norvec.Dot(tanvec)*norvec;
tanvec.Normalize();
// Compute the bitangent B, another tangent perpendicular to T.
AVector binvec = norvec.UnitCross(tanvec);
if (vba.HasTangent())
{
locTangent[curr] = tanvec;
if (vba.HasBinormal())
{
vba.Binormal<Float3>(curr) = binvec;
}
}
else
{
//.........这里部分代码省略.........
示例6: UpdateModelTangentsUseGeometry
//----------------------------------------------------------------------------
void Triangles::UpdateModelTangentsUseGeometry (VertexBufferAccessor& vba)
{
// Compute the matrix of normal derivatives.
const int numVertices = vba.GetNumVertices();
HMatrix* dNormal = new1<HMatrix>(numVertices);
HMatrix* wwTrn = new1<HMatrix>(numVertices);
HMatrix* dwTrn = new1<HMatrix>(numVertices);
memset(wwTrn, 0, numVertices*sizeof(HMatrix));
memset(dwTrn, 0, numVertices*sizeof(HMatrix));
const int numTriangles = GetNumTriangles();
int i, row, col;
for (i = 0; i < numTriangles; ++i)
{
// Get the vertex indices for the triangle.
int v[3];
if (!GetTriangle(i, v[0], v[1], v[2]))
{
continue;
}
for (int j = 0; j < 3; j++)
{
// Get the vertex positions and normals.
int v0 = v[j];
int v1 = v[(j + 1) % 3];
int v2 = v[(j + 2) % 3];
APoint pos0 = vba.Position<Float3>(v0);
APoint pos1 = vba.Position<Float3>(v1);
APoint pos2 = vba.Position<Float3>(v2);
AVector nor0 = vba.Normal<Float3>(v0);
AVector nor1 = vba.Normal<Float3>(v1);
AVector nor2 = vba.Normal<Float3>(v2);
// Compute the edge from pos0 to pos1, project it to the tangent
// plane of the vertex, and compute the difference of adjacent
// normals.
AVector edge = pos1 - pos0;
AVector proj = edge - edge.Dot(nor0)*nor0;
AVector diff = nor1 - nor0;
for (row = 0; row < 3; ++row)
{
for (col = 0; col < 3; ++col)
{
wwTrn[v0][row][col] += proj[row]*proj[col];
dwTrn[v0][row][col] += diff[row]*proj[col];
}
}
// Compute the edge from pos0 to pos2, project it to the tangent
// plane of the vertex, and compute the difference of adjacent
// normals.
edge = pos2 - pos0;
proj = edge - edge.Dot(nor0)*nor0;
diff = nor2 - nor0;
for (row = 0; row < 3; ++row)
{
for (col = 0; col < 3; ++col)
{
wwTrn[v0][row][col] += proj[row]*proj[col];
dwTrn[v0][row][col] += diff[row]*proj[col];
}
}
}
}
// Add N*N^T to W*W^T for numerical stability. In theory 0*0^T is added
// to D*W^T, but of course no update is needed in the implementation.
// Compute the matrix of normal derivatives.
for (i = 0; i < numVertices; ++i)
{
AVector nor = vba.Normal<Float3>(i);
for (row = 0; row < 3; ++row)
{
for (col = 0; col < 3; ++col)
{
wwTrn[i][row][col] =
0.5f*wwTrn[i][row][col] + nor[row]*nor[col];
dwTrn[i][row][col] *= 0.5f;
}
}
wwTrn[i].SetColumn(3, APoint::ORIGIN);
dNormal[i] = dwTrn[i]*wwTrn[i].Inverse();
}
delete1(wwTrn);
delete1(dwTrn);
// If N is a unit-length normal at a vertex, let U and V be unit-length
// tangents so that {U, V, N} is an orthonormal set. Define the matrix
// J = [U | V], a 3-by-2 matrix whose columns are U and V. Define J^T
// to be the transpose of J, a 2-by-3 matrix. Let dN/dX denote the
// matrix of first-order derivatives of the normal vector field. The
// shape matrix is
// S = (J^T * J)^{-1} * J^T * dN/dX * J = J^T * dN/dX * J
// where the superscript of -1 denotes the inverse. (The formula allows
// for J built from non-perpendicular vectors.) The matrix S is 2-by-2.
// The principal curvatures are the eigenvalues of S. If k is a principal
//.........这里部分代码省略.........
示例7: CreateScene
//----------------------------------------------------------------------------
void CollisionsBoundTree::CreateScene ()
{
// The root of the scene will have two cylinders as children.
mScene = new0 Node();
mWireState = new0 WireState();
mRenderer->SetOverrideWireState(mWireState);
mCullState = new0 CullState();
mCullState->Enabled = false;
mRenderer->SetOverrideCullState(mCullState);
// Create a texture image to be used by both cylinders.
Texture2D* texture = new0 Texture2D(Texture::TF_A8R8G8B8, 2, 2, 1);
unsigned int* data = (unsigned int*)texture->GetData(0);
data[0] = Color::MakeR8G8B8(0, 0, 255); // blue
data[1] = Color::MakeR8G8B8(0, 255, 255); // cyan
data[2] = Color::MakeR8G8B8(255, 0, 0); // red
data[3] = Color::MakeR8G8B8(255, 255, 0); // yellow
Texture2DEffect* effect = new0 Texture2DEffect(Shader::SF_LINEAR);
// Create two cylinders, one short and thick, one tall and thin.
VertexFormat* vformat = VertexFormat::Create(2,
VertexFormat::AU_POSITION, VertexFormat::AT_FLOAT3, 0,
VertexFormat::AU_TEXCOORD, VertexFormat::AT_FLOAT2, 0);
StandardMesh sm(vformat);
VertexBufferAccessor vba;
int i;
mCylinder0 = sm.Cylinder(8, 16, 1.0f, 2.0f, false);
vba.ApplyTo(mCylinder0);
for (i = 0; i < vba.GetNumVertices(); ++i)
{
vba.TCoord<Float2>(0, i) = mBlueUV;
}
mCylinder0->SetEffectInstance(effect->CreateInstance(texture));
mScene->AttachChild(mCylinder0);
mCylinder1 = sm.Cylinder(16,8,0.25,4.0,false);
vba.ApplyTo(mCylinder1);
for (i = 0; i < vba.GetNumVertices(); ++i)
{
vba.TCoord<Float2>(0, i) = mRedUV;
}
mCylinder1->SetEffectInstance(effect->CreateInstance(texture));
mScene->AttachChild(mCylinder1);
mScene->Update();
// Set up the collision system. Record0 handles the collision response.
// Record1 is not given a callback so that 'double processing' of the
// events does not occur.
CTree* tree0 = new0 CTree(mCylinder0, 1, false);
CRecord* record0 = new0 CRecord(tree0, 0, Response, this);
CTree* tree1 = new0 CTree(mCylinder1, 1, false);
CRecord* record1 = new0 CRecord(tree1, 0, 0, 0);
mGroup = new0 CGroup();
mGroup->Add(record0);
mGroup->Add(record1);
ResetColors();
mGroup->TestIntersection();
}
示例8: CreateScene
//----------------------------------------------------------------------------
void BspNodes::CreateScene ()
{
// Create the scene graph.
//
// 1. The rectangles represent the BSP planes of the BSP tree. They
// share a VertexColor3Effect. You can see a plane from either side
// (backface culling disabled). The planes do not interfere with view
// of the solid objects (wirestate enabled).
//
// 2. The sphere, tetrahedron, and cube share a TextureEffect. These
// objects are convex. The backfacing triangles are discarded
// (backface culling enabled). The front facing triangles are drawn
// correctly by convexity, so depthbuffer reads are disabled and
// depthbuffer writes are enabled. The BSP-based sorting of objects
// guarantees that front faces of convex objects in the foreground
// are drawn after the front faces of convex objects in the background,
// which allows us to set the depthbuffer state as we have. That is,
// BSPNode sorts from back to front.
//
// 3. The torus has backface culling enabled and depth buffering enabled.
// This is necessary, because the torus is not convex.
//
// 4. Generally, if all objects are opaque, then you want to draw from
// front to back with depth buffering fully enabled. You need to
// reverse-order the elements of the visible set before drawing. If
// any of the objects are semitransparent, then drawing back to front
// is the correct order to handle transparency. However, you do not
// get the benefit of early z-rejection for opaque objects. A better
// BSP sorter needs to be built to produce a visible set with opaque
// objects listed first (front-to-back order) and semitransparent
// objects listed last (back-to-front order).
//
// scene
// ground
// bsp0
// bsp1
// bsp3
// torus
// rectangle3
// sphere
// rectangle1
// tetrahedron
// rectangle0
// bsp2
// cube
// rectangle2
// octahedron
mScene = new0 Node();
// Create the ground. It covers a square with vertices (1,1,0), (1,-1,0),
// (-1,1,0), and (-1,-1,0). Multiply the texture coordinates by a factor
// to enhance the wrap-around.
VertexFormat* vformat = VertexFormat::Create(2,
VertexFormat::AU_POSITION, VertexFormat::AT_FLOAT3, 0,
VertexFormat::AU_TEXCOORD, VertexFormat::AT_FLOAT2, 0);
StandardMesh sm(vformat);
VertexBufferAccessor vba;
TriMesh* ground = sm.Rectangle(2, 2, 16.0f, 16.0f);
vba.ApplyTo(ground);
for (int i = 0; i < vba.GetNumVertices(); ++i)
{
Float2& tcoord = vba.TCoord<Float2>(0, i);
tcoord[0] *= 128.0f;
tcoord[1] *= 128.0f;
}
std::string path = Environment::GetPathR("Horizontal.wmtf");
Texture2D* texture = Texture2D::LoadWMTF(path);
ground->SetEffectInstance(Texture2DEffect::CreateUniqueInstance(texture,
Shader::SF_LINEAR_LINEAR, Shader::SC_REPEAT, Shader::SC_REPEAT));
mScene->AttachChild(ground);
// Partition the region above the ground into 5 convex pieces. Each plane
// is perpendicular to the ground (not required generally).
VertexColor3Effect* vceffect = new0 VertexColor3Effect();
vceffect->GetCullState(0, 0)->Enabled = false;
vceffect->GetWireState(0, 0)->Enabled = true;
Vector2f v0(-1.0f, 1.0f);
Vector2f v1(1.0f, -1.0f);
Vector2f v2(-0.25f, 0.25f);
Vector2f v3(-1.0f, -1.0f);
Vector2f v4(0.0f, 0.0f);
Vector2f v5(1.0f, 0.5f);
Vector2f v6(-0.75f, -7.0f/12.0f);
Vector2f v7(-0.75f, 0.75f);
Vector2f v8(1.0f, 1.0f);
BspNode* bsp0 = CreateNode(v0, v1, vceffect, Float3(1.0f, 0.0f, 0.0f));
BspNode* bsp1 = CreateNode(v2, v3, vceffect, Float3(0.0f, 0.5f, 0.0f));
BspNode* bsp2 = CreateNode(v4, v5, vceffect, Float3(0.0f, 0.0f, 1.0f));
BspNode* bsp3 = CreateNode(v6, v7, vceffect, Float3(0.0f, 0.0f, 0.0f));
bsp0->AttachPositiveChild(bsp1);
bsp0->AttachNegativeChild(bsp2);
bsp1->AttachPositiveChild(bsp3);
//.........这里部分代码省略.........