[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