Ejemplo n.º 1
0
void mitk::VtkModel::InitVertexBuffer()
{
  using sofa::defaulttype::ResizableExtVector;

  const VecCoord& vertices = this->getVertices();
  const ResizableExtVector<Deriv> normals = this->getVnormals();
  const VecTexCoord& texCoords = this->getVtexcoords();

  if (m_Mode == OpenGL)
  {
    glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(VecCoord::value_type) + normals.size() * sizeof(Deriv) + texCoords.size() * sizeof(VecTexCoord::value_type), nullptr, GL_DYNAMIC_DRAW);
  }
  else if (m_Mode == Surface)
  {
    m_Points->SetNumberOfPoints(vertices.size());

    m_Normals->SetNumberOfComponents(3);
    m_Normals->SetNumberOfTuples(normals.size());

    m_TexCoords->SetNumberOfComponents(2);
    m_TexCoords->SetNumberOfTuples(texCoords.size());
  }

  this->UpdateVertexBuffer();
}
Ejemplo n.º 2
0
void SubMesh::update(const ResizableExtVector<Coord>& positions,
        const ResizableExtVector<Coord>& normals,
        const ResizableExtVector<TexCoord>& textCoords) const
{

    const bool hasTexCoords= !(textCoords.empty());
    for (unsigned int i=0; i<storage.size(); ++i)
    {
        model->beginUpdate(index+i);

        for (Indices::const_iterator it=storage[i].indices.begin(); it!=storage[i].indices.end(); ++it)
        {
            const int idx=*it;
            model->position(positions[idx][0],positions[idx][1],positions[idx][2]);
            model->normal(normals[idx][0],normals[idx][1],normals[idx][2]);
            if (hasTexCoords) model->textureCoord(textCoords[idx][0],textCoords[idx][1]);
        }
        for (unsigned int t=0; t<storage[i].triangles.size(); ++t)
        {
            const Triangle &T=storage[i].triangles[t];
            model->triangle(T[0],T[1],T[2]);
        }
        for (unsigned int q=0; q<storage[i].quads.size(); ++q)
        {
            const Quad &Q=storage[i].quads[q];
            model->quad(Q[0],Q[1],Q[2],Q[3]);
        }
        model->end();
    }

    if (!OgreVisualModel::lightsEnabled) updateManualObjectCustomParameter();
}
Ejemplo n.º 3
0
void mitk::VtkModel::UpdateVertexBuffer()
{
  using sofa::defaulttype::ResizableExtVector;

  const VecCoord& vertices = this->getVertices();
  const ResizableExtVector<Deriv> normals = this->getVnormals();
  const VecTexCoord& texCoords = this->getVtexcoords();

  if (m_Mode == OpenGL)
  {
    GLsizeiptr sizeOfVertices = vertices.size() * sizeof(VecCoord::value_type);
    GLsizeiptr sizeOfNormals = normals.size() * sizeof(Deriv);

    glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeOfVertices, vertices.getData());
    glBufferSubData(GL_ARRAY_BUFFER, sizeOfVertices, sizeOfNormals, normals.getData());

    if (!m_Textures.empty())
    {
      GLsizeiptr sizeOfTexCoords = texCoords.size() * sizeof(VecTexCoord::value_type);
      glBufferSubData(GL_ARRAY_BUFFER, sizeOfVertices + sizeOfNormals, sizeOfTexCoords, texCoords.getData());
    }
  }
  else if (m_Mode == Surface)
  {
    size_t numPoints = vertices.size();

    for (size_t i = 0; i < numPoints; ++i)
      m_Points->SetPoint(i, vertices[i].elems);

    if (!normals.empty())
    {
      size_t numNormals = normals.size();

      for (size_t i = 0; i < numNormals; ++i)
        m_Normals->SetTuple(i, normals[i].elems);
    }

    if (!texCoords.empty())
    {
      size_t numTexCoords = texCoords.size();

      for (size_t i = 0; i < numTexCoords; ++i)
        m_TexCoords->SetTuple(i, normals[i].elems);
    }
  }
}
Ejemplo n.º 4
0
void SubMesh::create(Ogre::ManualObject *ogreObject,
        helper::vector< BaseOgreShaderParameter*> *parameters,
        const ResizableExtVector<Coord>& positions,
        const ResizableExtVector<Coord>& normals,
        const ResizableExtVector<TexCoord>& textCoords) const
{
    model=ogreObject;
    shaderParameters=parameters;

    const bool hasTexCoords= !(textCoords.empty());


    for (unsigned int i=0; i<storage.size(); ++i)
    {
        model->begin(material->getName(), Ogre::RenderOperation::OT_TRIANGLE_LIST);
        for (Indices::const_iterator it=storage[i].indices.begin(); it!=storage[i].indices.end(); ++it)
        {
            const int idx=*it;
            model->position(positions[idx][0],positions[idx][1],positions[idx][2]);
            model->normal(normals[idx][0],normals[idx][1],normals[idx][2]);
            if (hasTexCoords) model->textureCoord(textCoords[idx][0],textCoords[idx][1]);
        }

        for (unsigned int t=0; t<storage[i].triangles.size(); ++t)
        {
            const Triangle &T=storage[i].triangles[t];
            model->triangle(T[0],T[1],T[2]);
        }
        for (unsigned int q=0; q<storage[i].quads.size(); ++q)
        {
            const Quad &Q=storage[i].quads[q];
            model->quad(Q[0],Q[1],Q[2],Q[3]);
        }
        model->end();
    }

}