[Bf-blender-cvs] [2c35a4f] cycles-ptex-06: Stupid first pass at BI

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


Commit: 2c35a4f27f08e6be063ff6b7d4fdf1d1c1bc84ca
Author: Nicholas Bishop
Date:   Fri Jan 9 13:11:07 2015 +0100
Branches: cycles-ptex-06
https://developer.blender.org/rB2c35a4f27f08e6be063ff6b7d4fdf1d1c1bc84ca

Stupid first pass at BI

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

M	source/blender/blenkernel/intern/subsurf_ccg.c
M	source/blender/render/intern/include/renderdatabase.h
M	source/blender/render/intern/source/convertblender.c
M	source/blender/render/intern/source/ptex_reader.cpp
M	source/blender/render/intern/source/render_texture.c
M	source/blender/render/intern/source/renderdatabase.c
M	source/blender/render/intern/source/shadeinput.c

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

diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index d845575..e6db037 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -2927,6 +2927,24 @@ static void ccg_loops_to_corners(CustomData *fdata, CustomData *ldata,
 			copy_v2_v2(of->uv[j], lof->uv);
 		}
 	}
+
+	// TODO(bishop): why this special (incomplete?) tesselation
+	{
+		int *dst = CustomData_get(fdata, findex, CD_PTEX_QUAD_FACE_ID);
+		const int *src = CustomData_get(pdata, polyindex,
+		                                CD_PTEX_QUAD_FACE_ID);
+		*dst = *src;
+	}
+	{
+		texface = CustomData_get_n(fdata, CD_MTFACE, findex, i);
+		
+		//ME_MTEXFACE_CPY(texface, texpoly);
+
+		mloopuv = CustomData_get(ldata, loopstart, CD_PTEX_UV);
+		for (j = 0; j < 4; j++, mloopuv++) {
+			copy_v2_v2(texface->uv[j], mloopuv->uv);
+		}
+	}
 }
 
 static void *ccgDM_get_vert_data_layer(DerivedMesh *dm, int type)
@@ -3773,6 +3791,10 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
 	// TODO, quick hacks
 	ccgDM_get_poly_data_layer(&ccgdm->dm, CD_PTEX_QUAD_FACE_ID);
 	ccgDM_get_loop_data_layer(&ccgdm->dm, CD_PTEX_UV);
