Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/blender/blender_mesh.cpp
| Show First 20 Lines • Show All 193 Lines • ▼ Show 20 Lines | if(active_render) | ||||
| attr_sign = mesh->attributes.add(ATTR_STD_UV_TANGENT_SIGN, name_sign); | attr_sign = mesh->attributes.add(ATTR_STD_UV_TANGENT_SIGN, name_sign); | ||||
| else | else | ||||
| attr_sign = mesh->attributes.add(name_sign, TypeDesc::TypeFloat, ATTR_ELEMENT_CORNER); | attr_sign = mesh->attributes.add(name_sign, TypeDesc::TypeFloat, ATTR_ELEMENT_CORNER); | ||||
| tangent_sign = attr_sign->data_float(); | tangent_sign = attr_sign->data_float(); | ||||
| } | } | ||||
| for(int i = 0; i < nverts.size(); i++) { | for(int i = 0; i < nverts.size(); i++) { | ||||
| if (nverts[i] < 0) { | |||||
| tangent[0] = float4_to_float3(userdata.tangent[i*4 + 0]); | |||||
sergey: Wrong indices. Proper split is `0, 1, 3`, `2, 3, 1` here. Just mentioning. | |||||
| tangent[1] = float4_to_float3(userdata.tangent[i*4 + 2]); | |||||
| tangent[2] = float4_to_float3(userdata.tangent[i*4 + 3]); | |||||
| tangent += 3; | |||||
| if(tangent_sign) { | |||||
| tangent_sign[0] = userdata.tangent[i*4 + 0].w; | |||||
| tangent_sign[1] = userdata.tangent[i*4 + 2].w; | |||||
| tangent_sign[2] = userdata.tangent[i*4 + 3].w; | |||||
| tangent_sign += 3; | |||||
| } | |||||
| if(nverts[i] == -4) { | |||||
| tangent[0] = float4_to_float3(userdata.tangent[i*4 + 2]); | |||||
| tangent[1] = float4_to_float3(userdata.tangent[i*4 + 3]); | |||||
| tangent[2] = float4_to_float3(userdata.tangent[i*4 + 1]); | |||||
| tangent += 3; | |||||
| if(tangent_sign) { | |||||
| tangent_sign[0] = userdata.tangent[i*4 + 2].w; | |||||
| tangent_sign[1] = userdata.tangent[i*4 + 3].w; | |||||
| tangent_sign[2] = userdata.tangent[i*4 + 1].w; | |||||
| tangent_sign += 3; | |||||
| } | |||||
| } | |||||
| } | |||||
| else { | |||||
| tangent[0] = float4_to_float3(userdata.tangent[i*4 + 0]); | tangent[0] = float4_to_float3(userdata.tangent[i*4 + 0]); | ||||
| tangent[1] = float4_to_float3(userdata.tangent[i*4 + 1]); | tangent[1] = float4_to_float3(userdata.tangent[i*4 + 1]); | ||||
| tangent[2] = float4_to_float3(userdata.tangent[i*4 + 2]); | tangent[2] = float4_to_float3(userdata.tangent[i*4 + 2]); | ||||
| tangent += 3; | tangent += 3; | ||||
| if(tangent_sign) { | if(tangent_sign) { | ||||
| tangent_sign[0] = userdata.tangent[i*4 + 0].w; | tangent_sign[0] = userdata.tangent[i*4 + 0].w; | ||||
| tangent_sign[1] = userdata.tangent[i*4 + 1].w; | tangent_sign[1] = userdata.tangent[i*4 + 1].w; | ||||
| tangent_sign[2] = userdata.tangent[i*4 + 2].w; | tangent_sign[2] = userdata.tangent[i*4 + 2].w; | ||||
| tangent_sign += 3; | tangent_sign += 3; | ||||
| } | } | ||||
| if(nverts[i] == 4) { | if(nverts[i] == 4) { | ||||
| tangent[0] = float4_to_float3(userdata.tangent[i*4 + 0]); | tangent[0] = float4_to_float3(userdata.tangent[i*4 + 0]); | ||||
| tangent[1] = float4_to_float3(userdata.tangent[i*4 + 2]); | tangent[1] = float4_to_float3(userdata.tangent[i*4 + 2]); | ||||
| tangent[2] = float4_to_float3(userdata.tangent[i*4 + 3]); | tangent[2] = float4_to_float3(userdata.tangent[i*4 + 3]); | ||||
| tangent += 3; | tangent += 3; | ||||
| if(tangent_sign) { | if(tangent_sign) { | ||||
| tangent_sign[0] = userdata.tangent[i*4 + 0].w; | tangent_sign[0] = userdata.tangent[i*4 + 0].w; | ||||
| tangent_sign[1] = userdata.tangent[i*4 + 2].w; | tangent_sign[1] = userdata.tangent[i*4 + 2].w; | ||||
| tangent_sign[2] = userdata.tangent[i*4 + 3].w; | tangent_sign[2] = userdata.tangent[i*4 + 3].w; | ||||
| tangent_sign += 3; | tangent_sign += 3; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | |||||
| /* Create Volume Attribute */ | /* Create Volume Attribute */ | ||||
| static void create_mesh_volume_attribute(BL::Object b_ob, Mesh *mesh, ImageManager *image_manager, AttributeStandard std, float frame) | static void create_mesh_volume_attribute(BL::Object b_ob, Mesh *mesh, ImageManager *image_manager, AttributeStandard std, float frame) | ||||
| { | { | ||||
| BL::SmokeDomainSettings b_domain = object_smoke_domain_find(b_ob); | BL::SmokeDomainSettings b_domain = object_smoke_domain_find(b_ob); | ||||
| if(!b_domain) | if(!b_domain) | ||||
| ▲ Show 20 Lines • Show All 46 Lines • ▼ Show 20 Lines | for(b_mesh.tessface_vertex_colors.begin(l); l != b_mesh.tessface_vertex_colors.end(); ++l) { | ||||
| Attribute *attr = mesh->attributes.add( | Attribute *attr = mesh->attributes.add( | ||||
| ustring(l->name().c_str()), TypeDesc::TypeColor, ATTR_ELEMENT_CORNER_BYTE); | ustring(l->name().c_str()), TypeDesc::TypeColor, ATTR_ELEMENT_CORNER_BYTE); | ||||
| BL::MeshColorLayer::data_iterator c; | BL::MeshColorLayer::data_iterator c; | ||||
| uchar4 *cdata = attr->data_uchar4(); | uchar4 *cdata = attr->data_uchar4(); | ||||
| size_t i = 0; | size_t i = 0; | ||||
| for(l->data.begin(c); c != l->data.end(); ++c, ++i) { | for(l->data.begin(c); c != l->data.end(); ++c, ++i) { | ||||
| if (nverts[i] < 0) { | |||||
| cdata[0] = color_float_to_byte(color_srgb_to_scene_linear(get_float3(c->color1()))); | cdata[0] = color_float_to_byte(color_srgb_to_scene_linear(get_float3(c->color1()))); | ||||
| cdata[1] = color_float_to_byte(color_srgb_to_scene_linear(get_float3(c->color2()))); | cdata[1] = color_float_to_byte(color_srgb_to_scene_linear(get_float3(c->color2()))); | ||||
| cdata[2] = color_float_to_byte(color_srgb_to_scene_linear(get_float3(c->color3()))); | cdata[2] = color_float_to_byte(color_srgb_to_scene_linear(get_float3(c->color4()))); | ||||
| cdata += 3; | |||||
| if(nverts[i] == 4) { | if(nverts[i] == 4) { | ||||
| cdata[3] = cdata[0]; | cdata[0] = color_float_to_byte(color_srgb_to_scene_linear(get_float3(c->color3()))); | ||||
| cdata[4] = cdata[2]; | cdata[1] = color_float_to_byte(color_srgb_to_scene_linear(get_float3(c->color4()))); | ||||
| cdata[5] = color_float_to_byte(color_srgb_to_scene_linear(get_float3(c->color4()))); | cdata[2] = color_float_to_byte(color_srgb_to_scene_linear(get_float3(c->color2()))); | ||||
| cdata += 6; | cdata += 3; | ||||
| } | } | ||||
| else | } | ||||
| else { | |||||
| cdata[0] = color_float_to_byte(color_srgb_to_scene_linear(get_float3(c->color1()))); | |||||
| cdata[1] = color_float_to_byte(color_srgb_to_scene_linear(get_float3(c->color2()))); | |||||
| cdata[2] = color_float_to_byte(color_srgb_to_scene_linear(get_float3(c->color3()))); | |||||
| cdata += 3; | cdata += 3; | ||||
| if(nverts[i] == 4) { | |||||
| cdata[0] = color_float_to_byte(color_srgb_to_scene_linear(get_float3(c->color1()))); | |||||
| cdata[1] = color_float_to_byte(color_srgb_to_scene_linear(get_float3(c->color3()))); | |||||
| cdata[2] = color_float_to_byte(color_srgb_to_scene_linear(get_float3(c->color4()))); | |||||
| cdata += 3; | |||||
| } | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| /* Create uv map attributes. */ | /* Create uv map attributes. */ | ||||
| static void attr_create_uv_map(Scene *scene, | static void attr_create_uv_map(Scene *scene, | ||||
| Mesh *mesh, | Mesh *mesh, | ||||
| BL::Mesh b_mesh, | BL::Mesh b_mesh, | ||||
| Show All 16 Lines | for(b_mesh.tessface_uv_textures.begin(l); l != b_mesh.tessface_uv_textures.end(); ++l) { | ||||
| else | else | ||||
| attr = mesh->attributes.add(name, TypeDesc::TypePoint, ATTR_ELEMENT_CORNER); | attr = mesh->attributes.add(name, TypeDesc::TypePoint, ATTR_ELEMENT_CORNER); | ||||
| BL::MeshTextureFaceLayer::data_iterator t; | BL::MeshTextureFaceLayer::data_iterator t; | ||||
| float3 *fdata = attr->data_float3(); | float3 *fdata = attr->data_float3(); | ||||
| size_t i = 0; | size_t i = 0; | ||||
| for(l->data.begin(t); t != l->data.end(); ++t, ++i) { | for(l->data.begin(t); t != l->data.end(); ++t, ++i) { | ||||
| if (nverts[i] < 0) { | |||||
| fdata[0] = get_float3(t->uv1()); | |||||
| fdata[1] = get_float3(t->uv2()); | |||||
| fdata[2] = get_float3(t->uv4()); | |||||
| fdata += 3; | |||||
| if(nverts[i] == -4) { | |||||
| fdata[0] = get_float3(t->uv3()); | |||||
| fdata[1] = get_float3(t->uv4()); | |||||
| fdata[2] = get_float3(t->uv2()); | |||||
| fdata += 3; | |||||
| } | |||||
| } | |||||
| else { | |||||
| fdata[0] = get_float3(t->uv1()); | fdata[0] = get_float3(t->uv1()); | ||||
| fdata[1] = get_float3(t->uv2()); | fdata[1] = get_float3(t->uv2()); | ||||
| fdata[2] = get_float3(t->uv3()); | fdata[2] = get_float3(t->uv3()); | ||||
| fdata += 3; | fdata += 3; | ||||
| if(nverts[i] == 4) { | if(nverts[i] == 4) { | ||||
| fdata[0] = get_float3(t->uv1()); | fdata[0] = get_float3(t->uv1()); | ||||
| fdata[1] = get_float3(t->uv3()); | fdata[1] = get_float3(t->uv3()); | ||||
| fdata[2] = get_float3(t->uv4()); | fdata[2] = get_float3(t->uv4()); | ||||
| fdata += 3; | fdata += 3; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | |||||
| /* UV tangent */ | /* UV tangent */ | ||||
| std = (active_render)? ATTR_STD_UV_TANGENT: ATTR_STD_NONE; | std = (active_render)? ATTR_STD_UV_TANGENT: ATTR_STD_NONE; | ||||
| name = ustring((string(l->name().c_str()) + ".tangent").c_str()); | name = ustring((string(l->name().c_str()) + ".tangent").c_str()); | ||||
| if(mesh->need_attribute(scene, name) || (active_render && mesh->need_attribute(scene, std))) { | if(mesh->need_attribute(scene, name) || (active_render && mesh->need_attribute(scene, std))) { | ||||
| std = (active_render)? ATTR_STD_UV_TANGENT_SIGN: ATTR_STD_NONE; | std = (active_render)? ATTR_STD_UV_TANGENT_SIGN: ATTR_STD_NONE; | ||||
| name = ustring((string(l->name().c_str()) + ".tangent_sign").c_str()); | name = ustring((string(l->name().c_str()) + ".tangent_sign").c_str()); | ||||
| ▲ Show 20 Lines • Show All 158 Lines • ▼ Show 20 Lines | for(b_mesh.tessfaces.begin(f); f != b_mesh.tessfaces.end(); ++f, ++fi) { | ||||
| /* create triangles */ | /* create triangles */ | ||||
| if(n == 4) { | if(n == 4) { | ||||
| if(is_zero(cross(mesh->verts[vi[1]] - mesh->verts[vi[0]], mesh->verts[vi[2]] - mesh->verts[vi[0]])) || | if(is_zero(cross(mesh->verts[vi[1]] - mesh->verts[vi[0]], mesh->verts[vi[2]] - mesh->verts[vi[0]])) || | ||||
| is_zero(cross(mesh->verts[vi[2]] - mesh->verts[vi[0]], mesh->verts[vi[3]] - mesh->verts[vi[0]]))) | is_zero(cross(mesh->verts[vi[2]] - mesh->verts[vi[0]], mesh->verts[vi[3]] - mesh->verts[vi[0]]))) | ||||
| { | { | ||||
| mesh->set_triangle(ti++, vi[0], vi[1], vi[3], shader, smooth); | mesh->set_triangle(ti++, vi[0], vi[1], vi[3], shader, smooth); | ||||
| mesh->set_triangle(ti++, vi[2], vi[3], vi[1], shader, smooth); | mesh->set_triangle(ti++, vi[2], vi[3], vi[1], shader, smooth); | ||||
| nverts[fi] = -n; | |||||
| } | } | ||||
| else { | else { | ||||
| mesh->set_triangle(ti++, vi[0], vi[1], vi[2], shader, smooth); | mesh->set_triangle(ti++, vi[0], vi[1], vi[2], shader, smooth); | ||||
| mesh->set_triangle(ti++, vi[0], vi[2], vi[3], shader, smooth); | mesh->set_triangle(ti++, vi[0], vi[2], vi[3], shader, smooth); | ||||
| nverts[fi] = n; | |||||
| } | } | ||||
| } | } | ||||
| else | else { | ||||
| mesh->set_triangle(ti++, vi[0], vi[1], vi[2], shader, smooth); | mesh->set_triangle(ti++, vi[0], vi[1], vi[2], shader, smooth); | ||||
| nverts[fi] = n; | nverts[fi] = n; | ||||
| } | } | ||||
| } | |||||
| /* Create all needed attributes. | /* Create all needed attributes. | ||||
| * The calculate functions will check whether they're needed or not. | * The calculate functions will check whether they're needed or not. | ||||
| */ | */ | ||||
| attr_create_vertex_color(scene, mesh, b_mesh, nverts); | attr_create_vertex_color(scene, mesh, b_mesh, nverts); | ||||
| attr_create_uv_map(scene, mesh, b_mesh, nverts); | attr_create_uv_map(scene, mesh, b_mesh, nverts); | ||||
| /* for volume objects, create a matrix to transform from object space to | /* for volume objects, create a matrix to transform from object space to | ||||
| ▲ Show 20 Lines • Show All 371 Lines • Show Last 20 Lines | |||||
Wrong indices. Proper split is 0, 1, 3, 2, 3, 1 here. Just mentioning.