本文整理汇总了C++中NormsIndexesTableType::addElement方法的典型用法代码示例。如果您正苦于以下问题:C++ NormsIndexesTableType::addElement方法的具体用法?C++ NormsIndexesTableType::addElement怎么用?C++ NormsIndexesTableType::addElement使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类NormsIndexesTableType
的用法示例。
在下文中一共展示了NormsIndexesTableType::addElement方法的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: applyGLTransformation
void ccGenericMesh::applyGLTransformation(const ccGLMatrix& trans)
{
//vertices should be handled another way!
//we must take care of the triangle normals!
if (m_triNormals && (!getParent() || !getParent()->isKindOf(CC_MESH)))
{
bool recoded = false;
//if there is more triangle normals than the size of the compressed
//normals array, we recompress the array instead of recompressing each normal
unsigned i,numTriNormals = m_triNormals->currentSize();
if (numTriNormals>ccNormalVectors::GetNumberOfVectors())
{
NormsIndexesTableType* newNorms = new NormsIndexesTableType;
if (newNorms->reserve(ccNormalVectors::GetNumberOfVectors()))
{
for (i=0; i<ccNormalVectors::GetNumberOfVectors(); i++)
{
CCVector3 new_n(ccNormalVectors::GetNormal(i));
trans.applyRotation(new_n);
normsType newNormIndex = ccNormalVectors::GetNormIndex(new_n.u);
newNorms->addElement(newNormIndex);
}
m_triNormals->placeIteratorAtBegining();
for (i=0; i<numTriNormals; i++)
{
m_triNormals->setValue(i,newNorms->getValue(m_triNormals->getCurrentValue()));
m_triNormals->forwardIterator();
}
recoded=true;
}
newNorms->clear();
newNorms->release();
newNorms=0;
}
//if there is less triangle normals than the compressed normals array size
//(or if there is not enough memory to instantiate the temporary array),
//we recompress each normal ...
if (!recoded)
{
//on recode direct chaque normale
m_triNormals->placeIteratorAtBegining();
for (i=0; i<numTriNormals; i++)
{
normsType* _theNormIndex = m_triNormals->getCurrentValuePtr();
CCVector3 new_n(ccNormalVectors::GetNormal(*_theNormIndex));
trans.applyRotation(new_n.u);
*_theNormIndex = ccNormalVectors::GetNormIndex(new_n.u);
m_triNormals->forwardIterator();
}
}
}
else
{
//TODO: process failed!
}
}
示例2: vertices
const ccGenericPrimitive& ccGenericPrimitive::operator += (const ccGenericPrimitive& prim)
{
ccPointCloud* verts = vertices();
unsigned vertCount = verts->size();
unsigned facesCount = size();
unsigned triFacesNormCount = (m_triNormals ? m_triNormals->currentSize() : 0);
//count new number of vertices & faces
unsigned newVertCount = vertCount + prim.getAssociatedCloud()->size();
unsigned newFacesCount = facesCount + prim.size();
bool primHasVertNorms = prim.getAssociatedCloud()->hasNormals();
bool primHasFaceNorms = prim.hasTriNormals();
//reserve memory
if (verts->reserve(newVertCount)
&& (!primHasVertNorms || verts->reserveTheNormsTable())
&& reserve(newFacesCount)
&& (!primHasFaceNorms || m_triNormalIndexes || reservePerTriangleNormalIndexes()))
{
//copy vertices & normals
ccGenericPointCloud* cloud = prim.getAssociatedCloud();
unsigned i;
for (i=0;i<cloud->size();++i)
{
verts->addPoint(*cloud->getPoint(i));
if (primHasVertNorms)
verts->addNormIndex(cloud->getPointNormalIndex(i));
}
//copy face normals
if (primHasFaceNorms)
{
const NormsIndexesTableType* primNorms = prim.getTriNormsTable();
assert(primNorms);
unsigned primTriNormCount = primNorms->currentSize();
NormsIndexesTableType* normsTable = (m_triNormals ? m_triNormals : new NormsIndexesTableType());
if (!normsTable || !normsTable->reserve(triFacesNormCount+primTriNormCount))
{
ccLog::Error("[ccGenericPrimitive::operator +] Not enough memory!");
return *this;
}
//attach table if not done already
if (!m_triNormals)
{
setTriNormsTable(normsTable);
assert(m_triNormals);
//primitives must have their normal table as child!
addChild(m_triNormals);
}
for (unsigned i=0; i<primTriNormCount; ++i)
normsTable->addElement(primNorms->getValue(i));
}
//copy faces
for (i=0;i<prim.size();++i)
{
const CCLib::TriangleSummitsIndexes* tsi = prim.getTriangleIndexes(i);
addTriangle(vertCount+tsi->i1,vertCount+tsi->i2,vertCount+tsi->i3);
if (primHasFaceNorms)
{
const int* normIndexes = prim.m_triNormalIndexes->getValue(i);
assert(normIndexes);
addTriangleNormalIndexes(triFacesNormCount+normIndexes[0],triFacesNormCount+normIndexes[1],triFacesNormCount+normIndexes[2]);
}
}
}
else
{
ccLog::Error("[ccGenericPrimitive::operator +] Not enough memory!");
}
return *this;
}
示例3: FromFbxMesh
//.........这里部分代码省略.........
mesh->setTriNormsTable(normsTable);
mesh->addChild(normsTable);
vertices->showNormals(true);
mesh->showNormals(true);
}
}
//import textures UV
int perVertexUV = -1;
bool hasTexUV = false;
{
for (int l=0; l<fbxMesh->GetElementUVCount(); ++l)
{
FbxGeometryElementUV* leUV = fbxMesh->GetElementUV(l);
//per-point UV coordinates
if (leUV->GetMappingMode() == FbxGeometryElement::eByControlPoint)
{
TextureCoordsContainer* vertTexUVTable = new TextureCoordsContainer();
if (!vertTexUVTable->reserve(vertCount) || !mesh->reservePerTriangleTexCoordIndexes())
{
vertTexUVTable->release();
ccLog::Warning(QString("[FBX] Not enough memory to load mesh '%1' UV coordinates!").arg(fbxMesh->GetName()));
}
else
{
FbxLayerElement::EReferenceMode refMode = leUV->GetReferenceMode();
for (int i=0; i<vertCount; ++i)
{
int id = refMode != FbxGeometryElement::eDirect ? leUV->GetIndexArray().GetAt(i) : i;
FbxVector2 uv = leUV->GetDirectArray().GetAt(id);
//convert to CC-structure
float uvf[2] = {static_cast<float>(uv.Buffer()[0]),
static_cast<float>(uv.Buffer()[1])};
vertTexUVTable->addElement(uvf);
}
mesh->addChild(vertTexUVTable);
hasTexUV = true;
}
perVertexUV = -1;
break; //no need to look to the other UV fields (can't handle them!)
}
else if (leUV->GetMappingMode() == FbxGeometryElement::eByPolygonVertex)
{
//per-vertex UV coordinates
perVertexUV = l;
}
}
}
//per-vertex UV coordinates
TextureCoordsContainer* texUVTable = 0;
if (perVertexUV >= 0)
{
texUVTable = new TextureCoordsContainer();
if (!texUVTable->reserve(polyVertCount) || !mesh->reservePerTriangleTexCoordIndexes())
{
texUVTable->release();
ccLog::Warning(QString("[FBX] Not enough memory to load mesh '%1' UV coordinates!").arg(fbxMesh->GetName()));
}
else
{
mesh->addChild(texUVTable);
hasTexUV = true;
}
}
示例4: loadFile
//.........这里部分代码省略.........
else if (tokens.front() == "vt")
{
//create and reserve memory for tex. coords container if necessary
if (!texCoords)
{
texCoords = new TextureCoordsContainer();
texCoords->link();
}
if (texCoords->currentSize() == texCoords->capacity())
{
if (!texCoords->reserve(texCoords->capacity() + MAX_NUMBER_OF_ELEMENTS_PER_CHUNK))
{
objWarnings[NOT_ENOUGH_MEMORY] = true;
error = true;
break;
}
}
//malformed line?
if (tokens.size() < 2)
{
objWarnings[INVALID_LINE] = true;
error = true;
break;
}
float T[2] = { T[0] = tokens[1].toFloat(), 0 };
if (tokens.size() > 2) //OBJ specification allows for only one value!!!
{
T[1] = tokens[2].toFloat();
}
texCoords->addElement(T);
++texCoordsRead;
}
/*** new vertex normal ***/
else if (tokens.front() == "vn") //--> in fact it can also be a facet normal!!!
{
//create and reserve memory for normals container if necessary
if (!normals)
{
normals = new NormsIndexesTableType;
normals->link();
}
if (normals->currentSize() == normals->capacity())
{
if (!normals->reserve(normals->capacity() + MAX_NUMBER_OF_ELEMENTS_PER_CHUNK))
{
objWarnings[NOT_ENOUGH_MEMORY] = true;
error = true;
break;
}
}
//malformed line?
if (tokens.size() < 4)
{
objWarnings[INVALID_LINE] = true;
error = true;
break;
}
CCVector3 N(static_cast<PointCoordinateType>(tokens[1].toDouble()),
static_cast<PointCoordinateType>(tokens[2].toDouble()),
static_cast<PointCoordinateType>(tokens[3].toDouble()));
示例5: createInternalRepresentation
//.........这里部分代码省略.........
m_contourPolyline->addPointIndex(0, hullPtsCount);
m_contourPolyline->setClosed(true);
m_contourPolyline->setVisible(true);
m_contourPolyline->setLocked(true);
m_contourPolyline->setName(DEFAULT_CONTOUR_NAME);
m_contourVertices->addChild(m_contourPolyline);
m_contourVertices->setEnabled(true);
m_contourVertices->setVisible(false);
}
else
{
delete m_contourPolyline;
m_contourPolyline = nullptr;
ccLog::Warning("[ccFacet::createInternalRepresentation] Not enough memory to create the contour polyline!");
}
}
//we create the corresponding (2D) mesh
std::vector<CCVector2> hullPointsVector;
try
{
hullPointsVector.reserve(hullPoints.size());
for (std::list<CCLib::PointProjectionTools::IndexedCCVector2*>::const_iterator it = hullPoints.begin(); it != hullPoints.end(); ++it)
{
hullPointsVector.push_back(**it);
}
}
catch (...)
{
ccLog::Warning("[ccFacet::createInternalRepresentation] Not enough memory to create the contour mesh!");
}
//if we have computed a concave hull, we must remove triangles falling outside!
bool removePointsOutsideHull = (m_maxEdgeLength > 0);
if (!hullPointsVector.empty() && CCLib::Delaunay2dMesh::Available())
{
//compute the facet surface
CCLib::Delaunay2dMesh dm;
char errorStr[1024];
if (dm.buildMesh(hullPointsVector, 0, errorStr))
{
if (removePointsOutsideHull)
dm.removeOuterTriangles(hullPointsVector, hullPointsVector);
unsigned triCount = dm.size();
assert(triCount != 0);
m_polygonMesh = new ccMesh(m_contourVertices);
if (m_polygonMesh->reserve(triCount))
{
//import faces
for (unsigned i = 0; i < triCount; ++i)
{
const CCLib::VerticesIndexes* tsi = dm.getTriangleVertIndexes(i);
m_polygonMesh->addTriangle(tsi->i1, tsi->i2, tsi->i3);
}
m_polygonMesh->setVisible(true);
m_polygonMesh->enableStippling(true);
//unique normal for facets
if (m_polygonMesh->reservePerTriangleNormalIndexes())
{
NormsIndexesTableType* normsTable = new NormsIndexesTableType();
normsTable->reserve(1);
CCVector3 N(m_planeEquation);
normsTable->addElement(ccNormalVectors::GetNormIndex(N.u));
m_polygonMesh->setTriNormsTable(normsTable);
for (unsigned i = 0; i < triCount; ++i)
m_polygonMesh->addTriangleNormalIndexes(0, 0, 0); //all triangles will have the same normal!
m_polygonMesh->showNormals(true);
m_polygonMesh->setLocked(true);
m_polygonMesh->setName(DEFAULT_POLYGON_MESH_NAME);
m_contourVertices->addChild(m_polygonMesh);
m_contourVertices->setEnabled(true);
m_contourVertices->setVisible(false);
}
else
{
ccLog::Warning("[ccFacet::createInternalRepresentation] Not enough memory to create the polygon mesh's normals!");
}
//update facet surface
m_surface = CCLib::MeshSamplingTools::computeMeshArea(m_polygonMesh);
}
else
{
delete m_polygonMesh;
m_polygonMesh = nullptr;
ccLog::Warning("[ccFacet::createInternalRepresentation] Not enough memory to create the polygon mesh!");
}
}
else
{
ccLog::Warning(QString("[ccFacet::createInternalRepresentation] Failed to create the polygon mesh (third party lib. said '%1'").arg(errorStr));
}
}
}
return true;
}
示例6: if
//.........这里部分代码省略.........
}
for (unsigned i=0; i<addedVertCount; ++i)
{
if (vertIndexes[i] < 0)
{
vertIndexes[i] = static_cast<int>(vertCount++);
vertices->addPoint(P[i]);
}
}
}
//number of triangles to add
unsigned addTriCount = (addedVertCount == 3 ? 1 : 2);
//now add the corresponding face(s)
if (!m_faces->reserve(m_faces->size() + addTriCount))
{
ccLog::Error("[DxfImporter] Not enough memory!");
return;
}
m_faces->addTriangle(vertIndexes[0], vertIndexes[1], vertIndexes[2]);
if (addedVertCount == 4)
m_faces->addTriangle(vertIndexes[0], vertIndexes[2], vertIndexes[3]);
//add per-triangle normals
{
//normals table
NormsIndexesTableType* triNormsTable = m_faces->getTriNormsTable();
bool firstTime = false;
if (!triNormsTable)
{
triNormsTable = new NormsIndexesTableType();
m_faces->setTriNormsTable(triNormsTable);
m_faces->addChild(triNormsTable);
firstTime = true;
}
//add 1 or 2 new entries
unsigned triNormCount = triNormsTable->currentSize();
if (!triNormsTable->reserve(triNormsTable->currentSize() + addTriCount))
{
ccLog::Error("[DxfImporter] Not enough memory!");
return;
}
CCVector3 N = (P[1]-P[0]).cross(P[2]-P[0]);
N.normalize();
triNormsTable->addElement(ccNormalVectors::GetNormIndex(N.u));
if (addTriCount == 2)
{
N = (P[2]-P[0]).cross(P[3]-P[0]);
N.normalize();
triNormsTable->addElement(ccNormalVectors::GetNormIndex(N.u));
}
//per-triangle normals indexes
if (firstTime)
{
if (!m_faces->reservePerTriangleNormalIndexes())
{
ccLog::Error("[DxfImporter] Not enough memory!");
return;
}
m_faces->showNormals(true);
}
int n1 = static_cast<int>(triNormCount);
m_faces->addTriangleNormalIndexes(n1, n1, n1);
if (addTriCount == 2)
{
int n2 = static_cast<int>(triNormCount+1);
m_faces->addTriangleNormalIndexes(n2, n2, n2);
}
}
//and now for the color
if (faceCol)
{
//RGB field already instantiated?
if (vertices->hasColors())
{
for (unsigned i=0; i<createdVertCount; ++i)
vertices->addRGBColor(faceCol);
}
//otherwise, reserve memory and set all previous points to white by default
else if (vertices->setRGBColor(ccColor::white))
{
//then replace the last color(s) by the current one
for (unsigned i=0; i<createdVertCount; ++i)
vertices->setPointColor(vertCount-1-i,faceCol);
m_faces->showColors(true);
}
}
else if (vertices->hasColors())
{
//add default color if none is defined!
for (unsigned i=0; i<createdVertCount; ++i)
vertices->addRGBColor(ccColor::white);
}
}