[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [40773] branches/cycles/intern/cycles: Cycles: some tweaks to silence msvc assertions in debug mode.

Brecht Van Lommel brechtvanlommel at pandora.be
Mon Oct 3 17:31:46 CEST 2011


Revision: 40773
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=40773
Author:   blendix
Date:     2011-10-03 15:31:45 +0000 (Mon, 03 Oct 2011)
Log Message:
-----------
Cycles: some tweaks to silence msvc assertions in debug mode.

Modified Paths:
--------------
    branches/cycles/intern/cycles/blender/blender_mesh.cpp
    branches/cycles/intern/cycles/bvh/bvh.cpp
    branches/cycles/intern/cycles/device/device_network.h
    branches/cycles/intern/cycles/render/attribute.h
    branches/cycles/intern/cycles/render/mesh.cpp
    branches/cycles/intern/cycles/util/util_cache.h

Modified: branches/cycles/intern/cycles/blender/blender_mesh.cpp
===================================================================
--- branches/cycles/intern/cycles/blender/blender_mesh.cpp	2011-10-03 13:01:24 UTC (rev 40772)
+++ branches/cycles/intern/cycles/blender/blender_mesh.cpp	2011-10-03 15:31:45 UTC (rev 40773)
@@ -268,9 +268,10 @@
 
 	vector<Mesh::Triangle> 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 @@
 
 	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);
 

Modified: branches/cycles/intern/cycles/bvh/bvh.cpp
===================================================================
--- branches/cycles/intern/cycles/bvh/bvh.cpp	2011-10-03 13:01:24 UTC (rev 40772)
+++ branches/cycles/intern/cycles/bvh/bvh.cpp	2011-10-03 15:31:45 UTC (rev 40773)
@@ -314,11 +314,11 @@
 	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 @@
 		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 @@
 		}
 
 		/* 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(); 

Modified: branches/cycles/intern/cycles/device/device_network.h
===================================================================
--- branches/cycles/intern/cycles/device/device_network.h	2011-10-03 13:01:24 UTC (rev 40772)
+++ branches/cycles/intern/cycles/device/device_network.h	2011-10-03 15:31:45 UTC (rev 40773)
@@ -125,7 +125,7 @@
 				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);

Modified: branches/cycles/intern/cycles/render/attribute.h
===================================================================
--- branches/cycles/intern/cycles/render/attribute.h	2011-10-03 13:01:24 UTC (rev 40772)
+++ branches/cycles/intern/cycles/render/attribute.h	2011-10-03 15:31:45 UTC (rev 40773)
@@ -73,13 +73,13 @@
 	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);

Modified: branches/cycles/intern/cycles/render/mesh.cpp
===================================================================
--- branches/cycles/intern/cycles/render/mesh.cpp	2011-10-03 13:01:24 UTC (rev 40772)
+++ branches/cycles/intern/cycles/render/mesh.cpp	2011-10-03 15:31:45 UTC (rev 40773)
@@ -115,17 +115,20 @@
 	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,16 +146,19 @@
 	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 @@
 	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_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 @@
 			/* 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 */

Modified: branches/cycles/intern/cycles/util/util_cache.h
===================================================================
--- branches/cycles/intern/cycles/util/util_cache.h	2011-10-03 13:01:24 UTC (rev 40772)
+++ branches/cycles/intern/cycles/util/util_cache.h	2011-10-03 15:31:45 UTC (rev 40773)
@@ -57,20 +57,26 @@
 
 	template<typename T> void add(const vector<T>& 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<typename T> void add(const array<T>& 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 @@
 			return;
 		}
 
+		if(!size)
+			return;
+
 		data.resize(size/sizeof(T));
 
 		if(!fread(&data[0], size, 1, f)) {




More information about the Bf-blender-cvs mailing list