本文整理汇总了C++中VertexDecl::push_back方法的典型用法代码示例。如果您正苦于以下问题:C++ VertexDecl::push_back方法的具体用法?C++ VertexDecl::push_back怎么用?C++ VertexDecl::push_back使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类VertexDecl
的用法示例。
在下文中一共展示了VertexDecl::push_back方法的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: evaluatePrimitive
void Model_Sonic::evaluatePrimitive(Primitive &primitive) {
/* Create the actual IBO and VBO structures. */
if (primitive.invalid || primitive.indices.empty() || primitive.vertices.empty())
return;
// Create the index buffer
primitive.indexBuffer.setSize(primitive.indices.size(), sizeof(uint16), GL_UNSIGNED_SHORT);
uint16 *indices = (uint16 *) primitive.indexBuffer.getData();
memcpy(indices, &primitive.indices[0], primitive.indices.size() * sizeof(uint16));
// Create vertex buffer
VertexDecl vertexDecl;
vertexDecl.push_back(VertexAttrib(VPOSITION, 3, GL_FLOAT));
vertexDecl.push_back(VertexAttrib(VNORMAL , 3, GL_FLOAT));
vertexDecl.push_back(VertexAttrib(VCOLOR , 4, GL_FLOAT));
vertexDecl.push_back(VertexAttrib(VTCOORD , 2, GL_FLOAT));
primitive.vertexBuffer.setVertexDeclInterleave(primitive.vertices.size(), vertexDecl);
float *vData = (float *) primitive.vertexBuffer.getData();
for (PrimitiveVertices::const_iterator v = primitive.vertices.begin(); v != primitive.vertices.end(); ++v) {
/* To get the absolute position of the vertex, transform it by the absolute
* position of its base node. Use an identity matrix as a fallback. */
// TODO: For some primitives, we need to calculate the weighted average of several matrices
Common::TransformationMatrix matrix;
if (!v->nodes.empty() && v->nodes[0].node)
matrix = v->nodes[0].node->getAsolutePosition();
const Common::Vector3 pos = matrix * v->vertex;
*vData++ = pos[0];
*vData++ = pos[1];
*vData++ = pos[2];
*vData++ = v->normal[0];
*vData++ = v->normal[1];
*vData++ = v->normal[2];
*vData++ = v->color[0];
*vData++ = v->color[1];
*vData++ = v->color[2];
*vData++ = v->color[3];
*vData++ = v->texCoord[0];
*vData++ = v->texCoord[1];
}
}
示例2: readTexturePaint
//.........这里部分代码省略.........
Model::readArrayDef(*ctx.mdb, facesOffset, facesCount);
if ((vertexCount == 0) || (facesCount == 0)) {
ctx.mdb->seek(endPos);
return;
}
std::vector<TexturePaintLayer> layers;
layers.resize(layersCount);
for (uint32 l = 0; l < layersCount; l++) {
ctx.mdb->seek(ctx.offRawData + layersOffset + l * 52);
layers[l].hasTexture = ctx.mdb->readByte() == 1;
if (!layers[l].hasTexture)
continue;
ctx.mdb->skip(3); // Unknown
ctx.mdb->skip(4); // Offset to material
layers[l].texture = Common::readStringFixed(*ctx.mdb, Common::kEncodingASCII, 32);
uint32 weightsOffset, weightsCount;
Model::readArrayDef(*ctx.mdb, weightsOffset, weightsCount);
ctx.mdb->seek(ctx.offRawData + weightsOffset);
layers[l].weights.resize(weightsCount);
for (std::vector<float>::iterator w = layers[l].weights.begin(); w != layers[l].weights.end(); ++w)
*w = ctx.mdb->readIEEEFloatLE();
}
std::vector<Common::UString> textures;
textures.push_back(lightMapName);
evaluateTextures(1, textures, 0, tVertsCount, dayNightLightMaps, lightMapName);
loadTextures(textures);
size_t texCount = textures.size();
// Read vertices
VertexDecl vertexDecl;
vertexDecl.push_back(VertexAttrib(VPOSITION, 3, GL_FLOAT));
vertexDecl.push_back(VertexAttrib(VNORMAL , 3, GL_FLOAT));
for (uint t = 0; t < texCount; t++)
vertexDecl.push_back(VertexAttrib(VTCOORD + t, 2, GL_FLOAT));
_vertexBuffer.setVertexDeclLinear(vertexCount, vertexDecl);
// Read vertex position
ctx.mdb->seek(ctx.offRawData + vertexOffset);
float *v = reinterpret_cast<float *>(_vertexBuffer.getData(0));
for (uint32 i = 0; i < vertexCount; i++) {
*v++ = ctx.mdb->readIEEEFloatLE();
*v++ = ctx.mdb->readIEEEFloatLE();
*v++ = ctx.mdb->readIEEEFloatLE();
}
// Read vertex normals
assert(normalsCount == vertexCount);
ctx.mdb->seek(ctx.offRawData + normalsOffset);
v = reinterpret_cast<float *>(_vertexBuffer.getData(1));
for (uint32 i = 0; i < normalsCount; i++) {
示例3: readMesh
//.........这里部分代码省略.........
uint32 tVertsOffset[4], tVertsCount[4];
for (uint t = 0; t < 4; t++)
Model::readArrayDef(*ctx.mdb, tVertsOffset[t], tVertsCount[t]);
uint32 unknownOffset, unknownCount;
Model::readArrayDef(*ctx.mdb, unknownOffset, unknownCount);
uint32 facesOffset, facesCount;
Model::readArrayDef(*ctx.mdb, facesOffset, facesCount);
if (ctx.fileVersion == 133)
ctx.offTexData = ctx.mdb->readUint32LE();
if ((vertexCount == 0) || (facesCount == 0)) {
ctx.mdb->seek(endPos);
return;
}
std::vector<Common::UString> textures;
readTextures(ctx, textures);
evaluateTextures(4, textures, texture, tVertsCount, dayNightLightMaps, lightMapName);
loadTextures(textures);
size_t texCount = textures.size();
// Read vertices
VertexDecl vertexDecl;
vertexDecl.push_back(VertexAttrib(VPOSITION, 3, GL_FLOAT));
vertexDecl.push_back(VertexAttrib(VNORMAL , 3, GL_FLOAT));
for (uint t = 0; t < texCount; t++)
vertexDecl.push_back(VertexAttrib(VTCOORD + t, 2, GL_FLOAT));
_vertexBuffer.setVertexDeclLinear(vertexCount, vertexDecl);
// Read vertex position
ctx.mdb->seek(ctx.offRawData + vertexOffset);
float *v = reinterpret_cast<float *>(_vertexBuffer.getData(0));
for (uint32 i = 0; i < vertexCount; i++) {
*v++ = ctx.mdb->readIEEEFloatLE();
*v++ = ctx.mdb->readIEEEFloatLE();
*v++ = ctx.mdb->readIEEEFloatLE();
}
// Read vertex normals
assert(normalsCount == vertexCount);
ctx.mdb->seek(ctx.offRawData + normalsOffset);
v = reinterpret_cast<float *>(_vertexBuffer.getData(1));
for (uint32 i = 0; i < normalsCount; i++) {
*v++ = ctx.mdb->readIEEEFloatLE();
*v++ = ctx.mdb->readIEEEFloatLE();
*v++ = ctx.mdb->readIEEEFloatLE();
}
// Read texture coordinates
for (uint t = 0; t < texCount; t++) {
ctx.mdb->seek(ctx.offRawData + tVertsOffset[t]);
v = reinterpret_cast<float *>(_vertexBuffer.getData(2 + t));
for (uint32 i = 0; i < tVertsCount[t]; i++) {
if (i < tVertsCount[t]) {
示例4: readMesh
void ModelNode_KotOR::readMesh(Model_KotOR::ParserContext &ctx) {
uint32 P = ctx.mdl->pos();
ctx.mdl->skip(8); // Function pointers
uint32 facesOffset, facesCount;
Model::readArrayDef(*ctx.mdl, facesOffset, facesCount);
float boundingMin[3], boundingMax[3];
boundingMin[0] = ctx.mdl->readIEEEFloatLE();
boundingMin[1] = ctx.mdl->readIEEEFloatLE();
boundingMin[2] = ctx.mdl->readIEEEFloatLE();
boundingMax[0] = ctx.mdl->readIEEEFloatLE();
boundingMax[1] = ctx.mdl->readIEEEFloatLE();
boundingMax[2] = ctx.mdl->readIEEEFloatLE();
float radius = ctx.mdl->readIEEEFloatLE();
float pointsAverage[3];
pointsAverage[0] = ctx.mdl->readIEEEFloatLE();
pointsAverage[1] = ctx.mdl->readIEEEFloatLE();
pointsAverage[2] = ctx.mdl->readIEEEFloatLE();
_diffuse[0] = ctx.mdl->readIEEEFloatLE();
_diffuse[1] = ctx.mdl->readIEEEFloatLE();
_diffuse[2] = ctx.mdl->readIEEEFloatLE();
_ambient[0] = ctx.mdl->readIEEEFloatLE();
_ambient[1] = ctx.mdl->readIEEEFloatLE();
_ambient[2] = ctx.mdl->readIEEEFloatLE();
_specular[0] = 0;
_specular[1] = 0;
_specular[2] = 0;
uint32 transparencyHint = ctx.mdl->readUint32LE();
_hasTransparencyHint = true;
_transparencyHint = (transparencyHint != 0);
std::vector<Common::UString> textures;
textures.push_back(Common::readStringFixed(*ctx.mdl, Common::kEncodingASCII, 32));
textures.push_back(Common::readStringFixed(*ctx.mdl, Common::kEncodingASCII, 32));
ctx.mdl->skip(24); // Unknown
ctx.mdl->skip(12); // Vertex indices counts
uint32 offOffVerts, offOffVertsCount;
Model::readArrayDef(*ctx.mdl, offOffVerts, offOffVertsCount);
if (offOffVertsCount > 1)
throw Common::Exception("Face offsets offsets count wrong (%d)", offOffVertsCount);
ctx.mdl->skip(12); // Unknown
ctx.mdl->skip(24 + 16); // Unknown
uint32 mdxStructSize = ctx.mdl->readUint32LE();
ctx.mdl->skip(8); // Unknown
uint32 offNormals = ctx.mdl->readUint32LE();
ctx.mdl->skip(4); // Unknown
uint32 offUV[2];
offUV[0] = ctx.mdl->readUint32LE();
offUV[1] = ctx.mdl->readUint32LE();
ctx.mdl->skip(24); // Unknown
uint16 vertexCount = ctx.mdl->readUint16LE();
uint16 textureCount = ctx.mdl->readUint16LE();
ctx.mdl->skip(2);
byte unknownFlag1 = ctx.mdl->readByte();
_shadow = ctx.mdl->readByte() == 1;
byte unknownFlag2 = ctx.mdl->readByte();
_render = ctx.mdl->readByte() == 1;
ctx.mdl->skip(10);
if (ctx.kotor2)
ctx.mdl->skip(8);
uint32 offNodeData = ctx.mdl->readUint32LE();
ctx.mdl->skip(4);
if ((offOffVertsCount < 1) || (vertexCount == 0) || (facesCount == 0))
return;
uint32 endPos = ctx.mdl->pos();
if (textureCount > 2) {
//.........这里部分代码省略.........
示例5: Exception
bool ModelNode_NWN2::loadSkin(Model_NWN2::ParserContext &ctx) {
uint32 tag = ctx.mdb->readUint32BE();
if (tag != kSkinID)
throw Common::Exception("Invalid skin packet signature (%s)", Common::debugTag(tag).c_str());
uint32 packetSize = ctx.mdb->readUint32LE();
_name = Common::readStringFixed(*ctx.mdb, Common::kEncodingASCII, 32);
// Skipping lower level of detail models
if (_name.endsWith("_L01") || _name.endsWith("_L02"))
return false;
Common::UString skeletonName = Common::readStringFixed(*ctx.mdb, Common::kEncodingASCII, 32);
Common::UString diffuseMap = Common::readStringFixed(*ctx.mdb, Common::kEncodingASCII, 32);
Common::UString normalMap = Common::readStringFixed(*ctx.mdb, Common::kEncodingASCII, 32);
_tintMap = Common::readStringFixed(*ctx.mdb, Common::kEncodingASCII, 32);
Common::UString glowMap = Common::readStringFixed(*ctx.mdb, Common::kEncodingASCII, 32);
_diffuse [0] = ctx.mdb->readIEEEFloatLE();
_diffuse [1] = ctx.mdb->readIEEEFloatLE();
_diffuse [2] = ctx.mdb->readIEEEFloatLE();
_specular[0] = ctx.mdb->readIEEEFloatLE();
_specular[1] = ctx.mdb->readIEEEFloatLE();
_specular[2] = ctx.mdb->readIEEEFloatLE();
float specularPower = ctx.mdb->readIEEEFloatLE();
float specularValue = ctx.mdb->readIEEEFloatLE();
uint32 textureFlags = ctx.mdb->readUint32LE();
uint32 vertexCount = ctx.mdb->readUint32LE();
uint32 facesCount = ctx.mdb->readUint32LE();
if ((vertexCount == 0) || (facesCount == 0))
return false;
std::vector<Common::UString> textures;
textures.push_back(diffuseMap);
loadTextures(textures);
// Read vertices (interleaved)
VertexDecl vertexDecl;
vertexDecl.push_back(VertexAttrib(VPOSITION, 3, GL_FLOAT));
vertexDecl.push_back(VertexAttrib(VNORMAL , 3, GL_FLOAT));
vertexDecl.push_back(VertexAttrib(VTCOORD , 3, GL_FLOAT));
if (!_tintMap.empty())
vertexDecl.push_back(VertexAttrib(VTCOORD + 1, 3, GL_FLOAT));
_vertexBuffer.setVertexDeclInterleave(vertexCount, vertexDecl);
float *v = (float *) _vertexBuffer.getData();
for (uint32 i = 0; i < vertexCount; i++) {
// Position
*v++ = ctx.mdb->readIEEEFloatLE();
*v++ = ctx.mdb->readIEEEFloatLE();
*v++ = ctx.mdb->readIEEEFloatLE();
// Normal
*v++ = ctx.mdb->readIEEEFloatLE();
*v++ = ctx.mdb->readIEEEFloatLE();
*v++ = ctx.mdb->readIEEEFloatLE();
ctx.mdb->skip(4 * 4); // Bone weights
ctx.mdb->skip(4 * 1); // Bone indices
ctx.mdb->skip(3 * 4); // Tangent
ctx.mdb->skip(3 * 4); // Binormal
// TexCoords
*v++ = ctx.mdb->readIEEEFloatLE();
*v++ = ctx.mdb->readIEEEFloatLE();
*v++ = ctx.mdb->readIEEEFloatLE();
// TintMap TexCoords
if (!_tintMap.empty()) {
v[0] = v[-3];
v[1] = v[-2];
v[2] = v[-1];
v += 3;
}
ctx.mdb->skip(4); // Bone count
}
// Read faces
_indexBuffer.setSize(facesCount * 3, sizeof(uint16), GL_UNSIGNED_SHORT);
uint16 *f = (uint16 *) _indexBuffer.getData();
for (uint32 i = 0; i < facesCount * 3; i++)
f[i] = ctx.mdb->readUint16LE();
createBound();
_render = true;
//.........这里部分代码省略.........