[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [31487] branches/soc-2010-nicolasbishop: = = Ptex ==

Nicholas Bishop nicholasbishop at gmail.com
Sat Aug 21 01:39:08 CEST 2010


Revision: 31487
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31487
Author:   nicholasbishop
Date:     2010-08-21 01:39:08 +0200 (Sat, 21 Aug 2010)

Log Message:
-----------
== Ptex ==

* added an operator for removing the active ptex layer
* added a save operator for ptex layers. Note that it doesn't save adjacency data yet (doesn't affect painting, but needed for renderer filtering)

Modified Paths:
--------------
    branches/soc-2010-nicolasbishop/extern/ptex/ptex.h
    branches/soc-2010-nicolasbishop/extern/ptex/ptex_C_api.cpp
    branches/soc-2010-nicolasbishop/release/scripts/ui/properties_data_mesh.py
    branches/soc-2010-nicolasbishop/source/blender/blenkernel/BKE_ptex.h
    branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/ptex.c
    branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_intern.h
    branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_ops.c
    branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_ptex.c

Modified: branches/soc-2010-nicolasbishop/extern/ptex/ptex.h
===================================================================
--- branches/soc-2010-nicolasbishop/extern/ptex/ptex.h	2010-08-20 22:00:23 UTC (rev 31486)
+++ branches/soc-2010-nicolasbishop/extern/ptex/ptex.h	2010-08-20 23:39:08 UTC (rev 31487)
@@ -9,6 +9,7 @@
 typedef struct PtexTextureHandle PtexTextureHandle;
 typedef struct PtexFaceInfoHandle PtexFaceInfoHandle;
 typedef struct PtexResHandle PtexResHandle;
+typedef struct PtexWriterHandle PtexWriterHandle;
 
 typedef enum {
 	PTEX_DT_UINT8,
@@ -27,17 +28,23 @@
 extern void ptex_texture_get_pixel(PtexTextureHandle *ptex_texture_handle, int faceid, int u, int v, float *result, int firstchan, int nchannels, PtexResHandle res_handle);
 
 /* FaceInfo struct */
-extern PtexResHandle *ptex_face_get_res(PtexFaceInfoHandle* face_info_handle);
-extern int ptex_face_info_is_subface(PtexFaceInfoHandle* face_info_handle);
+PtexFaceInfoHandle *ptex_face_info_new(int u, int v, int adjfaces[4], int adjedges[4], int isSubface);
+extern PtexResHandle *ptex_face_info_get_res(PtexFaceInfoHandle *face_info_handle);
+extern int ptex_face_info_is_subface(PtexFaceInfoHandle *face_info_handle);
 
 /* Res struct */
-extern int ptex_res_u(PtexResHandle* ptex_res_handle);
-extern int ptex_res_v(PtexResHandle* ptex_res_handle);
+extern int ptex_res_u(PtexResHandle *ptex_res_handle);
+extern int ptex_res_v(PtexResHandle *ptex_res_handle);
 
+/* PtexWriter class */
+extern PtexWriterHandle *ptex_writer_open(const char *path, PtexDataType dt, int nchannels, int alphachan, int nfaces, int genmipmaps);
+extern void ptex_writer_write_face(PtexWriterHandle *ptex_writer_handle, int faceid, PtexFaceInfoHandle *info, const void *data, int stride);
+extern void ptex_writer_release(PtexWriterHandle *ptex_writer_handle);
+
 /* Utils */
 int ptex_data_size(PtexDataType type);
+int ptex_res_to_log2(int res);
 
-
 #ifdef __cplusplus
 }
 #endif

Modified: branches/soc-2010-nicolasbishop/extern/ptex/ptex_C_api.cpp
===================================================================
--- branches/soc-2010-nicolasbishop/extern/ptex/ptex_C_api.cpp	2010-08-20 22:00:23 UTC (rev 31486)
+++ branches/soc-2010-nicolasbishop/extern/ptex/ptex_C_api.cpp	2010-08-20 23:39:08 UTC (rev 31487)
@@ -61,8 +61,16 @@
 
 
 /**** FaceInfo struct ****/
-PtexResHandle *ptex_face_get_res(PtexFaceInfoHandle *face_info_handle)
+PtexFaceInfoHandle *ptex_face_info_new(int u, int v, int adjfaces[4], int adjedges[4], int isSubface)
 {
+	int ulog2 = ptex_res_to_log2(u);
+	int vlog2 = ptex_res_to_log2(v);
+
+	return (PtexFaceInfoHandle*)(new Ptex::FaceInfo(Ptex::Res(ulog2, vlog2), adjfaces, adjedges, isSubface));
+}
+
+PtexResHandle *ptex_face_info_get_res(PtexFaceInfoHandle *face_info_handle)
+{
 	return (PtexResHandle*)(&((Ptex::FaceInfo*)face_info_handle)->res);
 }
 
