[Bf-blender-cvs] [024f01b] cycles-ptex-06: Checkpoint

Nicholas Bishop noreply at git.blender.org
Thu Jan 15 20:12:54 CET 2015


Commit: 024f01b91a425a1b3b8a8208a7b8a8a6aafbc7e1
Author: Nicholas Bishop
Date:   Wed Jan 7 12:08:04 2015 +0100
Branches: cycles-ptex-06
https://developer.blender.org/rB024f01b91a425a1b3b8a8208a7b8a8a6aafbc7e1

Checkpoint

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

M	intern/cycles/CMakeLists.txt
M	intern/cycles/blender/blender_mesh.cpp
M	intern/cycles/kernel/osl/osl_services.cpp
M	intern/cycles/render/attribute.cpp
M	source/blender/blenkernel/intern/customdata.c
M	source/blender/blenkernel/intern/mesh.c
M	source/blender/blenkernel/intern/mesh_evaluate.c
M	source/blender/blenkernel/intern/subsurf_ccg.c
M	source/blender/makesdna/DNA_customdata_types.h
M	source/blender/makesrna/intern/rna_mesh.c

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

diff --git a/intern/cycles/CMakeLists.txt b/intern/cycles/CMakeLists.txt
index 2ba6af4..1d8391c 100644
--- a/intern/cycles/CMakeLists.txt
+++ b/intern/cycles/CMakeLists.txt
@@ -129,9 +129,10 @@ if(WITH_CYCLES_STANDALONE_GUI)
 	add_definitions(-DWITH_CYCLES_STANDALONE_GUI)
 endif()
 
-if(WITH_CYCLES_PTEX)
+#if(WITH_CYCLES_PTEX)
 	add_definitions(-DWITH_PTEX)
-endif()
+	include_directories("/home/nicholasbishop/ptex/src/ptex")
+#endif()
 
 if(WITH_CYCLES_OPENSUBDIV)
 	add_definitions(-DWITH_OPENSUBDIV)
diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index 8805443..3be1bf5 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -355,6 +355,60 @@ static void create_mesh(Scene *scene, Mesh *mesh, BL::Mesh b_mesh, const vector<
 		nverts[fi] = n;
 	}
 
