From da8f71bffb1a33c695a368c1243b8aa9ac54c21d Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 3 Oct 2011 15:31:45 +0000 Subject: [PATCH] Cycles: some tweaks to silence msvc assertions in debug mode. --- intern/cycles/blender/blender_mesh.cpp | 9 ++-- intern/cycles/bvh/bvh.cpp | 16 +++--- intern/cycles/device/device_network.h | 2 +- intern/cycles/render/attribute.h | 12 ++--- intern/cycles/render/mesh.cpp | 67 +++++++++++++++----------- intern/cycles/util/util_cache.h | 21 +++++--- 6 files changed, 76 insertions(+), 51 deletions(-) diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp index f981be66eb4..6e99b380c29 100644 --- a/intern/cycles/blender/blender_mesh.cpp +++ b/intern/cycles/blender/blender_mesh.cpp @@ -268,9 +268,10 @@ Mesh *BlenderSync::sync_mesh(BL::Object b_ob, bool object_updated) vector oldtriangle = mesh->triangles; + mesh->clear(); mesh->used_shaders = used_shaders; - mesh->name = ustring(b_ob_data.name()); + mesh->name = ustring(b_ob_data.name().c_str()); if(b_mesh) { if(cmesh.data && RNA_boolean_get(&cmesh, "use_subdivision")) @@ -299,8 +300,10 @@ Mesh *BlenderSync::sync_mesh(BL::Object b_ob, bool object_updated) if(oldtriangle.size() != mesh->triangles.size()) rebuild = true; - else if(memcmp(&oldtriangle[0], &mesh->triangles[0], sizeof(Mesh::Triangle)*oldtriangle.size()) != 0) - rebuild = true; + else if(oldtriangle.size()) { + if(memcmp(&oldtriangle[0], &mesh->triangles[0], sizeof(Mesh::Triangle)*oldtriangle.size()) != 0) + rebuild = true; + } mesh->tag_update(scene, rebuild); diff --git a/intern/cycles/bvh/bvh.cpp b/intern/cycles/bvh/bvh.cpp index 3be1f822ed7..cd3ad709812 100644 --- a/intern/cycles/bvh/bvh.cpp +++ b/intern/cycles/bvh/bvh.cpp @@ -314,11 +314,11 @@ void BVH::pack_instances(size_t nodes_size) pack.nodes.resize(nodes_size); pack.object_node.resize(objects.size()); - int *pack_prim_index = &pack.prim_index[0]; - int *pack_prim_object = &pack.prim_object[0]; - uint *pack_prim_visibility = &pack.prim_visibility[0]; - float4 *pack_tri_woop = &pack.tri_woop[0]; - int4 *pack_nodes = &pack.nodes[0]; + int *pack_prim_index = (pack.prim_index.size())? &pack.prim_index[0]: NULL; + int *pack_prim_object = (pack.prim_object.size())? &pack.prim_object[0]: NULL; + uint *pack_prim_visibility = (pack.prim_visibility.size())? &pack.prim_visibility[0]: NULL; + float4 *pack_tri_woop = (pack.tri_woop.size())? &pack.tri_woop[0]: NULL; + int4 *pack_nodes = (pack.nodes.size())? &pack.nodes[0]: NULL; /* merge */ foreach(Object *ob, objects) { @@ -355,7 +355,7 @@ void BVH::pack_instances(size_t nodes_size) mesh_map[mesh] = pack.object_node[object_offset-1]; /* merge primitive and object indexes */ - { + if(bvh->pack.prim_index.size()) { size_t bvh_prim_index_size = bvh->pack.prim_index.size(); int *bvh_prim_index = &bvh->pack.prim_index[0]; uint *bvh_prim_visibility = &bvh->pack.prim_visibility[0]; @@ -369,14 +369,14 @@ void BVH::pack_instances(size_t nodes_size) } /* merge triangle intersection data */ - { + if(bvh->pack.tri_woop.size()) { memcpy(pack_tri_woop+pack_tri_woop_offset, &bvh->pack.tri_woop[0], bvh->pack.tri_woop.size()*sizeof(float4)); pack_tri_woop_offset += bvh->pack.tri_woop.size(); } /* merge nodes */ - { + if( bvh->pack.nodes.size()) { size_t nsize_bbox = (use_qbvh)? nsize-2: nsize-1; int4 *bvh_nodes = &bvh->pack.nodes[0]; size_t bvh_nodes_size = bvh->pack.nodes.size(); diff --git a/intern/cycles/device/device_network.h b/intern/cycles/device/device_network.h index 775517586d3..3cdb70bb4df 100644 --- a/intern/cycles/device/device_network.h +++ b/intern/cycles/device/device_network.h @@ -125,7 +125,7 @@ typedef struct RPCReceive { size_t len = boost::asio::read(socket, boost::asio::buffer(data)); if(len == data_size) { - archive_str = string(&data[0], data.size()); + archive_str = (data.size())? string(&data[0], data.size()): string(""); /*istringstream archive_stream(archive_str); boost::archive::text_iarchive archive(archive_stream);*/ archive_stream = new istringstream(archive_str); diff --git a/intern/cycles/render/attribute.h b/intern/cycles/render/attribute.h index a1c3d2b6ae7..aef215d6c0c 100644 --- a/intern/cycles/render/attribute.h +++ b/intern/cycles/render/attribute.h @@ -73,13 +73,13 @@ public: size_t element_size(int numverts, int numfaces); size_t buffer_size(int numverts, int numfaces); - char *data() { return &buffer[0]; }; - float3 *data_float3() { return (float3*)&buffer[0]; } - float *data_float() { return (float*)&buffer[0]; } + char *data() { return (buffer.size())? &buffer[0]: NULL; }; + float3 *data_float3() { return (float3*)data(); } + float *data_float() { return (float*)data(); } - const char *data() const { return &buffer[0]; } - const float3 *data_float3() const { return (float3*)&buffer[0]; } - const float *data_float() const { return (float*)&buffer[0]; } + const char *data() const { return (buffer.size())? &buffer[0]: NULL; } + const float3 *data_float3() const { return (float3*)data(); } + const float *data_float() const { return (float*)data(); } static bool same_storage(TypeDesc a, TypeDesc b); static ustring standard_name(Attribute::Standard std); diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp index 7a6ce547486..ac07ee8e89f 100644 --- a/intern/cycles/render/mesh.cpp +++ b/intern/cycles/render/mesh.cpp @@ -115,17 +115,20 @@ void Mesh::add_face_normals() float3 *fN = attr_fN->data_float3(); /* compute face normals */ - float3 *verts_ptr = &verts[0]; size_t triangles_size = triangles.size(); - Triangle *triangles_ptr = &triangles[0]; - for(size_t i = 0; i < triangles_size; i++) { - Triangle t = triangles_ptr[i]; - float3 v0 = verts_ptr[t.v[0]]; - float3 v1 = verts_ptr[t.v[1]]; - float3 v2 = verts_ptr[t.v[2]]; + if(triangles_size) { + float3 *verts_ptr = &verts[0]; + Triangle *triangles_ptr = &triangles[0]; - fN[i] = normalize(cross(v1 - v0, v2 - v0)); + for(size_t i = 0; i < triangles_size; i++) { + Triangle t = triangles_ptr[i]; + float3 v0 = verts_ptr[t.v[0]]; + float3 v1 = verts_ptr[t.v[1]]; + float3 v2 = verts_ptr[t.v[2]]; + + fN[i] = normalize(cross(v1 - v0, v2 - v0)); + } } } @@ -143,15 +146,18 @@ void Mesh::add_vertex_normals() float3 *vN = attr_vN->data_float3(); /* compute vertex normals */ - memset(&vN[0], 0, verts.size()*sizeof(float3)); + memset(vN, 0, verts.size()*sizeof(float3)); size_t verts_size = verts.size(); size_t triangles_size = triangles.size(); - Triangle *triangles_ptr = &triangles[0]; - for(size_t i = 0; i < triangles_size; i++) - for(size_t j = 0; j < 3; j++) - vN[triangles_ptr[i].v[j]] += fN[i]; + if(triangles_size) { + Triangle *triangles_ptr = &triangles[0]; + + for(size_t i = 0; i < triangles_size; i++) + for(size_t j = 0; j < 3; j++) + vN[triangles_ptr[i].v[j]] += fN[i]; + } for(size_t i = 0; i < verts_size; i++) vN[i] = normalize(vN[i]); @@ -169,7 +175,7 @@ void Mesh::pack_normals(Scene *scene, float4 *normal, float4 *vnormal) bool last_smooth = false; size_t triangles_size = triangles.size(); - uint *shader_ptr = &shader[0]; + uint *shader_ptr = (shader.size())? &shader[0]: NULL; for(size_t i = 0; i < triangles_size; i++) { normal[i].x = fN[i].x; @@ -195,24 +201,30 @@ void Mesh::pack_normals(Scene *scene, float4 *normal, float4 *vnormal) void Mesh::pack_verts(float4 *tri_verts, float4 *tri_vindex, size_t vert_offset) { size_t verts_size = verts.size(); - float3 *verts_ptr = &verts[0]; - for(size_t i = 0; i < verts_size; i++) { - float3 p = verts_ptr[i]; - tri_verts[i] = make_float4(p.x, p.y, p.z, 0.0f); + if(verts_size) { + float3 *verts_ptr = &verts[0]; + + for(size_t i = 0; i < verts_size; i++) { + float3 p = verts_ptr[i]; + tri_verts[i] = make_float4(p.x, p.y, p.z, 0.0f); + } } size_t triangles_size = triangles.size(); - Triangle *triangles_ptr = &triangles[0]; - for(size_t i = 0; i < triangles_size; i++) { - Triangle t = triangles_ptr[i]; + if(triangles_size) { + Triangle *triangles_ptr = &triangles[0]; - tri_vindex[i] = make_float4( - __int_as_float(t.v[0] + vert_offset), - __int_as_float(t.v[1] + vert_offset), - __int_as_float(t.v[2] + vert_offset), - 0); + for(size_t i = 0; i < triangles_size; i++) { + Triangle t = triangles_ptr[i]; + + tri_vindex[i] = make_float4( + __int_as_float(t.v[0] + vert_offset), + __int_as_float(t.v[1] + vert_offset), + __int_as_float(t.v[2] + vert_offset), + 0); + } } } @@ -428,7 +440,8 @@ void MeshManager::device_update_attributes(Device *device, DeviceScene *dscene, /* todo: get rid of this exception */ if(!mattr && req.std == Attribute::STD_GENERATED) { mattr = mesh->attributes.add(Attribute::STD_GENERATED); - memcpy(mattr->data_float3(), &mesh->verts[0], sizeof(float3)*mesh->verts.size()); + if(mesh->verts.size()) + memcpy(mattr->data_float3(), &mesh->verts[0], sizeof(float3)*mesh->verts.size()); } /* attribute not found */ diff --git a/intern/cycles/util/util_cache.h b/intern/cycles/util/util_cache.h index 25b1f2e7a51..91e8a94a584 100644 --- a/intern/cycles/util/util_cache.h +++ b/intern/cycles/util/util_cache.h @@ -57,20 +57,26 @@ public: template void add(const vector& data) { - CacheBuffer buffer(&data[0], data.size()*sizeof(T)); - buffers.push_back(buffer); + if(data.size()) { + CacheBuffer buffer(&data[0], data.size()*sizeof(T)); + buffers.push_back(buffer); + } } template void add(const array& data) { - CacheBuffer buffer(&data[0], data.size()*sizeof(T)); - buffers.push_back(buffer); + if(data.size()) { + CacheBuffer buffer(&data[0], data.size()*sizeof(T)); + buffers.push_back(buffer); + } } void add(void *data, size_t size) { - CacheBuffer buffer(data, size); - buffers.push_back(buffer); + if(size) { + CacheBuffer buffer(data, size); + buffers.push_back(buffer); + } } void add(int& data) @@ -94,6 +100,9 @@ public: return; } + if(!size) + return; + data.resize(size/sizeof(T)); if(!fread(&data[0], size, 1, f)) {