@@ -84,6 +92,43 @@
 	return ((Ptex::Res*)ptex_res_handle)->v();
 }
 
+
+
+/**** PtexWriter class ****/
+PtexWriterHandle *ptex_writer_open(const char *path, PtexDataType dt, int nchannels, int alphachan, int nfaces, int genmipmaps)
+{
+	Ptex::DataType ptex_data_type;
+	Ptex::String error;
+
+	switch(dt) {
+	case PTEX_DT_UINT8:
+		ptex_data_type = Ptex::dt_uint8;
+		break;
+	case PTEX_DT_UINT16:
+		ptex_data_type = Ptex::dt_uint16;
+		break;
+	case PTEX_DT_FLOAT:
+		ptex_data_type = Ptex::dt_float;
+		break;
+	default:
+		return NULL;
+	}
+
+	return (PtexWriterHandle*)PtexWriter::open(path, Ptex::mt_quad, ptex_data_type, nchannels, alphachan, nfaces, error, genmipmaps);
+}
+
+void ptex_writer_write_face(PtexWriterHandle *ptex_writer_handle, int faceid, PtexFaceInfoHandle *info, const void *data, int stride)
+{
+	((PtexWriter*)ptex_writer_handle)->writeFace(faceid, *(Ptex::FaceInfo*)info, data, stride);
+}
+
+void ptex_writer_release(PtexWriterHandle *ptex_writer_handle)
+{
+	((PtexWriter*)ptex_writer_handle)->release();
+}
+
+
+
 /**** Utils ****/
 int ptex_data_size(PtexDataType type)
 {
@@ -98,3 +143,42 @@
 		return 0;
 	}
 }
+
+int ptex_res_to_log2(int res)
+{
+	switch(res) {
+	case (1<<0): return 0;
+	case (1<<1): return 1;
+	case (1<<2): return 2;
+	case (1<<3): return 3;
+	case (1<<4): return 4;
+	case (1<<5): return 5;
+	case (1<<6): return 6;
+	case (1<<7): return 7;
+	case (1<<8): return 8;
+	case (1<<9): return 9;
+	case (1<<10): return 10;
+	case (1<<11): return 11;
+	case (1<<12): return 12;
+	case (1<<13): return 13;
+	case (1<<14): return 14;
+	case (1<<15): return 15;
+	case (1<<16): return 16;
+	case (1<<17): return 17;
+	case (1<<18): return 18;
+	case (1<<19): return 19;
+	case (1<<20): return 20;
+	case (1<<21): return 21;
+	case (1<<22): return 22;
+	case (1<<23): return 23;
+	case (1<<24): return 24;
+	case (1<<25): return 25;
+	case (1<<26): return 26;
+	case (1<<27): return 27;
+	case (1<<28): return 28;
+	case (1<<29): return 29;
+	case (1<<30): return 30;
+	case (1<<31): return 31;
+	default: return 0;
+	}
+}

Modified: branches/soc-2010-nicolasbishop/release/scripts/ui/properties_data_mesh.py
===================================================================
--- branches/soc-2010-nicolasbishop/release/scripts/ui/properties_data_mesh.py	2010-08-20 22:00:23 UTC (rev 31486)
+++ branches/soc-2010-nicolasbishop/release/scripts/ui/properties_data_mesh.py	2010-08-20 23:39:08 UTC (rev 31487)
@@ -259,6 +259,26 @@
                 row.prop(key, "slurph")
 
 
+class DATA_PT_ptex(MeshButtonsPanel, bpy.types.Panel):
+    bl_label = "PTex"
+    COMPAT_ENGINES = {'BLENDER_RENDER'}
+
+    def draw(self, context):
+        layout = self.layout
+
+        me = context.mesh
+
+        row = layout.row()
+        row.template_list(me, "ptex_layers", me, "active_ptex_index", rows=2)
+        col = row.column(align=True)
+        col.operator("ptex.layer_remove", icon='ZOOMOUT', text="")
+
+        layout.operator_menu_enum("ptex.layer_add", "type")
+        row = layout.row()
+        row.operator("ptex.open")
+        row.operator("ptex.layer_save")
+
+
 class DATA_PT_uv_texture(MeshButtonsPanel, bpy.types.Panel):
     bl_label = "UV Texture"
     COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
@@ -355,21 +375,6 @@
                 layout.operator("mesh.vertex_color_multiresolution_toggle", text="Add Multires")
 
 
-class DATA_PT_ptex(MeshButtonsPanel, bpy.types.Panel):
-    bl_label = "PTex"
-    COMPAT_ENGINES = {'BLENDER_RENDER'}
-
-    def draw(self, context):
-        layout = self.layout
-
-        me = context.mesh
-
-        layout.template_list(me, "ptex_layers", me, "active_ptex_index", rows=2)
-        row = layout.row()
-        row.operator_menu_enum("ptex.layer_add", "type")
-        row.operator("ptex.open")
-
-
 def register():
     pass
 

