VisMeshBuffer_cl *VRendererNodeHelper::GetSphereMeshBuffer()
{
  if (m_spSphereMeshBuffer != NULL)
    return m_spSphereMeshBuffer;

  VDynamicMesh *pMesh = Vision::Game.LoadDynamicMesh("\\Models\\MagicBall.model", true, false);
  VASSERT(pMesh!=NULL);

  m_spSphereMeshBuffer = new VisMeshBuffer_cl();
  m_spSphereMeshBuffer->SetPrimitiveType(VisMeshBuffer_cl::MB_PRIMTYPE_INDEXED_TRILIST);
#ifdef HK_DEBUG
  m_spSphereMeshBuffer->SetFilename("<DeferredShadingSphereMesh>");
#endif

  VisMBVertexDescriptor_t descr;
  descr.Reset();
  descr.m_iPosOfs = 0 | VERTEXDESC_FORMAT_FLOAT3;
  descr.m_iStride = sizeof(float)*3;

  // get model properties
  int iVertexCount = pMesh->GetNumOfVertices();
  int iIndexCount = pMesh->GetNumOfTriangles() * 3;

  // copy vertex buffer, normalize vertex positions
  m_spSphereMeshBuffer->AllocateVertices(descr, iVertexCount); 
  float *pDestVerts = (float *)m_spSphereMeshBuffer->LockVertices(VIS_LOCKFLAG_DISCARDABLE);
  pMesh->CopyMeshVertices(pDestVerts, descr, 0, iVertexCount);
  for (int i=0; i<iVertexCount*3; i+=3)
  {
    hkvVec3 vPos(pDestVerts[i], pDestVerts[i+1], pDestVerts[i+2]);
    vPos.normalizeIfNotZero();
    memcpy(&pDestVerts[i], vPos.data, 3*sizeof(float));
  }
  m_spSphereMeshBuffer->UnLockVertices();

  // copy index buffer
  m_spSphereMeshBuffer->AllocateIndexList(iIndexCount);
  unsigned short *pDestIndices = (unsigned short *)m_spSphereMeshBuffer->LockIndices(VIS_LOCKFLAG_DISCARDABLE);
  pMesh->CopyMeshIndices(pDestIndices, (VisSurface_cl *)NULL);
  m_spSphereMeshBuffer->UnLockIndices();

  return m_spSphereMeshBuffer;
}
bool VisClothDeformer_cl::UpdateDeformerResult(VisVertexAnimResult_cl* pVertexAnimResult)
{
  VISION_PROFILE_FUNCTION(VIS_PROFILE_ANIMSYS_RESULT_VERTEX_ANIM);
   
  if(m_spMesh == NULL)
    return false;

  //// fill vertexanimresult with the mesh data
  // destination buffer
  float *pDestVertexPosition;
  const int  iDestVertexPositionStride = pVertexAnimResult->GetDestVertexPosition(pDestVertexPosition);
  float *pDestVertexNormal;
  const int  iDestVertexNormalStride = pVertexAnimResult->GetDestVertexNormal(pDestVertexNormal);

  int iVertexCount = m_spMesh->GetVertexCount();
  VDynamicMesh *pMesh = pVertexAnimResult->GetMesh();
  VASSERT(pMesh->GetNumOfVertices() == m_spMesh->GetVertexCount());
  VisObjectVertexDelta_t *pVertexDelta = m_spMesh->GetVertexDeltaList();

  // copy mesh vertices into vertexanim result
  hkvVec3 tempNormal(hkvNoInitialization);
  hkvVec3 vTranslate;
  if (m_pParentObject)
    vTranslate = m_pParentObject->GetPosition();

  for(int i=0; i<iVertexCount; i++, pVertexDelta++, ADVANCE_VERTEXPOINTERS)
  {
    pDestVertexPosition[0] = pVertexDelta->delta[0] - vTranslate.x;
    pDestVertexPosition[1] = pVertexDelta->delta[1] - vTranslate.y;
    pDestVertexPosition[2] = pVertexDelta->delta[2] - vTranslate.z;
    tempNormal.set(pVertexDelta->normal[0], pVertexDelta->normal[1], pVertexDelta->normal[2]);
    tempNormal.normalizeIfNotZero();
    pDestVertexNormal[0] = tempNormal.x;
    pDestVertexNormal[1] = tempNormal.y;
    pDestVertexNormal[2] = tempNormal.z;
  }

  return true;
}