/* adds a ground plane to the scene */
unsigned int addGroundPlane (RTCScene scene_i)
{
  /* create a triangulated plane with 2 triangles and 4 vertices */
  unsigned int mesh = rtcNewTriangleMesh (scene_i, RTC_GEOMETRY_STATIC, 2, 4);

  /* set vertices */
  Vertex* vertices = (Vertex*) rtcMapBuffer(scene_i,mesh,RTC_VERTEX_BUFFER); 
  vertices[0].x = -10; vertices[0].y = -2; vertices[0].z = -10; 
  vertices[1].x = -10; vertices[1].y = -2; vertices[1].z = +10; 
  vertices[2].x = +10; vertices[2].y = -2; vertices[2].z = -10; 
  vertices[3].x = +10; vertices[3].y = -2; vertices[3].z = +10;
  rtcUnmapBuffer(scene_i,mesh,RTC_VERTEX_BUFFER); 

  /* set triangles */
  Triangle* triangles = (Triangle*) rtcMapBuffer(scene_i,mesh,RTC_INDEX_BUFFER);
  triangles[0].v0 = 0; triangles[0].v1 = 2; triangles[0].v2 = 1;
  triangles[1].v0 = 1; triangles[1].v1 = 2; triangles[1].v2 = 3;
  rtcUnmapBuffer(scene_i,mesh,RTC_INDEX_BUFFER);

  return mesh;
}
示例#2
0
RTCScene convertScene(ISPCScene* scene_in)
{
  //scene_in->numHairSets = 0;
  //scene_in->numMeshes = 0;

  /* create scene */
  RTCScene scene_out = rtcNewScene(RTC_SCENE_STATIC | RTC_SCENE_INCOHERENT, RTC_INTERSECT1);

  /* add all hair sets to the scene */
  for (int i=0; i<scene_in->numHairSets; i++)
  {
    ISPCHairSet* hair = scene_in->hairs[i];
    unsigned int geomID = rtcNewHairGeometry (scene_out, RTC_GEOMETRY_STATIC, hair->numHairs, hair->numVertices, hair->v2 ? 2 : 1);
    rtcSetBuffer(scene_out,geomID,RTC_VERTEX_BUFFER,hair->v,0,sizeof(Vertex));
    if (hair->v2) rtcSetBuffer(scene_out,geomID,RTC_VERTEX_BUFFER1,hair->v2,0,sizeof(Vertex));
    rtcSetBuffer(scene_out,geomID,RTC_INDEX_BUFFER,hair->hairs,0,sizeof(ISPCHair));
    rtcSetOcclusionFilterFunction(scene_out,geomID,(RTCFilterFunc)&filterDispatch);
  }

  /* add all triangle meshes to the scene */
  for (int i=0; i<scene_in->numMeshes; i++)
  {
    ISPCMesh* mesh = scene_in->meshes[i];
    unsigned int geomID = rtcNewTriangleMesh (scene_out, RTC_GEOMETRY_STATIC, mesh->numTriangles, mesh->numVertices, mesh->positions2 ? 2 : 1);
    rtcSetBuffer(scene_out,geomID,RTC_VERTEX_BUFFER,mesh->positions,0,sizeof(Vertex));
    if (mesh->positions2) rtcSetBuffer(scene_out,geomID,RTC_VERTEX_BUFFER1,mesh->positions2,0,sizeof(Vertex));
    rtcSetBuffer(scene_out,geomID,RTC_INDEX_BUFFER,mesh->triangles,0,sizeof(ISPCTriangle));
    rtcSetOcclusionFilterFunction(scene_out,geomID,(RTCFilterFunc)&filterDispatch);
  }

  /* commit changes to scene */
#if !defined(PARALLEL_COMMIT)
  rtcCommit (scene_out);
#else
  launch[ getNumHWThreads() ] parallelCommit(scene_out); 
#endif

  return scene_out;
}
extern "C" unsigned ispcNewTriangleMesh (RTCScene scene, RTCGeometryFlags flags, size_t numTriangles, size_t numVertices, size_t numTimeSteps) {
    return rtcNewTriangleMesh((RTCScene)scene,flags,numTriangles,numVertices,numTimeSteps);
}
示例#4
0
/* adds a cube to the scene */
unsigned int addCube (RTCScene scene_i)
{
    /* create a triangulated cube with 12 triangles and 8 vertices */
    unsigned int mesh = rtcNewTriangleMesh (scene_i, RTC_GEOMETRY_STATIC, 12, 8);

    /* set vertices */
    Vertex* vertices = (Vertex*) rtcMapBuffer(scene_i,mesh,RTC_VERTEX_BUFFER);
    vertices[0].x = -1;
    vertices[0].y = -1;
    vertices[0].z = -1;
    vertices[1].x = -1;
    vertices[1].y = -1;
    vertices[1].z = +1;
    vertices[2].x = -1;
    vertices[2].y = +1;
    vertices[2].z = -1;
    vertices[3].x = -1;
    vertices[3].y = +1;
    vertices[3].z = +1;
    vertices[4].x = +1;
    vertices[4].y = -1;
    vertices[4].z = -1;
    vertices[5].x = +1;
    vertices[5].y = -1;
    vertices[5].z = +1;
    vertices[6].x = +1;
    vertices[6].y = +1;
    vertices[6].z = -1;
    vertices[7].x = +1;
    vertices[7].y = +1;
    vertices[7].z = +1;
    rtcUnmapBuffer(scene_i,mesh,RTC_VERTEX_BUFFER);

    /* create triangle color array */
    colors = (Vec3fa*) alignedMalloc(12*sizeof(Vec3fa));

    /* set triangles and colors */
    int tri = 0;
    Triangle* triangles = (Triangle*) rtcMapBuffer(scene_i,mesh,RTC_INDEX_BUFFER);

    // left side
    colors[tri] = Vec3fa(1,0,0);
    triangles[tri].v0 = 0;
    triangles[tri].v1 = 2;
    triangles[tri].v2 = 1;
    tri++;
    colors[tri] = Vec3fa(1,0,0);
    triangles[tri].v0 = 1;
    triangles[tri].v1 = 2;
    triangles[tri].v2 = 3;
    tri++;

    // right side
    colors[tri] = Vec3fa(0,1,0);
    triangles[tri].v0 = 4;
    triangles[tri].v1 = 5;
    triangles[tri].v2 = 6;
    tri++;
    colors[tri] = Vec3fa(0,1,0);
    triangles[tri].v0 = 5;
    triangles[tri].v1 = 7;
    triangles[tri].v2 = 6;
    tri++;

    // bottom side
    colors[tri] = Vec3fa(0.5f);
    triangles[tri].v0 = 0;
    triangles[tri].v1 = 1;
    triangles[tri].v2 = 4;
    tri++;
    colors[tri] = Vec3fa(0.5f);
    triangles[tri].v0 = 1;
    triangles[tri].v1 = 5;
    triangles[tri].v2 = 4;
    tri++;

    // top side
    colors[tri] = Vec3fa(1.0f);
    triangles[tri].v0 = 2;
    triangles[tri].v1 = 6;
    triangles[tri].v2 = 3;
    tri++;
    colors[tri] = Vec3fa(1.0f);
    triangles[tri].v0 = 3;
    triangles[tri].v1 = 6;
    triangles[tri].v2 = 7;
    tri++;

    // front side
    colors[tri] = Vec3fa(0,0,1);
    triangles[tri].v0 = 0;
    triangles[tri].v1 = 4;
    triangles[tri].v2 = 2;
    tri++;
    colors[tri] = Vec3fa(0,0,1);
    triangles[tri].v0 = 2;
    triangles[tri].v1 = 4;
    triangles[tri].v2 = 6;
    tri++;

    // back side
    colors[tri] = Vec3fa(1,1,0);
    triangles[tri].v0 = 1;
    triangles[tri].v1 = 3;
    triangles[tri].v2 = 5;
    tri++;
    colors[tri] = Vec3fa(1,1,0);
    triangles[tri].v0 = 3;
    triangles[tri].v1 = 7;
    triangles[tri].v2 = 5;
    tri++;

    rtcUnmapBuffer(scene_i,mesh,RTC_INDEX_BUFFER);

    return mesh;
}
示例#5
0
RTCScene convertScene(ISPCScene* scene_in)
{
  //scene_in->numHairSets = 0;
  //scene_in->numMeshes = 0;

  /* create scene */
  RTCScene scene_out = rtcNewScene(RTC_SCENE_STATIC | RTC_SCENE_INCOHERENT, RTC_INTERSECT1);

  /* add all hair sets to the scene */
  for (int i=0; i<scene_in->numHairSets; i++)
  {
    ISPCHairSet* hair = scene_in->hairs[i];
    unsigned int geomID = rtcNewHairGeometry (scene_out, RTC_GEOMETRY_STATIC, hair->numHairs, hair->numVertices, hair->v2 ? 2 : 1);
    rtcSetBuffer(scene_out,geomID,RTC_VERTEX_BUFFER,hair->v,0,sizeof(Vertex));
    if (hair->v2) rtcSetBuffer(scene_out,geomID,RTC_VERTEX_BUFFER1,hair->v2,0,sizeof(Vertex));
    rtcSetBuffer(scene_out,geomID,RTC_INDEX_BUFFER,hair->hairs,0,sizeof(ISPCHair));
    rtcSetOcclusionFilterFunction(scene_out,geomID,(RTCFilterFunc)&filterDispatch);
  }

  /* add all triangle meshes to the scene */
  for (int i=0; i<scene_in->numMeshes; i++)
  {
    ISPCMesh* mesh = scene_in->meshes[i];
   
    if (mesh->numQuads)
     {
     g_subdiv_mode = true;

      size_t numPrimitives = mesh->numQuads;
      size_t numEdges      = mesh->numQuads*4;
      mesh->edge_level             = new float[numEdges];
      int *index_buffer = new int[numEdges];
      
      for (size_t i=0; i<numEdges; i++) 
	mesh->edge_level[i] = FIXED_EDGE_TESSELLATION_VALUE;
      
      /* create a triangle mesh */
      unsigned int geomID = rtcNewSubdivisionMesh (scene_out, RTC_GEOMETRY_STATIC, numPrimitives, numEdges, mesh->numVertices, 0, 0, 0);
      mesh->geomID = geomID;

      unsigned int* faces = (unsigned int*) rtcMapBuffer(scene_out, geomID, RTC_FACE_BUFFER);
      for (size_t i=0; i<mesh->numQuads    ; i++) faces[i] = 4;
      
      rtcUnmapBuffer(scene_out,geomID,RTC_FACE_BUFFER);

      for (size_t i=0; i<mesh->numQuads; i++)
      	 {
	   index_buffer[4*i+0] = mesh->quads[i].v0;
	   index_buffer[4*i+1] = mesh->quads[i].v1;
	   index_buffer[4*i+2] = mesh->quads[i].v2;
	   index_buffer[4*i+3] = mesh->quads[i].v3;	   
	 }

      rtcSetBuffer(scene_out, geomID, RTC_VERTEX_BUFFER, mesh->positions , 0, sizeof(Vec3fa  ));
      rtcSetBuffer(scene_out, geomID, RTC_INDEX_BUFFER,  index_buffer    , 0, sizeof(unsigned int));
      rtcSetBuffer(scene_out, geomID, RTC_LEVEL_BUFFER,  mesh->edge_level, 0, sizeof(float));
      
#if ENABLE_DISPLACEMENTS == 1
      rtcSetDisplacementFunction(scene_out,geomID,(RTCDisplacementFunc)&displacementFunction,NULL);
#endif
     } 
    else if (mesh->numTriangles)
    {
     unsigned int geomID = rtcNewTriangleMesh (scene_out, RTC_GEOMETRY_STATIC, mesh->numTriangles, mesh->numVertices, mesh->positions2 ? 2 : 1);
     rtcSetBuffer(scene_out,geomID,RTC_VERTEX_BUFFER,mesh->positions,0,sizeof(Vertex));
     if (mesh->positions2) rtcSetBuffer(scene_out,geomID,RTC_VERTEX_BUFFER1,mesh->positions2,0,sizeof(Vertex));
     rtcSetBuffer(scene_out,geomID,RTC_INDEX_BUFFER,mesh->triangles,0,sizeof(ISPCTriangle));
     rtcSetOcclusionFilterFunction(scene_out,geomID,(RTCFilterFunc)&filterDispatch);
    }
  
  }


  /* commit changes to scene */
  rtcCommit (scene_out);

  return scene_out;
}