[Bf-blender-cvs] [fc47db0] soc-2013-paint: Texture painting now supports painting on named UV layers but does not yet display those correctly (still active uv map used for display)
Antony Riakiotakis
noreply at git.blender.org
Fri Apr 4 20:31:08 CEST 2014
Commit: fc47db0479d4a0ef3d95d5ef6d69fadff9c7437e
Author: Antony Riakiotakis
Date: Fri Apr 4 21:30:53 2014 +0300
https://developer.blender.org/rBfc47db0479d4a0ef3d95d5ef6d69fadff9c7437e
Texture painting now supports painting on named UV layers but does not
yet display those correctly (still active uv map used for display)
===================================================================
M source/blender/blenkernel/intern/material.c
M source/blender/editors/sculpt_paint/paint_image.c
M source/blender/editors/sculpt_paint/paint_image_proj.c
M source/blender/editors/sculpt_paint/paint_utils.c
M source/blender/editors/space_view3d/drawmesh.c
M source/blender/makesdna/DNA_material_types.h
M source/blender/makesrna/intern/rna_material.c
===================================================================
diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c
index ac10a44..8cb057e 100644
--- a/source/blender/blenkernel/intern/material.c
+++ b/source/blender/blenkernel/intern/material.c
@@ -1300,12 +1300,12 @@ void refresh_texpaint_image_cache(Material *ma)
if (!ma)
return;
- ma->texpaintima = NULL;
+ ma->texpaintslot = NULL;
for(mtex = ma->mtex; i < MAX_MTEX; i++, mtex++) {
if (get_mtex_slot_valid_texpaint(*mtex)) {
- if (index++ == ma->texactpaint) {
- ma->texpaintima = (*mtex)->tex->ima;
+ if (index++ == ma->paint_active_slot) {
+ ma->texpaintslot = (*mtex);
return;
}
@@ -1315,8 +1315,8 @@ void refresh_texpaint_image_cache(Material *ma)
/* possible to not have selected anything as active texture. Just set to a valid index */
if (index > 0) {
- ma->texactpaint = index;
- ma->texpaintima = validmtex->tex->ima;
+ ma->paint_active_slot = index;
+ ma->texpaintslot = validmtex;
}
return;
@@ -1344,7 +1344,7 @@ struct MTex *give_current_texpaint_slot(Material *ma)
for(mtex = ma->mtex; i < MAX_MTEX; i++, mtex++) {
if (get_mtex_slot_valid_texpaint(*mtex)) {
- if (index++ == ma->texactpaint)
+ if (index++ == ma->paint_active_slot)
return (*mtex);
validmtex = *mtex;
@@ -1353,7 +1353,7 @@ struct MTex *give_current_texpaint_slot(Material *ma)
/* possible to not have selected anything as active texture. Just set to a valid index */
if (index > 0) {
- ma->texactpaint = index;
+ ma->paint_active_slot = index;
}
return validmtex;
diff --git a/source/blender/editors/sculpt_paint/paint_image.c b/source/blender/editors/sculpt_paint/paint_image.c
index dd3e5e5..29638c8 100644
--- a/source/blender/editors/sculpt_paint/paint_image.c
+++ b/source/blender/editors/sculpt_paint/paint_image.c
@@ -1425,7 +1425,7 @@ void paint_proj_mesh_data_ensure(bContext *C, Object *ob)
if (ma) {
has_material = true;
refresh_texpaint_image_cache(ma);
- if (!ma->texpaintima) {
+ if (!ma->texpaintslot) {
proj_paint_add_slot(C, MAP_COL, ma);
refresh_texpaint_image_cache(ma);
}
diff --git a/source/blender/editors/sculpt_paint/paint_image_proj.c b/source/blender/editors/sculpt_paint/paint_image_proj.c
index a414866..2f7e21c 100644
--- a/source/blender/editors/sculpt_paint/paint_image_proj.c
+++ b/source/blender/editors/sculpt_paint/paint_image_proj.c
@@ -219,7 +219,7 @@ typedef struct ProjPaintState {
MVert *dm_mvert;
MFace *dm_mface;
- MTFace *dm_mtface;
+ MTFace **dm_mtface;
MTFace *dm_mtface_clone; /* other UV map, use for cloning between layers */
MTFace *dm_mtface_stencil;
@@ -360,12 +360,25 @@ static Image *project_paint_face_image(const ProjPaintState *ps, int face_index)
else {
MFace *mf = ps->dm_mface + face_index;
Material *ma = give_current_material(ps->ob, mf->mat_nr + 1);
- ima = ma->texpaintima;
+ ima = ma->texpaintslot->tex->ima;
}
return ima;
}
+static MTex *project_paint_face_paint_slot(const ProjPaintState *ps, int face_index)
+{
+ if (ps->do_new_shading_nodes) { /* cached BKE_scene_use_new_shading_nodes result */
+ return NULL;
+ }
+ else {
+ MFace *mf = ps->dm_mface + face_index;
+ Material *ma = give_current_material(ps->ob, mf->mat_nr + 1);
+ return ma->texpaintslot;
+ }
+}
+
+
static Image *project_paint_mtface_image(const ProjPaintState *ps, MTFace *dm_mtface, int face_index)
{
Image *ima;
@@ -569,7 +582,7 @@ static bool project_paint_PickColor(const ProjPaintState *ps, const float pt[2],
if (face_index == -1)
return 0;
- tf = ps->dm_mtface + face_index;
+ tf = *(ps->dm_mtface + face_index);
if (side == 0) {
interp_v2_v2v2v2(uv, tf->uv[0], tf->uv[1], tf->uv[2], w);
@@ -918,7 +931,7 @@ static bool check_seam(const ProjPaintState *ps,
MFace *mf;
MTFace *tf;
const MFace *orig_mf = ps->dm_mface + orig_face;
- const MTFace *orig_tf = ps->dm_mtface + orig_face;
+ const MTFace *orig_tf = ps->dm_mtface[orig_face];
/* vert indices from face vert order indices */
i1 = (*(&orig_mf->v1 + orig_i1_fidx));
@@ -946,7 +959,7 @@ static bool check_seam(const ProjPaintState *ps,
BLI_assert(i1_fidx != -1);
/* This IS an adjacent face!, now lets check if the UVs are ok */
- tf = ps->dm_mtface + face_index;
+ tf = ps->dm_mtface[face_index];
/* set up the other face */
*other_face = face_index;
@@ -2305,7 +2318,7 @@ static void project_paint_face_init(const ProjPaintState *ps, const int thread_i
ps->projImages + image_index
};
const MFace *mf = ps->dm_mface + face_index;
- const MTFace *tf = ps->dm_mtface + face_index;
+ const MTFace *tf = ps->dm_mtface[face_index];
/* UV/pixel seeking data */
int x; /* Image X-Pixel */
@@ -2947,11 +2960,13 @@ static void project_paint_begin(ProjPaintState *ps)
ProjPaintImage *projIma;
Image *tpage_last = NULL, *tpage;
+ MTex *slot_last = NULL, *slot;
/* Face vars */
MPoly *mpoly_orig;
MFace *mf;
- MTFace *tf;
+ MTFace **tf;
+ MTFace *tf_base;
int a, i; /* generic looping vars */
int image_index = -1, face_index;
@@ -3008,7 +3023,7 @@ static void project_paint_begin(ProjPaintState *ps)
ps->dm_mvert = ps->dm->getVertArray(ps->dm);
ps->dm_mface = ps->dm->getTessFaceArray(ps->dm);
- ps->dm_mtface = ps->dm->getTessFaceDataArray(ps->dm, CD_MTFACE);
+ ps->dm_mtface = MEM_mallocN(ps->dm->getNumTessFaces(ps->dm) * sizeof (MTFace *), "proj_paint_mtfaces");
ps->dm_totvert = ps->dm->getNumVerts(ps->dm);
ps->dm_totface = ps->dm->getNumTessFaces(ps->dm);
@@ -3038,7 +3053,7 @@ static void project_paint_begin(ProjPaintState *ps)
if (layer_num != -1)
ps->dm_mtface_clone = CustomData_get_layer_n(&ps->dm->faceData, CD_MTFACE, layer_num);
- if (ps->dm_mtface_clone == NULL || ps->dm_mtface_clone == ps->dm_mtface) {
+ if (ps->dm_mtface_clone == NULL) {
ps->do_layer_clone = false;
ps->dm_mtface_clone = NULL;
}
@@ -3050,7 +3065,7 @@ static void project_paint_begin(ProjPaintState *ps)
if (layer_num != -1)
ps->dm_mtface_stencil = CustomData_get_layer_n(&ps->dm->faceData, CD_MTFACE, layer_num);
- if (ps->dm_mtface_stencil == NULL || ps->dm_mtface_stencil == ps->dm_mtface) {
+ if (ps->dm_mtface_stencil == NULL) {
ps->do_layer_stencil = false;
ps->dm_mtface_stencil = NULL;
}
@@ -3328,7 +3343,25 @@ static void project_paint_begin(ProjPaintState *ps)
is_face_sel = true;
}
- if (is_face_sel && (tpage = project_paint_face_image(ps, face_index))) {
+ slot = project_paint_face_paint_slot(ps, face_index);
+ if (slot) {
+ if (slot != slot_last) {
+ if (slot->uvname[0])
+ tf_base = CustomData_get_layer_named(&ps->dm->faceData, CD_MTFACE, slot->uvname);
+ else
+ tf_base = CustomData_get_layer(&ps->dm->faceData, CD_MTFACE);
+ *tf = tf_base + face_index;
+ }
+ else {
+ *tf = tf_base + face_index;
+ }
+
+ /* tfbase here should be non-null! */
+ if (ps->dm_mtface_stencil == tf_base || ps->dm_mtface_clone == tf_base)
+ continue;
+ }
+
+ if (is_face_sel && ((slot && (tpage = slot->tex->ima)) || (tpage = project_paint_face_image(ps, face_index)))) {
float *v1coSS, *v2coSS, *v3coSS, *v4coSS = NULL;
v1coSS = ps->screenCoords[mf->v1];
@@ -3478,6 +3511,7 @@ static void project_paint_end(ProjPaintState *ps)
MEM_freeN(ps->bucketRect);
MEM_freeN(ps->bucketFaces);
MEM_freeN(ps->bucketFlags);
+ MEM_freeN(ps->dm_mtface);
#ifndef PROJ_DEBUG_NOSEAMBLEED
if (ps->seam_bleed_px > 0.0f) {
diff --git a/source/blender/editors/sculpt_paint/paint_utils.c b/source/blender/editors/sculpt_paint/paint_utils.c
index 8d5d443..c78263e 100644
--- a/source/blender/editors/sculpt_paint/paint_utils.c
+++ b/source/blender/editors/sculpt_paint/paint_utils.c
@@ -365,7 +365,7 @@ static Image *imapaint_face_image(DerivedMesh *dm, Scene *scene, Object *ob, int
else {
MFace *mf = dm_mface + face_index;
Material *ma = give_current_material(ob, mf->mat_nr + 1);
- ima = ma->texpaintima;
+ ima = ma->texpaintslot->tex->ima;
}
return ima;
diff --git a/source/blender/editors/space_view3d/drawmesh.c b/source/blender/editors/space_view3d/drawmesh.c
index 2550bc5..260b571 100644
--- a/source/blender/editors/space_view3d/drawmesh.c
+++ b/source/blender/editors/space_view3d/drawmesh.c
@@ -274,7 +274,7 @@ static bool set_draw_settings_cached(int clearcache, MTFace *texface, Material *
alphablend = GPU_BLEND_ALPHA;
}
else if (texpaint && ma) {
- ima = ma->texpaintima;
+ ima = ma->texpaintslot->tex->ima;
}
else
textured = 0;
@@ -295,7 +295,7 @@ static bool set_draw_settings_cached(int clearcache, MTFace *texface, Material *
if (textured) {
if (texpaint) {
c_badtex = false;
- if(GPU_verify_image(ima, NULL, 0, 1, 0, false)) {
+ if (GPU_verify_image(ima, NULL, 0, 1, 0, false)) {
glEnable(GL_TEXTURE_2D);
}
else {
diff --git a/source/blender/makesdna/DNA_material_types.h b/source/blender/makesdna/DNA_material_types.h
index b9c262a..9612cf3 100644
--- a/source/blender/makesdna/DNA_material_types.h
+++ b/source/blender/makesdna/DNA_material_types.h
@@ -136,9 +136,9 @@ typedef struct Material {
char mapflag;
/* texture painting */
- char texactpaint;
- struct Image *texpaintima; /* cached image for painting. Make sure to recalculate before use
- * with refresh_texpaint_image_cache */
+ char paint_active_slot;
+ struct MTex *texpaintslot; /* cached slot for painting. Make sure to recalculate before use
+ * with refresh_texpaint_image_slot */
/* shaders */
short diff_shader, spec_shader;
diff --git a/source/blender/makesrna/intern/rna_material.c b/source/blender/makesrna/intern/rna_material.c
index 457a58d..85c4dd1 100644
--- a/source/blender/makesrna/intern/rna_material.c
+++ b/source/blender/makesrna/intern/rna_material.c
@@ -194,7 +194,7 @@ static void rna_Material_active_paint_texture_index_update(Main *bmain, Scene *s
for (sl = sa->spacedata.first; sl; sl = sl->next) {
if (sl->spacetype == SPACE_IMAGE) {
SpaceImage *sima = (SpaceImage *)sl;
- ED_space_image_set(sima, scene, scene->obedit, ma->texpainti
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list