[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