+	CustomData_add_layer(&ccgdm->dm.faceData, CD_PTEX_QUAD_FACE_ID,
+	                     CD_CALLOC, NULL, ccgdm->dm.numTessFaceData);
+	CustomData_add_layer(&ccgdm->dm.faceData, CD_MTFACE,
+	                     CD_CALLOC, NULL, ccgdm->dm.numTessFaceData);
 
 	loopindex = loopindex2 = 0; /* current loop index */
 	for (index = 0; index < totface; index++) {
@@ -4018,7 +4040,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
 	ccgdm->dm.numPolyData = faceNum;
 
 	/* All tessellated CD layers were updated! */
-	ccgdm->dm.dirty &= ~DM_DIRTY_TESS_CDLAYERS;
+	//ccgdm->dm.dirty &= ~DM_DIRTY_TESS_CDLAYERS;
 
 #ifndef USE_DYNSIZE
 	BLI_array_free(vertidx);
diff --git a/source/blender/render/intern/include/renderdatabase.h b/source/blender/render/intern/include/renderdatabase.h
index da45a2b..6b3a01e 100644
--- a/source/blender/render/intern/include/renderdatabase.h
+++ b/source/blender/render/intern/include/renderdatabase.h
@@ -72,6 +72,8 @@ typedef struct VlakTableNode {
 	struct VlakRen *vlak;
 	struct MTFace *mtface;
 	struct MCol *mcol;
+	/* TODO(bishop): oh my god this module is the worst */
+	int *ptex_face_ids;
 	/* Index of mpoly in source mesh (before tessellation). */
 	int *origindex;
 	int totmtface, totmcol;
@@ -132,6 +134,7 @@ int *RE_vertren_get_origindex(struct ObjectRen *obr, VertRen *ver, int verify);
 
 struct MTFace *RE_vlakren_get_tface(struct ObjectRen *obr, VlakRen *ren, int n, char **name, int verify);
 struct MCol *RE_vlakren_get_mcol(struct ObjectRen *obr, VlakRen *ren, int n, char **name, int verify);
+int *RE_vlakren_get_ptex_face_id(struct ObjectRen *obr, VlakRen *ren, int verify);
 int *RE_vlakren_get_origindex(struct ObjectRen *obr, VlakRen *vlak, int verify);
 float *RE_vlakren_get_surfnor(struct ObjectRen *obr, VlakRen *ren, int verify);
 float *RE_vlakren_get_nmap_tangent(struct ObjectRen *obr, VlakRen *ren, int verify);
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index 35878f6..301cf58 100644
--- a/source/blender/render/intern/source/convertblender.c
+++ b/source/blender/render/intern/source/convertblender.c
@@ -3161,7 +3161,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
 	/* origindex currently used when using autosmooth, or baking to vertex colors. */
 	need_origindex = (do_autosmooth || ((re->flag & R_BAKING) && (re->r.bake_flag & R_BAKE_VCOL)));
 
-	mask= CD_MASK_BAREMESH|CD_MASK_MTFACE|CD_MASK_MCOL;
+	mask= CD_MASK_BAREMESH|CD_MASK_MTFACE|CD_MASK_MCOL|CD_MASK_PTEX_QUAD_FACE_ID;
 	if (!timeoffset)
 		if (need_orco)
 			mask |= CD_MASK_ORCO;
@@ -3391,6 +3391,12 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
 											for (t=0; t<2; t++)
 												mtf->uv[vindex][t]=mtface[a].uv[rev_tab[vindex]][t];
 									}
+									if (layer->type == CD_PTEX_QUAD_FACE_ID) {
+										int t;
+										int *ptex_face_id_dst = RE_vlakren_get_ptex_face_id(obr, vlr, 1);
+										const int *ptex_face_id_src = (int*)layer->data;
+										*ptex_face_id_dst = ptex_face_id_src[a];
+									}
 									else if (layer->type == CD_MCOL && mcn < MAX_MCOL) {
 										mc= RE_vlakren_get_mcol(obr, vlr, mcn++, &name, 1);
 										mcol= (MCol*)layer->data;
diff --git a/source/blender/render/intern/source/ptex_reader.cpp b/source/blender/render/intern/source/ptex_reader.cpp
index faeb228..7100df5 100644
--- a/source/blender/render/intern/source/ptex_reader.cpp
+++ b/source/blender/render/intern/source/ptex_reader.cpp
@@ -62,7 +62,7 @@ bool read_ptex(Tex *tex, int face_id, float uv[2], TexResult *result) {
 		nchannels = 4;
 	}
 
-	float data[4] = {0, 0, 0, 0};
+	float data[4] = {0, 0, 0, 1};
 	int first_channel = 0;
 	f->eval(data, first_channel, nchannels, face_id,
 			uv[0], uv[1],
diff --git a/source/blender/render/intern/source/render_texture.c b/source/blender/render/intern/source/render_texture.c
index b991268..2aeb9ee 100644
--- a/source/blender/render/intern/source/render_texture.c
+++ b/source/blender/render/intern/source/render_texture.c
@@ -1284,6 +1284,7 @@ static int multitex_nodes_intern(Tex *tex, float texvec[3], float dxt[3], float
 			do_2d_mapping(&localmtex, texvec_l, NULL, NULL, dxt_l, dyt_l);
 			// TODO
 			copy_v3_v3(texvec_l, texvec);
+			// TODO, hmm
 			texvec_l[1] = 1 - texvec_l[1];
 			rgbnor = multitex(tex, texvec_l, dxt_l, dyt_l, osatex, texres, thread, which_output, pool);
 
diff --git a/source/blender/render/intern/source/renderdatabase.c b/source/blender/render/intern/source/renderdatabase.c
index cafdbe2..c170fb4 100644
--- a/source/blender/render/intern/source/renderdatabase.c
+++ b/source/blender/render/intern/source/renderdatabase.c
@@ -100,6 +100,7 @@
 #define RE_MCOL_ELEMS		4
 #define RE_UV_ELEMS			2
 #define RE_VLAK_ORIGINDEX_ELEMS	1
+#define RE_PTEX_FACE_INDEX_ELEMS 1
 #define RE_VERT_ORIGINDEX_ELEMS	1
 #define RE_SURFNOR_ELEMS	3
 #define RE_RADFACE_ELEMS	1
@@ -349,6 +350,21 @@ MCol *RE_vlakren_get_mcol(ObjectRen *obr, VlakRen *vlr, int n, char **name, int
 	return node->mcol + index*RE_MCOL_ELEMS;
 }
 
+int *RE_vlakren_get_ptex_face_id(ObjectRen *obr, VlakRen *vlak, int verify)
+{
+	int *ptex_face_ids;
+	int nr = vlak->index>>8;
+
+	ptex_face_ids = obr->vlaknodes[nr].ptex_face_ids;
+	if (ptex_face_ids == NULL) {
+		if (verify)
+			ptex_face_ids = obr->vlaknodes[nr].ptex_face_ids = MEM_callocN(256 * RE_PTEX_FACE_INDEX_ELEMS*sizeof(int), "ptex table");
+		else
+			return NULL;
+	}
+	return ptex_face_ids + (vlak->index & 255)*RE_PTEX_FACE_INDEX_ELEMS;
+}
+
 int *RE_vlakren_get_origindex(ObjectRen *obr, VlakRen *vlak, int verify)
 {
 	int *origindex;
@@ -416,6 +432,7 @@ VlakRen *RE_vlakren_copy(ObjectRen *obr, VlakRen *vlr)
 	MCol *mcol, *mcol1;
 	float *surfnor, *surfnor1, *tangent, *tangent1;
 	int *origindex, *origindex1;
+	int *ptex_face_ids, *ptex_face_ids1;
 	RadFace **radface, **radface1;
 	int i, index = vlr1->index;
 	char *name;
@@ -440,6 +457,12 @@ VlakRen *RE_vlakren_copy(ObjectRen *obr, VlakRen *vlr)
 		memcpy(origindex1, origindex, sizeof(int)*RE_VLAK_ORIGINDEX_ELEMS);
 	}
 
+	ptex_face_ids = RE_vlakren_get_ptex_face_id(obr, vlr, 0);
+	if (ptex_face_ids) {
+		ptex_face_ids1= RE_vlakren_get_origindex(obr, vlr1, 1);
+		memcpy(ptex_face_ids1, ptex_face_ids, sizeof(int)*RE_PTEX_FACE_INDEX_ELEMS);
+	}
+
 	surfnor= RE_vlakren_get_surfnor(obr, vlr, 0);
 	if (surfnor) {
 		surfnor1= RE_vlakren_get_surfnor(obr, vlr1, 1);
diff --git a/source/blender/render/intern/source/shadeinput.c b/source/blender/render/intern/source/shadeinput.c
index 01055d8..d368364 100644
--- a/source/blender/render/intern/source/shadeinput.c
+++ b/source/blender/render/intern/source/shadeinput.c
@@ -1118,6 +1118,9 @@ void shade_input_set_shade_texco(ShadeInput *shi)
 				const float *uv2 = tface->uv[j2];
 				const float *uv3 = tface->uv[j3];
 
+				// TODO
+				const int *ptex_face_id = RE_vlakren_get_ptex_face_id(obr, vlr, i);
+
 				shi->totuv++;
 				suv->name = name;
 
@@ -1190,6 +1193,11 @@ void shade_input_set_shade_texco(ShadeInput *shi)
 					suv->uv[0] = -1.0f + 2.0f * (l * uv3[0] - u * uv1[0] - v * uv2[0]);
 					suv->uv[1] = -1.0f + 2.0f * (l * uv3[1] - u * uv1[1] - v * uv2[1]);
 					suv->uv[2] = 0.0f;   /* texture.c assumes there are 3 coords */
+					// TODO
+					if (ptex_face_id) {
+						suv->uv[1] = -suv->uv[1];
+						suv->uv[2] = (float)(*ptex_face_id);
+					}
 
 					if (shi->osatex) {
 						float duv[2];




More information about the Bf-blender-cvs mailing list