/* adds a cube to the scene */ unsigned int addCube (RTCScene scene_i) { /* create a triangulated cube with 6 quads and 8 vertices */ //unsigned int geomID = rtcNewTriangleMesh(scene_i, RTC_GEOMETRY_STATIC, NUM_FACES, NUM_INDICES/3); unsigned int geomID = rtcNewSubdivisionMesh(scene_i, RTC_GEOMETRY_STATIC, NUM_FACES, NUM_INDICES, 8, 0, 0, 0); //unsigned int geomID = rtcNewSubdivisionMesh(scene_i, RTC_GEOMETRY_STATIC, NUM_FACES, NUM_INDICES, 8, 12, 8, 0); rtcSetBuffer(scene_i, geomID, RTC_VERTEX_BUFFER, cube_vertices, 0, sizeof(Vec3fa )); rtcSetBuffer(scene_i, geomID, RTC_INDEX_BUFFER, cube_indices , 0, sizeof(unsigned int)); //rtcSetBuffer(scene_i, geomID, RTC_INDEX_BUFFER, cube_indices , 0, 3*sizeof(unsigned int)); rtcSetBuffer(scene_i, geomID, RTC_FACE_BUFFER, cube_faces, 0, sizeof(unsigned int)); rtcSetBuffer(scene_i, geomID, RTC_EDGE_CREASE_INDEX_BUFFER, cube_edge_crease_indices, 0, 2*sizeof(unsigned int)); rtcSetBuffer(scene_i, geomID, RTC_EDGE_CREASE_WEIGHT_BUFFER, cube_edge_crease_weights, 0, sizeof(float)); rtcSetBuffer(scene_i, geomID, RTC_VERTEX_CREASE_INDEX_BUFFER, cube_vertex_crease_indices,0, sizeof(unsigned int)); rtcSetBuffer(scene_i, geomID, RTC_VERTEX_CREASE_WEIGHT_BUFFER,cube_vertex_crease_weights,0, sizeof(float)); rtcSetBuffer(scene_i, geomID, RTC_USER_VERTEX_BUFFER0, cube_colors, 0, sizeof(Vec3fa)); float* level = (float*) rtcMapBuffer(scene_i, geomID, RTC_LEVEL_BUFFER); for (size_t i=0; i<NUM_INDICES; i++) level[i] = EDGE_LEVEL; rtcUnmapBuffer(scene_i, geomID, RTC_LEVEL_BUFFER); return geomID; }
/* adds a cube to the scene */ unsigned int addSubdivCube (RTCScene scene_i) { unsigned int geomID = rtcNewSubdivisionMesh(scene_i, RTC_GEOMETRY_STATIC, NUM_QUAD_FACES, NUM_QUAD_INDICES, NUM_VERTICES, 0, 0, 0); rtcSetBuffer(scene_i, geomID, RTC_VERTEX_BUFFER, cube_vertices, 0, sizeof(Vec3fa )); rtcSetBuffer(scene_i, geomID, RTC_INDEX_BUFFER, cube_quad_indices , 0, sizeof(unsigned int)); rtcSetBuffer(scene_i, geomID, RTC_FACE_BUFFER, cube_quad_faces, 0, sizeof(unsigned int)); float* level = (float*) rtcMapBuffer(scene_i, geomID, RTC_LEVEL_BUFFER); for (size_t i=0; i<NUM_QUAD_INDICES; i++) level[i] = 4; rtcUnmapBuffer(scene_i, geomID, RTC_LEVEL_BUFFER); /* create face color array */ colors = (Vec3fa*) alignedMalloc(6*sizeof(Vec3fa)); colors[0] = Vec3fa(1,0,0); // left side colors[1] = Vec3fa(0,1,0); // right side colors[2] = Vec3fa(0.5f); // bottom side colors[3] = Vec3fa(1.0f); // top side colors[4] = Vec3fa(0,0,1); // front side colors[5] = Vec3fa(1,1,0); // back side /* set intersection filter for the cube */ if (g_mode != MODE_NORMAL) { rtcSetIntersectionFilterFunctionN(scene_i,geomID,intersectionFilterN); rtcSetOcclusionFilterFunctionN (scene_i,geomID,occlusionFilterN); } else { rtcSetIntersectionFilterFunction(scene_i,geomID,intersectionFilter); rtcSetOcclusionFilterFunction (scene_i,geomID,occlusionFilter); } return geomID; }
unsigned int convertSubdivMesh(ISPCSubdivMesh* mesh, RTCScene scene_out) { /* if more than a single timestep, mark object as dynamic */ RTCGeometryFlags object_flags = mesh->numTimeSteps > 1 ? RTC_GEOMETRY_DYNAMIC : RTC_GEOMETRY_STATIC; /* create object */ unsigned int geomID = rtcNewSubdivisionMesh(scene_out, object_flags, mesh->numFaces, mesh->numEdges, mesh->numVertices, mesh->numEdgeCreases, mesh->numVertexCreases, mesh->numHoles, mesh->numTimeSteps); mesh->geom.geomID = geomID; for (size_t i=0; i<mesh->numEdges; i++) mesh->subdivlevel[i] = 4.0f; /* generate vertex buffer */ Vec3fa* vertices = (Vec3fa*) rtcMapBuffer(scene_out,geomID,RTC_VERTEX_BUFFER); for (size_t i=0;i<mesh->numVertices;i++) vertices[i] = mesh->positions[0][i]; rtcUnmapBuffer(scene_out, geomID, RTC_VERTEX_BUFFER); /* set all other buffers */ rtcSetBuffer(scene_out, geomID, RTC_LEVEL_BUFFER, mesh->subdivlevel, 0, sizeof(float)); rtcSetBuffer(scene_out, geomID, RTC_INDEX_BUFFER, mesh->position_indices , 0, sizeof(unsigned int)); rtcSetBuffer(scene_out, geomID, RTC_FACE_BUFFER, mesh->verticesPerFace, 0, sizeof(unsigned int)); rtcSetBuffer(scene_out, geomID, RTC_HOLE_BUFFER, mesh->holes, 0, sizeof(unsigned int)); rtcSetBuffer(scene_out, geomID, RTC_EDGE_CREASE_INDEX_BUFFER, mesh->edge_creases, 0, 2*sizeof(unsigned int)); rtcSetBuffer(scene_out, geomID, RTC_EDGE_CREASE_WEIGHT_BUFFER, mesh->edge_crease_weights, 0, sizeof(float)); rtcSetBuffer(scene_out, geomID, RTC_VERTEX_CREASE_INDEX_BUFFER, mesh->vertex_creases, 0, sizeof(unsigned int)); rtcSetBuffer(scene_out, geomID, RTC_VERTEX_CREASE_WEIGHT_BUFFER, mesh->vertex_crease_weights, 0, sizeof(float)); rtcSetSubdivisionMode(scene_out, geomID, 0, mesh->position_subdiv_mode); return geomID; }
/* adds a cube to the scene */ unsigned int addCube (RTCScene scene_i) { /* create a triangulated cube with 6 quads and 8 vertices */ unsigned int geomID = rtcNewSubdivisionMesh(scene_i, RTC_GEOMETRY_STATIC, NUM_FACES, NUM_INDICES, 8, 0, 0, 0); rtcSetBuffer(scene_i, geomID, RTC_VERTEX_BUFFER, cube_vertices, 0, sizeof(Vec3fa )); rtcSetBuffer(scene_i, geomID, RTC_INDEX_BUFFER, cube_indices , 0, sizeof(unsigned int)); rtcSetBuffer(scene_i, geomID, RTC_FACE_BUFFER, cube_faces, 0, sizeof(unsigned int)); return geomID; }
/* adds a cube to the scene */ unsigned int addCube (RTCScene scene_i) { /* create a triangulated cube with 6 quads and 8 vertices */ unsigned int geomID = rtcNewSubdivisionMesh(scene_i, RTC_GEOMETRY_STATIC, NUM_FACES, NUM_INDICES, 8, 0, 0, 0); rtcSetBuffer(scene_i, geomID, RTC_VERTEX_BUFFER, cube_vertices, 0, sizeof(Vec3fa )); rtcSetBuffer(scene_i, geomID, RTC_INDEX_BUFFER, cube_indices , 0, sizeof(unsigned int)); rtcSetBuffer(scene_i, geomID, RTC_FACE_BUFFER, cube_faces, 0, sizeof(unsigned int)); float* level = (float*) rtcMapBuffer(scene_i, geomID, RTC_LEVEL_BUFFER); for (size_t i=0; i<NUM_INDICES; i++) level[i] = EDGE_LEVEL; rtcUnmapBuffer(scene_i, geomID, RTC_LEVEL_BUFFER); rtcSetDisplacementFunction(scene_i,geomID,(RTCDisplacementFunc)&displacementFunction,NULL); return geomID; }
unsigned int convertSubdivMesh(ISPCSubdivMesh* mesh, RTCScene scene_out) { unsigned int geomID = rtcNewSubdivisionMesh(scene_out, RTC_GEOMETRY_STATIC, mesh->numFaces, mesh->numEdges, mesh->numVertices, mesh->numEdgeCreases, mesh->numVertexCreases, mesh->numHoles); mesh->geomID = geomID; for (size_t i=0; i<mesh->numEdges; i++) mesh->subdivlevel[i] = 16.0f; rtcSetBuffer(scene_out, geomID, RTC_VERTEX_BUFFER, mesh->positions, 0, sizeof(Vec3fa )); rtcSetBuffer(scene_out, geomID, RTC_LEVEL_BUFFER, mesh->subdivlevel, 0, sizeof(float)); rtcSetBuffer(scene_out, geomID, RTC_INDEX_BUFFER, mesh->position_indices , 0, sizeof(unsigned int)); rtcSetBuffer(scene_out, geomID, RTC_FACE_BUFFER, mesh->verticesPerFace, 0, sizeof(unsigned int)); rtcSetBuffer(scene_out, geomID, RTC_HOLE_BUFFER, mesh->holes, 0, sizeof(unsigned int)); rtcSetBuffer(scene_out, geomID, RTC_EDGE_CREASE_INDEX_BUFFER, mesh->edge_creases, 0, 2*sizeof(unsigned int)); rtcSetBuffer(scene_out, geomID, RTC_EDGE_CREASE_WEIGHT_BUFFER, mesh->edge_crease_weights, 0, sizeof(float)); rtcSetBuffer(scene_out, geomID, RTC_VERTEX_CREASE_INDEX_BUFFER, mesh->vertex_creases, 0, sizeof(unsigned int)); rtcSetBuffer(scene_out, geomID, RTC_VERTEX_CREASE_WEIGHT_BUFFER, mesh->vertex_crease_weights, 0, sizeof(float)); return geomID; }
extern "C" unsigned ispcNewSubdivisionMesh (RTCScene scene, RTCGeometryFlags flags, size_t numFaces, size_t numEdges, size_t numVertices, size_t numTimeSteps) { return rtcNewSubdivisionMesh((RTCScene)scene,flags,numFaces,numEdges,numVertices,numTimeSteps); }
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; }