Modified: branches/soc-2010-nicolasbishop/source/blender/blenkernel/BKE_ptex.h
===================================================================
--- branches/soc-2010-nicolasbishop/source/blender/blenkernel/BKE_ptex.h	2010-08-20 22:00:23 UTC (rev 31486)
+++ branches/soc-2010-nicolasbishop/source/blender/blenkernel/BKE_ptex.h	2010-08-20 23:39:08 UTC (rev 31487)
@@ -36,3 +36,4 @@
 struct DerivedMesh *quad_dm_create_from_derived(struct DerivedMesh *dm);
 void ptex_subface_scale(struct MPtex *pt, struct MPtexSubface *subface, int ures, int vres);
 void ptex_layer_from_file(struct Mesh *me, struct PtexTextureHandle *ptex_texture);
+int ptex_layer_save_file(struct Mesh *me, const char *filename);

Modified: branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/ptex.c
===================================================================
--- branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/ptex.c	2010-08-20 22:00:23 UTC (rev 31486)
+++ branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/ptex.c	2010-08-20 23:39:08 UTC (rev 31487)
@@ -35,6 +35,7 @@
 
 #include "BKE_DerivedMesh.h"
 #include "BKE_dmgrid.h"
+#include "BKE_mesh.h"
 #include "BKE_subsurf.h"
 
 #include "BLI_math.h"
@@ -164,6 +165,103 @@
 	MEM_freeN(tmp);
 }
 
+/* copy data to/from ptex file format and internal MPtex format */
+static void ptex_transfer_filedata(MPtex *pt, int offset, char *file_data_start, int from_file)
+{
+	char *mptex_data, *file_data;
+	char **src, **dest;
+	int file_res[2], file_half_res[2];
+	int i, u, v, layersize;
+
+	layersize = pt->channels * ptex_data_size(pt->type);
+
+	if(pt->totsubface == 4) {
+		file_res[0] = pt->subfaces[1].res[0] << 1;
+		file_res[1] = pt->subfaces[1].res[1] << 1;
+	}
+	else {
+		file_res[0] = pt->subfaces[offset].res[1];
+		file_res[1] = pt->subfaces[offset].res[0];
+	}
+
+	file_half_res[0] = file_res[0] >> 1;
+	file_half_res[1] = file_res[1] >> 1;
+
+	if(from_file) {
+		src = &file_data;
+		dest = &mptex_data;
+	}
+	else {
+		src = &mptex_data;
+		dest = &file_data;
+	}
+
+	if(pt->totsubface == 4) {
+		/* save quad subfaces as one face */
+
+		for(i = 0; i < 4; ++i) {
+			MPtexSubface *subface = &pt->subfaces[i];
+			int file_center_offset[2], file_step, file_row_step;
+
+			switch(i) {
+			case 0:
+				file_center_offset[0] = -1;
+				file_center_offset[1] = -1;
+				file_step = -file_res[0];
+				file_row_step = file_res[0] * file_half_res[1] - 1;
+				break;
+			case 1:
+				file_center_offset[0] = 0;
+				file_center_offset[1] = -1;
+				file_step = 1;
+				file_row_step = -file_res[0] - file_half_res[0];
+				break;
+			case 2:
+				file_center_offset[0] = 0;
+				file_center_offset[1] = 0;
+				file_step = file_res[0];
+				file_row_step = -file_res[0] * file_half_res[1] + 1;
+				break;
+			case 3:
+				file_center_offset[0] = -1;
+				file_center_offset[1] = 0;
+				file_step = -1;
+				file_row_step = file_res[0] + file_half_res[0];
+				break;
+			}
+
+			mptex_data = subface->data;
+			file_data = file_data_start +
+				layersize * (file_res[0] * (file_half_res[1]+file_center_offset[1]) +
+					     file_half_res[0]+file_center_offset[0]);
+
+			for(v = 0; v < subface->res[1]; ++v) {
+				for(u = 0; u < subface->res[0]; ++u) {
+					memcpy(*dest, *src, layersize);
+					mptex_data += layersize;
+					file_data += layersize * file_step;
+				}
+				file_data += layersize * file_row_step;
+			}
+		}
+	}
+	else {
+		mptex_data = pt->subfaces[offset].data;
+		file_data = file_data_start;
+
+		for(v = 0; v < file_res[1]; ++v) {
+			for(u = 0; u < file_res[0]; ++u) {
+				mptex_data = (char*)pt->subfaces[offset].data +
+					layersize * ((file_res[0] - u - 1) * file_res[1] +
+						     (file_res[1] - v - 1));
+				file_data = file_data_start + layersize * (v*file_res[0]+u);
+
+				memcpy(*dest, *src, layersize);
+			}
+		}
+	}
+}
+

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list