本文整理汇总了C++中VertexData类的典型用法代码示例。如果您正苦于以下问题:C++ VertexData类的具体用法?C++ VertexData怎么用?C++ VertexData使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了VertexData类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: removeBlendData
//-----------------------------------------------------------------------
void LightInstanceBatchHW::removeBlendData()
{
VertexData *thisVertexData = mRenderOperation.vertexData;
unsigned short safeSource = 0xFFFF;
const VertexElement* blendIndexElem = thisVertexData->vertexDeclaration->findElementBySemantic(
VES_BLEND_INDICES );
if( blendIndexElem )
{
//save the source in order to prevent the next stage from unbinding it.
safeSource = blendIndexElem->getSource();
// Remove buffer reference
thisVertexData->vertexBufferBinding->unsetBinding( blendIndexElem->getSource() );
}
// Remove blend weights
const VertexElement* blendWeightElem = thisVertexData->vertexDeclaration->findElementBySemantic(
VES_BLEND_WEIGHTS );
if( blendWeightElem && blendWeightElem->getSource() != safeSource )
{
// Remove buffer reference
thisVertexData->vertexBufferBinding->unsetBinding( blendWeightElem->getSource() );
}
thisVertexData->vertexDeclaration->removeElement(VES_BLEND_INDICES);
thisVertexData->vertexDeclaration->removeElement(VES_BLEND_WEIGHTS);
thisVertexData->closeGapsInBindings();
}
示例2: progress
/* Functions extracted out of readFromFile to enhance readability. */
bool VertexBufferRoot::_constructFromPly( const std::string& filename )
{
PLYLIBINFO << "Reading PLY file." << std::endl;
boost::progress_display progress( 12 );
VertexData data;
if( _invertFaces )
data.useInvertedFaces();
if( !data.readPlyFile( filename ) )
{
PLYLIBERROR << "Unable to load PLY file." << std::endl;
return false;
}
++progress;
data.calculateNormals();
data.scale( 2.0f );
++progress;
setupTree( data, progress );
++progress;
if( !writeToFile( filename ))
PLYLIBWARN << "Unable to write binary representation." << std::endl;
++progress;
return true;
}
示例3: copyFromVertexData
void HEC_FromFaceList::copyFromVertexData(VertexData& vd) {
for(int i = 0; i < vd.getNumVertices(); ++i) {
addVertex(vd.getVertex(i));
}
for(int i = 0; i < vd.getNumQuads(); ++i) {
Quad& q = *vd.getQuadPtr(i);
addQuad(q.a, q.b, q.c, q.d);
}
}
示例4: new
NS_CC_BEGIN
VertexData* VertexData::create()
{
VertexData* result = new (std::nothrow) VertexData();
if(result)
{
result->autorelease();
return result;
}
CC_SAFE_DELETE(result);
return nullptr;
}
示例5: loadObj
void loadObj(const std::string &filename, VertexData &vd, IndexedFaceMesh &mesh, const Vector3r &scale)
{
std::vector<OBJLoader::Vec3f> x;
std::vector<OBJLoader::Vec3f> normals;
std::vector<OBJLoader::Vec2f> texCoords;
std::vector<MeshFaceIndices> faces;
OBJLoader::Vec3f s = { (float)scale[0], (float)scale[1], (float)scale[2] };
OBJLoader::loadObj(filename, &x, &faces, &normals, &texCoords, s);
mesh.release();
const unsigned int nPoints = (unsigned int)x.size();
const unsigned int nFaces = (unsigned int)faces.size();
const unsigned int nTexCoords = (unsigned int)texCoords.size();
mesh.initMesh(nPoints, nFaces * 2, nFaces);
vd.reserve(nPoints);
for (unsigned int i = 0; i < nPoints; i++)
{
vd.addVertex(Vector3r(x[i][0], x[i][1], x[i][2]));
}
for (unsigned int i = 0; i < nTexCoords; i++)
{
mesh.addUV(texCoords[i][0], texCoords[i][1]);
}
for (unsigned int i = 0; i < nFaces; i++)
{
// Reduce the indices by one
int posIndices[3];
int texIndices[3];
for (int j = 0; j < 3; j++)
{
posIndices[j] = faces[i].posIndices[j] - 1;
if (nTexCoords > 0)
{
texIndices[j] = faces[i].texIndices[j] - 1;
mesh.addUVIndex(texIndices[j]);
}
}
mesh.addFace(&posIndices[0]);
}
mesh.buildNeighbors();
mesh.updateNormals(vd, 0);
mesh.updateVertexNormals(vd);
LOG_INFO << "Number of triangles: " << nFaces;
LOG_INFO << "Number of vertices: " << nPoints;
}
开发者ID:InteractiveComputerGraphics,项目名称:PositionBasedDynamics,代码行数:48,代码来源:RigidBodyCollisionDemo.cpp
示例6: setupTree
/* Begin kd-tree setup, go through full range starting with x axis. */
void VertexBufferRoot::setupTree( VertexData& data )
{
// data is VertexData, _data is VertexBufferData
_data.clear();
const Axis axis = data.getLongestAxis( 0, data.triangles.size() );
VertexBufferNode::setupTree( data, 0, data.triangles.size(),
axis, 0, _data );
VertexBufferNode::updateBoundingSphere();
VertexBufferNode::updateRange();
#if 0
// re-test all points to be in the bounding sphere
Vertex center( _boundingSphere.array );
float radius = _boundingSphere.w();
float radiusSquared = radius * radius;
for( size_t offset = 0; offset < _data.vertices.size(); ++offset )
{
const Vertex& vertex = _data.vertices[ offset ];
const Vertex centerToPoint = vertex - center;
const float distanceSquared = centerToPoint.squared_length();
EQASSERTINFO( distanceSquared <= radiusSquared,
distanceSquared << " > " << radiusSquared );
}
#endif
}
示例7: send_attribute
void send_attribute(ShaderAvailableAttributes attr,
const VertexData& data,
EnabledMethod exists_on_data_predicate,
OffsetMethod offset_func) {
int32_t loc = (int32_t) attr;
auto get_has_attribute = std::bind(exists_on_data_predicate, std::reference_wrapper<const VertexData>(data));
if(get_has_attribute()) {
auto get_offset = std::bind(offset_func, std::reference_wrapper<const VertexData>(data));
GLCheck(glEnableVertexAttribArray, loc);
GLCheck(glVertexAttribPointer,
loc,
SHADER_ATTRIBUTE_SIZES.find(attr)->second,
GL_FLOAT,
GL_FALSE,
data.stride(),
BUFFER_OFFSET(get_offset())
);
} else {
//L_WARN_ONCE(_u("Couldn't locate attribute on the mesh: {0}").format(attr));
}
}
示例8: setupTree
/* Continue kd-tree setup, create intermediary or leaf nodes as required. */
void VertexBufferNode::setupTree( VertexData& data, const Index start,
const Index length, const Axis axis,
const size_t depth,
VertexBufferData& globalData,
boost::progress_display& progress )
{
data.sort( start, length, axis );
const Index median = start + ( length / 2 );
// left child will include elements smaller than the median
const Index leftLength = length / 2;
const bool subdivideLeft = _subdivide( leftLength, depth );
if( subdivideLeft )
_left = new VertexBufferNode;
else
_left = new VertexBufferLeaf( globalData );
// right child will include elements equal to or greater than the median
const Index rightLength = ( length + 1 ) / 2;
const bool subdivideRight = _subdivide( rightLength, depth );
if( subdivideRight )
_right = new VertexBufferNode;
else
_right = new VertexBufferLeaf( globalData );
// move to next axis and continue contruction in the child nodes
const Axis newAxisLeft = subdivideLeft ?
data.getLongestAxis( start , leftLength ) : AXIS_X;
const Axis newAxisRight = subdivideRight ?
data.getLongestAxis( median, rightLength ) : AXIS_X;
static_cast< VertexBufferNode* >
( _left )->setupTree( data, start, leftLength, newAxisLeft, depth+1,
globalData, progress );
static_cast< VertexBufferNode* >
( _right )->setupTree( data, median, rightLength, newAxisRight, depth+1,
globalData, progress );
if( depth == 3 )
++progress;
}
示例9: setPrimitiveType
Sphere::Sphere( bool fullSphere, byte numSubDiv, float dim )
{
setPrimitiveType( PrimitiveType::Triangles );
VertexData position;
buildGeometry( fullSphere, numSubDiv, position, dim );
// Build Texture Coordinates.
BoundingBox box;
for( size_t i = 0; i < position.size(); i++ )
{
const Vector3& v = position[i];
box.add(v);
}
Vector3 center = box.getCenter();
std::vector<Vector3> texCoords;
for( size_t i = 0; i < position.size(); i++ )
{
const Vector3& vert = position[i];
Vector3 d = vert-center;
d.normalize();
// Conveert to spherical coordinates.
//float t = d.z / sqrt(d.x*d.x+d.y*d.y+d.z*d.z);
//float delta = acos(t);
//float phi = atan2(d.y, d.x);
//float u = delta / Math::PI;
//float v = phi / 2*Math::PI;
float u = std::asin(d.x) / PI + 0.5f;
float v = std::asin(d.y) / PI + 0.5f;
texCoords.push_back( Vector2(u, v) );
}
gb->set( VertexAttribute::Position, position );
gb->set( VertexAttribute::TexCoord0, texCoords );
}
示例10: _constructFromPly
/* Functions extracted out of readFromFile to enhance readability. */
bool VertexBufferRoot::_constructFromPly( const std::string& filename )
{
MESHINFO << "Constructing new from PLY file." << std::endl;
VertexData data;
if( _invertFaces )
data.useInvertedFaces();
if( !data.readPlyFile( filename ) )
{
MESHERROR << "Unable to load PLY file." << std::endl;
return false;
}
data.calculateNormals();
data.scale( 2.0f );
setupTree( data );
if( !writeToFile( filename ))
MESHWARN << "Unable to write binary representation." << std::endl;
return true;
}
示例11: subdivide
void Sphere::subdivide(const Vector3& v1, const Vector3& v2,
const Vector3& v3, byte depth, VertexData& pos)
{
if (depth == 0)
{
pos.push_back( v1 );
pos.push_back( v2 );
pos.push_back( v3 );
return;
}
Vector3 v12 = (v1+v2).normalize();
Vector3 v23 = (v2+v3).normalize();
Vector3 v31 = (v3+v1).normalize();
subdivide(v1, v12, v31, depth-1, pos);
subdivide(v2, v23, v12, depth-1, pos);
subdivide(v3, v31, v23, depth-1, pos);
subdivide(v12, v23, v31, depth-1, pos);
}
示例12: setupTree
/* Begin kd-tree setup, go through full range starting with x axis. */
void VertexBufferRoot::setupTree( VertexData& data,
boost::progress_display& progress )
{
// data is VertexData, _data is VertexBufferData
_data.clear();
const Axis axis = data.getLongestAxis( 0, data.triangles.size() );
VertexBufferNode::setupTree( data, 0, data.triangles.size(),
axis, 0, _data, progress );
VertexBufferNode::updateBoundingSphere();
VertexBufferNode::updateRange();
}
示例13: buildGeometry
void Sphere::buildGeometry( bool fullSphere, byte numSubDiv,
VertexData& pos, float dim)
{
GeometryBufferPtr gb = AllocateThis(GeometryBuffer);
setGeometryBuffer(gb);
// Rotate the vertices, else the sphere is not properly aligned.
Matrix4x3 rot = Matrix4x3::createRotation( EulerAngles(-60, 0, 0) );
for( size_t i = 0; i < ARRAY_SIZE(IcoDomeIndices); i++ )
{
const byte* p = IcoDomeIndices[i];
Vector3 v1( IcoVertices[p[0]][0], IcoVertices[p[0]][2], IcoVertices[p[0]][1] );
Vector3 v2( IcoVertices[p[1]][0], IcoVertices[p[1]][2], IcoVertices[p[1]][1] );
Vector3 v3( IcoVertices[p[2]][0], IcoVertices[p[2]][2], IcoVertices[p[2]][1] );
subdivide( rot*v1, rot*v2, rot*v3, numSubDiv, pos );
}
// If we don't want a full sphere, we return here.
if( fullSphere )
{
// These indices are the bottom of the sphere.
for( size_t i = 0; i < ARRAY_SIZE(IcoSphereIndices); i++ )
{
const byte* p = IcoSphereIndices[i];
Vector3 v1( IcoVertices[p[0]][0], IcoVertices[p[0]][2], IcoVertices[p[0]][1] );
Vector3 v2( IcoVertices[p[1]][0], IcoVertices[p[1]][2], IcoVertices[p[1]][1] );
Vector3 v3( IcoVertices[p[2]][0], IcoVertices[p[2]][2], IcoVertices[p[2]][1] );
subdivide( rot*v1, rot*v2, rot*v3, numSubDiv, pos );
}
}
// Scale all the vertices.
for( size_t i = 0; i < pos.size(); i++ )
{
Vector3& vec = pos[i];
vec *= dim;
}
}
示例14: setupTree
/* Finish partial setup - sort, reindex and merge into global data. */
void VertexBufferLeaf::setupTree( VertexData& data, const Index start,
const Index length, const Axis axis,
const size_t depth,
VertexBufferData& globalData )
{
data.sort( start, length, axis );
_vertexStart = globalData.vertices.size();
_vertexLength = 0;
_indexStart = globalData.indices.size();
_indexLength = 0;
const bool hasColors = ( data.colors.size() > 0 );
// stores the new indices (relative to _start)
map< Index, ShortIndex > newIndex;
for( Index t = 0; t < length; ++t )
{
for( Index v = 0; v < 3; ++v )
{
Index i = data.triangles[start + t][v];
if( newIndex.find( i ) == newIndex.end() )
{
newIndex[i] = _vertexLength++;
// assert number of vertices does not exceed SmallIndex range
MESHASSERT( _vertexLength );
globalData.vertices.push_back( data.vertices[i] );
if( hasColors )
globalData.colors.push_back( data.colors[i] );
globalData.normals.push_back( data.normals[i] );
}
globalData.indices.push_back( newIndex[i] );
++_indexLength;
}
}
#ifndef NDEBUG
MESHINFO << "VertexBufferLeaf::setupTree"
<< "( " << _indexStart << ", " << _indexLength << "; start "
<< _vertexStart << ", " << _vertexLength << " vertices)." << endl;
#endif
}
示例15: alloc
void VertexBuffer::alloc(const VertexData &data, GpuBufferUsageType usage)
{
assert(data.getFormat() == m_format);
alloc(data.getVerticesCount(), data.getRawData(), usage);
}