Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/blender/blender_mesh.cpp
| Show First 20 Lines • Show All 74 Lines • ▼ Show 20 Lines | if(num_verts == 4) { | ||||
| tri_b[2] = 3; | tri_b[2] = 3; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| /* Tangent Space */ | /* Tangent Space */ | ||||
| struct MikkUserData { | struct MikkUserData { | ||||
| MikkUserData(const BL::Mesh& mesh_, | MikkUserData(BL::Mesh &mesh, | ||||
| BL::MeshTextureFaceLayer *layer_, | BL::MeshTextureFaceLayer *layer, | ||||
| int num_faces_) | int num_faces_) | ||||
| : mesh(mesh_), layer(layer_), num_faces(num_faces_) | : num_faces(num_faces_) | ||||
| { | { | ||||
| int num_verts = mesh.vertices.length(); | |||||
| tangent.resize(num_faces*4); | tangent.resize(num_faces*4); | ||||
| vert_indices.resize(num_faces); | |||||
| vertices.resize(num_verts); | |||||
| uvs.resize(num_faces*4); | |||||
| normals.resize(num_faces*4); | |||||
| int fi, v_i; | |||||
| BL::Mesh::tessfaces_iterator f; | |||||
| BL::Mesh::vertices_iterator v; | |||||
| for(fi = 0, mesh.tessfaces.begin(f); f != mesh.tessfaces.end(); ++f, ++fi) { | |||||
| vert_indices[fi] = get_int4(f->vertices_raw()); | |||||
| } | |||||
| if(layer != NULL) { | |||||
| BL::MeshTextureFaceLayer::data_iterator d; | |||||
| for(fi = 0, layer->data.begin(d); d != layer->data.end(); ++d, ++fi) { | |||||
| uvs[4*fi+0] = get_float2(d->uv1()); | |||||
| uvs[4*fi+1] = get_float2(d->uv2()); | |||||
| uvs[4*fi+2] = get_float2(d->uv3()); | |||||
| uvs[4*fi+3] = get_float2(d->uv4()); | |||||
| } | |||||
| } | |||||
| else { | |||||
| for(v_i = 0, mesh.vertices.begin(v); v != mesh.vertices.end(); ++v, ++v_i) { | |||||
| vertices[v_i] = get_float3(v->undeformed_co()); | |||||
| } | |||||
| for(int fi = 0; fi < num_faces; fi++) { | |||||
| uvs[4*fi+0] = map_to_sphere(vertices[vert_indices[fi].x]); | |||||
| uvs[4*fi+1] = map_to_sphere(vertices[vert_indices[fi].y]); | |||||
| uvs[4*fi+2] = map_to_sphere(vertices[vert_indices[fi].z]); | |||||
| uvs[4*fi+3] = map_to_sphere(vertices[vert_indices[fi].w]); | |||||
| } | |||||
| } | |||||
| /* Some memory could be saved here by only storing four normals for faces that | |||||
| * use smoothing. However, that would require an additional index array which | |||||
| * complicates and slows down the accessing later on. */ | |||||
| for(v_i = 0, mesh.vertices.begin(v); v != mesh.vertices.end(); ++v, ++v_i) { | |||||
| vertices[v_i] = get_float3(v->normal()); | |||||
| } | |||||
| for(fi = 0, mesh.tessfaces.begin(f); f != mesh.tessfaces.end(); ++f, ++fi) { | |||||
| if(f->use_smooth()) { | |||||
| normals[4*fi+0] = vertices[vert_indices[fi].x]; | |||||
| normals[4*fi+1] = vertices[vert_indices[fi].y]; | |||||
| normals[4*fi+2] = vertices[vert_indices[fi].z]; | |||||
| normals[4*fi+3] = vertices[vert_indices[fi].w]; | |||||
| } | |||||
| else { | |||||
| float3 vN = get_float3(f->normal()); | |||||
| normals[4*fi+0] = vN; | |||||
| normals[4*fi+1] = vN; | |||||
| normals[4*fi+2] = vN; | |||||
| normals[4*fi+3] = vN; | |||||
| } | |||||
| } | |||||
| for(v_i = 0, mesh.vertices.begin(v); v != mesh.vertices.end(); ++v, ++v_i) { | |||||
| vertices[v_i] = get_float3(v->co()); | |||||
| } | |||||
| } | } | ||||
| BL::Mesh mesh; | |||||
| BL::MeshTextureFaceLayer *layer; | |||||
| int num_faces; | int num_faces; | ||||
| vector<float4> tangent; | vector<float4> tangent; | ||||
| vector<int4> vert_indices; | |||||
| vector<float3> vertices; | |||||
| vector<float2> uvs; | |||||
| vector<float3> normals; | |||||
sergey: This adds yet another copy of data. How does this affect on memory usage when rendering… | |||||
| }; | }; | ||||
| static int mikk_get_num_faces(const SMikkTSpaceContext *context) | static int mikk_get_num_faces(const SMikkTSpaceContext *context) | ||||
| { | { | ||||
| MikkUserData *userdata = (MikkUserData*)context->m_pUserData; | MikkUserData *userdata = (MikkUserData*)context->m_pUserData; | ||||
| return userdata->num_faces; | return userdata->num_faces; | ||||
| } | } | ||||
| static int mikk_get_num_verts_of_face(const SMikkTSpaceContext *context, const int face_num) | static int mikk_get_num_verts_of_face(const SMikkTSpaceContext *context, const int face) | ||||
| { | { | ||||
| MikkUserData *userdata = (MikkUserData*)context->m_pUserData; | MikkUserData *userdata = (MikkUserData*)context->m_pUserData; | ||||
| BL::MeshTessFace f = userdata->mesh.tessfaces[face_num]; | return (userdata->vert_indices[face].w == 0)? 3: 4; | ||||
| int4 vi = get_int4(f.vertices_raw()); | |||||
| return (vi[3] == 0)? 3: 4; | |||||
| } | } | ||||
| static void mikk_get_position(const SMikkTSpaceContext *context, float P[3], const int face_num, const int vert_num) | static void mikk_get_position(const SMikkTSpaceContext *context, float P[3], const int face, const int vert) | ||||
| { | { | ||||
| MikkUserData *userdata = (MikkUserData*)context->m_pUserData; | MikkUserData *userdata = (MikkUserData*)context->m_pUserData; | ||||
| BL::MeshTessFace f = userdata->mesh.tessfaces[face_num]; | float3 vP = userdata->vertices[userdata->vert_indices[face][vert]]; | ||||
| int4 vi = get_int4(f.vertices_raw()); | |||||
| BL::MeshVertex v = userdata->mesh.vertices[vi[vert_num]]; | |||||
| float3 vP = get_float3(v.co()); | |||||
| P[0] = vP.x; | P[0] = vP.x; | ||||
| P[1] = vP.y; | P[1] = vP.y; | ||||
| P[2] = vP.z; | P[2] = vP.z; | ||||
| } | } | ||||
| static void mikk_get_texture_coordinate(const SMikkTSpaceContext *context, float uv[2], const int face_num, const int vert_num) | static void mikk_get_texture_coordinate(const SMikkTSpaceContext *context, float uv[2], const int face, const int vert) | ||||
| { | { | ||||
| MikkUserData *userdata = (MikkUserData*)context->m_pUserData; | MikkUserData *userdata = (MikkUserData*)context->m_pUserData; | ||||
| if(userdata->layer != NULL) { | float2 vUV = userdata->uvs[face*4 + vert]; | ||||
| BL::MeshTextureFace tf = userdata->layer->data[face_num]; | uv[0] = vUV.x; | ||||
| float3 tfuv; | uv[1] = vUV.y; | ||||
| switch(vert_num) { | |||||
| case 0: | |||||
| tfuv = get_float3(tf.uv1()); | |||||
| break; | |||||
| case 1: | |||||
| tfuv = get_float3(tf.uv2()); | |||||
| break; | |||||
| case 2: | |||||
| tfuv = get_float3(tf.uv3()); | |||||
| break; | |||||
| default: | |||||
| tfuv = get_float3(tf.uv4()); | |||||
| break; | |||||
| } | } | ||||
| uv[0] = tfuv.x; | static void mikk_get_normal(const SMikkTSpaceContext *context, float N[3], const int face, const int vert) | ||||
| uv[1] = tfuv.y; | |||||
| } | |||||
| else { | |||||
| int vert_idx = userdata->mesh.tessfaces[face_num].vertices()[vert_num]; | |||||
| float3 orco = | |||||
| get_float3(userdata->mesh.vertices[vert_idx].undeformed_co()); | |||||
| float2 tmp = map_to_sphere(make_float3(orco[0], orco[1], orco[2])); | |||||
| uv[0] = tmp.x; | |||||
| uv[1] = tmp.y; | |||||
| } | |||||
| } | |||||
| static void mikk_get_normal(const SMikkTSpaceContext *context, float N[3], const int face_num, const int vert_num) | |||||
| { | { | ||||
| MikkUserData *userdata = (MikkUserData*)context->m_pUserData; | MikkUserData *userdata = (MikkUserData*)context->m_pUserData; | ||||
| BL::MeshTessFace f = userdata->mesh.tessfaces[face_num]; | float3 vN = userdata->normals[face*4 + vert]; | ||||
| float3 vN; | |||||
| if(f.use_smooth()) { | |||||
| int4 vi = get_int4(f.vertices_raw()); | |||||
| BL::MeshVertex v = userdata->mesh.vertices[vi[vert_num]]; | |||||
| vN = get_float3(v.normal()); | |||||
| } | |||||
| else { | |||||
| vN = get_float3(f.normal()); | |||||
| } | |||||
| N[0] = vN.x; | N[0] = vN.x; | ||||
| N[1] = vN.y; | N[1] = vN.y; | ||||
| N[2] = vN.z; | N[2] = vN.z; | ||||
| } | } | ||||
| static void mikk_set_tangent_space(const SMikkTSpaceContext *context, const float T[], const float sign, const int face, const int vert) | static void mikk_set_tangent_space(const SMikkTSpaceContext *context, const float T[], const float sign, const int face, const int vert) | ||||
| { | { | ||||
| MikkUserData *userdata = (MikkUserData*)context->m_pUserData; | MikkUserData *userdata = (MikkUserData*)context->m_pUserData; | ||||
| ▲ Show 20 Lines • Show All 1,123 Lines • Show Last 20 Lines | |||||
This adds yet another copy of data. How does this affect on memory usage when rendering production files?