+	// TODO(bishop): Ptex test
+	{
+		//BL::Mesh::tessface_vertex_colors_iterator l;
+
+		Attribute *face_id_attr = mesh->attributes.add(ATTR_STD_PTEX_FACE_ID);
+		Attribute *uv_attr = mesh->attributes.add(ATTR_STD_PTEX_UV);
+		mesh->attributes.reserve();
+
+		float *face_id = face_id_attr->data_float();
+		// float3 *uv = uv_attr->data_float3();
+		size_t cur_tri = 0;
+		size_t cur_tessface = 0;
+
+		for (b_mesh.tessfaces.begin(f); f != b_mesh.tessfaces.end(); ++f) {
+			const float ptex_id = (float)f->ptex_face_index();
+			std::cout << "ptex_id=" << ptex_id << std::endl;
+			face_id[cur_tri] = ptex_id;
+			cur_tri++;
+			if (nverts[cur_tessface] == 4) {
+				face_id[cur_tri] = ptex_id;
+				cur_tri++;
+			}
+			cur_tessface++;
+		}
+#if 0
+		const size_t num_tess = fi;
+		size_t cur_tess = 0;
+
+		for (cur_tess = 0; cur_tess < num_tess; cur_tess++) {
+			// TODO: cur_tess isn't really the correct ptex id (at
+			// least not necessarily)
+			float ptex_id = (float)cur_tess;
+
+			face_id[cur_tri] = ptex_id;
+
+			// TODO: uvs just for test, total nonsense
+
+			// uv[cur_tri * 3 + 0] = make_float3(0, 0, 0);
+			// uv[cur_tri * 3 + 1] = make_float3(1, 0, 0);
+			// uv[cur_tri * 3 + 2] = make_float3(1, 1, 0);
+			cur_tri++;
+
+			if (nverts[cur_tess] == 4) {
+				face_id[cur_tri] = ptex_id;
+
+				// uv[cur_tri * 3 + 0] = make_float3(0, 0, 0);
+				// uv[cur_tri * 3 + 1] = make_float3(1, 1, 0);
+				// uv[cur_tri * 3 + 2] = make_float3(0, 1, 0);
+				cur_tri++;
+			}
+		}
+#endif
+	}
+
 	/* create vertex color attributes */
 	{
 		BL::Mesh::tessface_vertex_colors_iterator l;
diff --git a/intern/cycles/kernel/osl/osl_services.cpp b/intern/cycles/kernel/osl/osl_services.cpp
index 73c21fb..5049138 100644
--- a/intern/cycles/kernel/osl/osl_services.cpp
+++ b/intern/cycles/kernel/osl/osl_services.cpp
@@ -849,8 +849,8 @@ bool OSLRenderServices::texture(ustring filename, TextureOpt &options,
 		if(!primitive_ptex(kg, sd, &uv, &faceid))
 			return false;
 
-		float u = uv.x;
-		float v = uv.y;
+		float u = s;
+		float v = 1 - t;
 		float dudx = 0.0f;
 		float dvdx = 0.0f;
 		float dudy = 0.0f;
@@ -864,6 +864,17 @@ bool OSLRenderServices::texture(ustring filename, TextureOpt &options,
 			return false;
 		}
 
+		static bool once = false;
+		if (!once) {
+			once = true;
+			std::cout << "ptex texture info: numFaces=" << r->numFaces()
+					  << std::endl;
+		}
+
+		if (faceid < 0 || faceid >= r->numFaces()) {
+			return false;
+		}
+
 		bool mipmaplerp = false;
 		float sharpness = 1.0f;
 		PtexFilter::Options opts(PtexFilter::f_bicubic, mipmaplerp, sharpness);
diff --git a/intern/cycles/render/attribute.cpp b/intern/cycles/render/attribute.cpp
index bf83c97..15d7134 100644
--- a/intern/cycles/render/attribute.cpp
+++ b/intern/cycles/render/attribute.cpp
@@ -359,7 +359,7 @@ Attribute *AttributeSet::add(AttributeStandard std, ustring name)
 				attr = add(name, TypeDesc::TypeFloat, ATTR_ELEMENT_FACE);
 				break;
 			case ATTR_STD_PTEX_UV:
-				attr = add(name, TypeDesc::TypePoint, ATTR_ELEMENT_VERTEX);
+				attr = add(name, TypeDesc::TypePoint, ATTR_ELEMENT_CORNER);
 				break;
 			case ATTR_STD_GENERATED_TRANSFORM:
 				attr = add(name, TypeDesc::TypeMatrix, ATTR_ELEMENT_MESH);
diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c
index 89ebed2..b074bda 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -1255,6 +1255,8 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = {
 	{sizeof(float[4]), "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
 	/* 40: CD_TESSLOOPNORMAL */
 	{sizeof(short[4][3]), "", 0, NULL, NULL, NULL, NULL, layerSwap_flnor, NULL},
+	/* 41: CD_PTEX_QUAD_FACE_ID */
+	{sizeof(int), "", 0, NULL, NULL, NULL, NULL, NULL, layerDefault_origindex},
 };
 
 /* note, numbers are from trunk and need updating for bmesh */
@@ -1271,6 +1273,7 @@ static const char *LAYERTYPENAMES[CD_NUMTYPES] = {
 	/* 30-34 */ "CDSubSurfCrease", "CDOrigSpaceLoop", "CDPreviewLoopCol", "CDBMElemPyPtr", "CDPaintMask",
 	/* 35-36 */ "CDGridPaintMask", "CDMVertSkin",
 	/* 37-40 */ "CDFreestyleEdge", "CDFreestyleFace", "CDMLoopTangent", "CDTessLoopNormal",
+	/*    41 */ "CDPtexQuadFaceID",
 };
 
 
@@ -1282,7 +1285,7 @@ const CustomDataMask CD_MASK_MESH =
     CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS |
     CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_MPOLY | CD_MASK_MLOOP |
     CD_MASK_MTEXPOLY | CD_MASK_RECAST | CD_MASK_PAINT_MASK |
-    CD_MASK_GRID_PAINT_MASK | CD_MASK_MVERT_SKIN | CD_MASK_FREESTYLE_EDGE | CD_MASK_FREESTYLE_FACE;
+    CD_MASK_GRID_PAINT_MASK | CD_MASK_MVERT_SKIN | CD_MASK_FREESTYLE_EDGE | CD_MASK_FREESTYLE_FACE | CD_MASK_PTEX_QUAD_FACE_ID;
 const CustomDataMask CD_MASK_EDITMESH =
     CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE | CD_MASK_MLOOPUV |
     CD_MASK_MLOOPCOL | CD_MASK_MTEXPOLY | CD_MASK_SHAPE_KEYINDEX |
@@ -1295,7 +1298,8 @@ const CustomDataMask CD_MASK_DERIVEDMESH =
     CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_MTEXPOLY | CD_MASK_PREVIEW_MLOOPCOL |
     CD_MASK_PROP_STR | CD_MASK_ORIGSPACE | CD_MASK_ORIGSPACE_MLOOP | CD_MASK_ORCO | CD_MASK_TANGENT |
     CD_MASK_PREVIEW_MCOL | CD_MASK_SHAPEKEY | CD_MASK_RECAST |
-    CD_MASK_ORIGINDEX | CD_MASK_MVERT_SKIN | CD_MASK_FREESTYLE_EDGE | CD_MASK_FREESTYLE_FACE;
+    CD_MASK_ORIGINDEX | CD_MASK_MVERT_SKIN | CD_MASK_FREESTYLE_EDGE | CD_MASK_FREESTYLE_FACE |
+	CD_MASK_PTEX_QUAD_FACE_ID;
 const CustomDataMask CD_MASK_BMESH =
     CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_MTEXPOLY |
     CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_PROP_FLT | CD_MASK_PROP_INT |
@@ -1316,7 +1320,7 @@ const CustomDataMask CD_MASK_EVERYTHING =
     /* BMESH ONLY END */
     CD_MASK_PAINT_MASK | CD_MASK_GRID_PAINT_MASK | CD_MASK_MVERT_SKIN |
     CD_MASK_FREESTYLE_EDGE | CD_MASK_FREESTYLE_FACE |
-    CD_MASK_MLOOPTANGENT | CD_MASK_TESSLOOPNORMAL;
+    CD_MASK_MLOOPTANGENT | CD_MASK_TESSLOOPNORMAL | CD_MASK_PTEX_QUAD_FACE_ID;
 
 static const LayerTypeInfo *layerType_getInfo(int type)
 {
@@ -2393,6 +2397,9 @@ void CustomData_from_bmeshpoly(CustomData *fdata, CustomData *pdata, CustomData
 		if (pdata->layers[i].type == CD_MTEXPOLY) {
 			CustomData_add_layer_named(fdata, CD_MTFACE, CD_CALLOC, NULL, total, pdata->layers[i].name);
 		}
+		if (pdata->layers[i].type == CD_PTEX_QUAD_FACE_ID) {
+			CustomData_add_layer_named(fdata, CD_PTEX_QUAD_FACE_ID, CD_CALLOC, NULL, total, pdata->layers[i].name);
+		}
 	}
 	for (i = 0; i < ldata->totlayer; i++) {
 		if (ldata->layers[i].type == CD_MLOOPCOL) {
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index c47d294..85fbb81 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -2238,6 +2238,8 @@ Mesh *BKE_mesh_new_from_object(
 
 				if (calc_undeformed)
 					mask |= CD_MASK_ORCO;
+				if (true) // TODO(bishop): if (ptex)
+					mask |= CD_MASK_PTEX_QUAD_FACE_ID;
 
 				/* Write the display mesh into the dummy mesh */
 				if (render)
diff --git a/source/blender/blenkernel/intern/mesh_evaluate.c b/source/blender/blenkernel/intern/mesh_evaluate.c
index 915abdb..6c73ad5 100644
--- a/source/blender/blenkernel/intern/mesh_evaluate.c
+++ b/source/blender/blenkernel/intern/mesh_evaluate.c
@@ -1301,6 +1301,7 @@ void BKE_mesh_loops_to_tessdata(CustomData *fdata, CustomData *ldata, CustomData
 	 *       this. Better imho to live with it for now. :/ --mont29
 	 */
 	const int numTex = CustomData_number_of_layers(pdata, CD_MTEXPOLY);
+	const int numPtex = CustomData_number_of_layers(pdata, CD_PTEX_QUAD_FACE_ID);
 	const int numCol = CustomData_number_of_layers(ldata, CD_MLOOPCOL);
 	const bool hasPCol = CustomData_has_layer(ldata, CD_PREVIEW_MLOOPCOL);
 	const bool hasOrigSpace = CustomData_has_layer(ldata, CD_ORIGSPACE_MLOOP);
@@ -1326,6 +1327,19 @@ void BKE_mesh_loops_to_tessdata(CustomData *fdata, CustomData *ldata, CustomData
 		}
 	}
 
+	// All TODO
+	for (i = 0; i < numPtex; i++) {
+		int *dst = CustomData_get_layer_n(fdata, CD_PTEX_QUAD_FACE_ID, i);
+		int *src = CustomData_get_layer_n(pdata, CD_PTEX_QUAD_FACE_ID, i);
+
+		for (findex = 0, pidx = polyindices;
+			 findex < num_faces;
+		     pidx++, findex++, dst++)
+		{
+			*dst = src[*pidx];
+		}
+	}
+
 	for (i = 0; i < numCol; i++) {
 		MCol (*mcol)[4] = CustomData_get_layer_n(fdata, CD_MCOL, i);
 		MLoopCol *mloopcol = CustomData_get_layer_n(ldata, CD_MLOOPCOL, i);
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index 961a66f..cb7b69a 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -3069,13 +3069,14 @@ static void *ccgDM_get_tessface_data_layer(DerivedMesh *dm, int type)
 
 static void *ccgDM_get_poly_data_layer(DerivedMesh *dm, int type)
 {
+	CCGDerivedMesh *ccgdm = (CCGDerivedMesh *)dm;
+	CCGSubSurf *ss = ccgdm->ss;
+	const int gridFaces = ccgSubSurf_getGridSize(ss) - 1;
+
 	if (type == CD_ORIGINDEX) {
 		/* create origindex on demand to save memory */
-		CCGDerivedMesh *ccgdm = (CCGDerivedMesh *)dm;
-		CCGSubSurf *ss = ccgdm->ss;
 		int *origindex;
 		int a, i, index, totface;
-		int gridFaces = ccgSubSurf_getGridSize(ss) - 1;
 
 		/* Avoid re-creation if the layer exists already */
 		origindex = DM_get_poly_data_layer(d

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list