[Bf-blender-cvs] [1906a4f] cycles-ptex-06: checkpoint

Nicholas Bishop noreply at git.blender.org
Thu Jan 15 20:13:21 CET 2015


Commit: 1906a4fb09e5f7393bd4a35f93d506144621578e
Author: Nicholas Bishop
Date:   Tue Jan 13 16:09:46 2015 +0100
Branches: cycles-ptex-06
https://developer.blender.org/rB1906a4fb09e5f7393bd4a35f93d506144621578e

checkpoint

===================================================================

M	intern/cycles/blender/blender_mesh.cpp
M	intern/cycles/kernel/svm/svm_image.h
M	intern/cycles/render/image.cpp

===================================================================

diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index 60e9fcb..df3e31a 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -437,18 +437,18 @@ static void create_mesh(Scene *scene, Mesh *mesh, BL::Mesh b_mesh, const vector<
 					fdata[0] =  get_float3(t->uv1());
 					fdata[1] =  get_float3(t->uv2());
 					fdata[2] =  get_float3(t->uv3());
-					fdata[0].z = (float)ptex_face_id;
-					fdata[1].z = (float)ptex_face_id;
-					fdata[2].z = (float)ptex_face_id;
+					fdata[0].z = ptex_face_id;
+					fdata[1].z = ptex_face_id;
+					fdata[2].z = ptex_face_id;
 					fdata += 3;
 
 					if(nverts[i] == 4) {
 						fdata[0] =  get_float3(t->uv1());
 						fdata[1] =  get_float3(t->uv3());
 						fdata[2] =  get_float3(t->uv4());
-						fdata[0].z = (float)ptex_face_id;
-						fdata[1].z = (float)ptex_face_id;
-						fdata[2].z = (float)ptex_face_id;
+						fdata[0].z = ptex_face_id;
+						fdata[1].z = ptex_face_id;
+						fdata[2].z = ptex_face_id;
 						fdata += 3;
 					}
 
diff --git a/intern/cycles/kernel/svm/svm_image.h b/intern/cycles/kernel/svm/svm_image.h
index 6cafa52..b4c624a 100644
--- a/intern/cycles/kernel/svm/svm_image.h
+++ b/intern/cycles/kernel/svm/svm_image.h
@@ -395,33 +395,33 @@ ccl_device void svm_node_tex_image(KernelGlobals *kg, ShaderData *sd, float *sta
 	float3 co = stack_load_float3(stack, co_offset);
 	uint use_alpha = stack_valid(alpha_offset);
 
+	assert(co.x >= 0 && co.x <= 1);
+	assert(co.y >= 0 && co.y <= 1);
+
 	// TODO: test hacks for Ptex
-	uint face_id = (uint)co[2];
+	uint face_id = (uint)(co[2] + 0.5f);
 	uint offset = kernel_tex_fetch(__ptex_table, id);
-	float tex_width = (float)kernel_tex_fetch(__ptex_table, offset);
-	offset++;
-	float tex_height = (float)kernel_tex_fetch(__ptex_table, offset);
-	offset++;
-	offset += 3 * face_id;
-	uint origin_x = kernel_tex_fetch(__ptex_table, offset);
-	offset++;
-	uint origin_y = kernel_tex_fetch(__ptex_table, offset);
-	offset++;
-	uint ures = kernel_tex_fetch(__ptex_table, offset);
-	offset++;
-	uint vres = kernel_tex_fetch(__ptex_table, offset);
-	offset++;
-
-	float xco = (float)origin_x + co.x * ures;
-	float yco = (float)origin_y + co.y * ures;
-
-	float uco = (float)xco / tex_width;
-	float vco = (float)yco / tex_height;
-
-	float4 f = svm_image_texture(kg, id, uco, vco, srgb, use_alpha);
-	f.x = co[0];
-	f.y = co[1];
-	f.z = 0;
+	float2 tex_size =
+		make_float2((float)kernel_tex_fetch(__ptex_table, offset + 0),
+					(float)kernel_tex_fetch(__ptex_table, offset + 1));
+	offset += 2;
+	offset += 4 * face_id;
+
+	float2 ptex_origin =
+		make_float2((float)kernel_tex_fetch(__ptex_table, offset + 0),
+					(float)kernel_tex_fetch(__ptex_table, offset + 1));
+	float2 ptex_res =
+		make_float2((float)kernel_tex_fetch(__ptex_table, offset + 2),
+					(float)kernel_tex_fetch(__ptex_table, offset + 3));
+
+	float2 ptex_uv = ptex_origin + make_float2(co.x, 1 - co.y) * ptex_res;
+	ptex_uv /= tex_size;
+
+	float4 f = svm_image_texture(kg, id, ptex_uv.x, ptex_uv.y, srgb,
+								 use_alpha);
+	/* f.x = face_id / 20.0f; */
+	/* f.y = 0; */
+	/* f.z = 0;  */
 	//float4 f = svm_image_texture(kg, id, co.x, co.y, srgb, use_alpha);
 
 	if(stack_valid(out_offset))
diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp
index ef69ba0..d3a0717 100644
--- a/intern/cycles/render/image.cpp
+++ b/intern/cycles/render/image.cpp
@@ -33,22 +33,20 @@
 
 CCL_NAMESPACE_BEGIN
 
-struct PtexXY {
-	uint x, y;
-	uint ures, vres;
+struct PtexTableElement {
+	uint co[2];
+	uint res[2];
 };
 
-typedef std::map<int, PtexXY> PtexCoordMap;
-
 struct PtexPackedTexture {
 	PtexPackedTexture() : width(0), height(0) {}
 
 	vector<uint8_t> texels;
 
-	PtexCoordMap face_coord_map;
+	vector<PtexTableElement> table;
 
-	int width;
-	int height;
+	uint width;
+	uint height;
 
 	int num_channels;
 
@@ -66,14 +64,6 @@ struct PtexPackedTexture {
 	}
 };
 
-struct OrdVal {
-	vector<int> face_ids;
-	int elem_width;
-	int elem_per_row;
-	int num_rows;
-	int ures, vres;
-};
-
 static int ptex_data_type_size_in_bytes(const Ptex::DataType dt)
 {
 	switch (dt) {
@@ -91,9 +81,15 @@ static int ptex_data_type_size_in_bytes(const Ptex::DataType dt)
 	return 0;
 }
 
+static void ptex_read_border_pixel(PtexFaceData &face, const Ptex::EdgeId,
+								   const float t, void *output)
+{
+	face.
+}
+
 // TODO
 static bool ptex_pack(PtexPackedTexture *output, const char *path,
-					  const int width, PtexCache *ptex_cache) {
+					  const uint width, PtexCache *ptex_cache) {
 	Ptex::String error;
 	PtexPtr<PtexTexture> r(ptex_cache->get(path, error));
 
@@ -102,49 +98,61 @@ static bool ptex_pack(PtexPackedTexture *output, const char *path,
 		return false;
 	}
 
-	// TODO: for now packing all faces as squares
+	// Size of filter border, in pixels
+	const uint border = 1;
 
-	// Sorted, res -> face_id array. int8_t matches Ptex api
-	
-	typedef std::map<int, OrdVal> Ord;
-	Ord ord;
+	const uint num_faces = r->numFaces();
+	output->table.resize(num_faces);
 
-	const uint border = 1;
+	// Sort faces by vres
+	typedef std::multimap<uint, uint> SortedFaceIds;
+	SortedFaceIds sorted_face_ids;
 
-	const int num_faces = r->numFaces();
-	for (int face_index = 0; face_index < num_faces; face_index++) {
-		const Ptex::FaceInfo &face_info = r->getFaceInfo(face_index);
+	for (uint face_id = 0; face_id < num_faces; face_id++) {
+		const Ptex::FaceInfo &face_info = r->getFaceInfo(face_id);
 		const Ptex::Res &res = face_info.res;
-		const int larger = std::max(res.u(), res.v());
-		if (ord.find(larger) == ord.end()) {
-			ord[larger] = OrdVal();
-		}
-
-		ord[larger].face_ids.push_back(face_index);
+		sorted_face_ids.insert(std::make_pair(res.v(), face_id));
 
-		ord[larger].ures = res.u() + 2 * border;
-		ord[larger].vres = res.v() + 2 * border;
+		PtexTableElement &table_elem = output->table[face_id];
+		table_elem.res[0] = res.u();
+		table_elem.res[1] = res.v();
 	}
 
-	// TODO: for now only packing mipmap level zero
+	// TODO: check that largest res isn't above texture width
+
+	// For now only packing mipmap level zero
 
-	// Calc size
+	// Calc layout
 	output->width = width;
 	output->height = 0;
-	for (Ord::iterator iter = ord.begin(); iter != ord.end(); ++iter) {
-		OrdVal &val = iter->second;
-		const int res = iter->first;
+	uint dst_x = 0;
+	uint dst_y = 0;
+	uint yinc = 0;
+	for (SortedFaceIds::const_reverse_iterator iter =
+			 sorted_face_ids.rbegin();
+		 iter != sorted_face_ids.rend(); ++iter) {
+		const uint face_id = iter->second;
+
+		PtexTableElement &elem = output->table[face_id];
+
+		// Check if enough room on this row
+		if (dst_x + elem.res[0] + 2 * border >= output->width) {
+			// Move to next row
+			assert(yinc != 0);
+			dst_y += yinc;
+			yinc = 0;
+			dst_x = 0;
+		}
 
-		val.elem_width = border + res + border;
-		val.elem_per_row = output->width / val.elem_width;
-		const int num_elem = val.face_ids.size();
+		// Write final position
+		elem.co[0] = dst_x + border;
+		elem.co[1] = dst_y + border;
 
-		val.num_rows = num_elem / val.elem_per_row;
-		if ((num_elem % val.elem_per_row) != 0) {
-			val.num_rows += 1;
-		}
+		dst_x += elem.res[0] + 2 * border;
+		output->height = std::max(output->height,
+								  dst_y + elem.res[1] + 2 * border);
 
-		output->height += val.elem_width * val.num_rows;
+		yinc = std::max(yinc, elem.res[1] + 2 * border);
 	}
 
 	
@@ -157,46 +165,30 @@ static bool ptex_pack(PtexPackedTexture *output, const char *path,
 						  texel_size_in_bytes);
 
 	// Copy face textures
-	uint dst_y = 0;
-	bool yinc = false;
-
 	const int dst_stride = output->width * texel_size_in_bytes;
-	for (Ord::const_iterator iter = ord.begin(); iter != ord.end(); ++iter) {
-		const OrdVal &val = iter->second;
-		const int num_elem = val.face_ids.size();
-		int column = 0;
-		uint dst_x = 0;
-
-		for (int i = 0; i < num_elem; i++) {
-			const int face_id = val.face_ids[i];
+	for (SortedFaceIds::const_iterator iter = sorted_face_ids.begin();
+		 iter != sorted_face_ids.end(); ++iter) {
+		const uint face_id = iter->second;
+		PtexTableElement &elem = output->table[face_id];
 
-			PtexXY coord = {dst_x + border, dst_y + border, (uint)val.ures, (uint)val.vres};
-			output->face_coord_map[face_id] = coord;
+		const int dst_offset = ((elem.co[1] * output->width + elem.co[0]) *
+								texel_size_in_bytes);
 
-			const int dst_offset = ((coord.y * output->width + coord.x) *
-									texel_size_in_bytes);
+		r->getData(face_id, output->texels.data() + dst_offset, dst_stride);
 
-			r->getData(face_id,
-					   output->texels.data() + dst_offset,
-					   dst_stride);
+		// Fill in borders
+		const Ptex::FaceInfo &info = r->getFaceInfo(face_id);
+		for (int i = 0; i < 4; i++) {
+			const int adjface = info.adjface(i);
+			const Ptex::EdgeId adjedge = info.adjedge(i);
 
-			// TODO: have to fill in borders too...
+			// TODO: handle subfaces correctly
 
-			dst_x += val.elem_width;
-			yinc = true;
-
-			column += 1;
-			if (column == val.elem_per_row) {
-				column = 0;
-				dst_x = 0;
-				dst_y += val.elem_width;
-				yinc = false;
+			const PtexFaceData *face_data = r->getData(adjface);
+			for (int j = 0; j < elem.res[i % 2 == 0 ? 0 : 1]; j++) {
+				
 			}
-		}
-
-		if (yinc) {
-			dst_y += val.elem_width;
-			yinc = false;
+			break;
 		}
 	}
 
@@ -633,24 +625,23 @@ bool ImageManager::file_load_image(Image *img, device_vector<uchar4>& tex_img,
 		uint *table_data = dscene->ptex_table.resize(offset +
 													 2 +
 													 (4 * ptex_packed_texture.
-													  face_coord_map.size()));
+													  table.size()));
 		table_data[slot] = offset;
 		table_data[offset] = width;
 		offset++;
 		table_data[offset] = height;
 		offset++;
-		// oops, don't need map here key is contiguous
-		for (PtexCoordMap::const_iterator iter =
-				 ptex_packed_texture.face_coord_map.begin();
-			 iter != ptex_packed_texture.face_coord_map.end();
-			 ++iter) {
-			table_data[offset] = iter->second.x;
+
+		for (uint i = 0; i < ptex_packed_texture.table.size(); i++) {
+			const PtexTableElement &elem = ptex_packed_texture.table[i];
+
+			table_data[offset] = elem.co[0];
 			offset++;
-			table_data[offs

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list