[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51737] trunk/blender/source/blender: Complete fix for [#33002] Wrong vertex color.
Bastien Montagne
montagne29 at wanadoo.fr
Tue Oct 30 12:30:23 CET 2012
Fixed in r51759. Thanks for the report! :)
On 30/10/2012 08:30, Sergey Sharybin wrote:
> Hi,
>
> This commit ended up with such an artifacts for textured cube:
> http://www.pasteall.org/pic/show.php?id=39736
>
> Test file: http://www.pasteall.org/blend/17180
>
> On Mon, Oct 29, 2012 at 10:26 PM, Bastien Montagne<montagne29 at wanadoo.fr>wrote:
>
>> Revision: 51737
>>
>> http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51737
>> Author: mont29
>> Date: 2012-10-29 16:26:18 +0000 (Mon, 29 Oct 2012)
>> Log Message:
>> -----------
>> Complete fix for [#33002] Wrong vertex color.
>>
>> Appart from the color glitch, there was several problems with vpaint:
>> * "fast_update" mode was never on, because of wrong testing code;
>> * drawing refresh during stroke in "fast_update" (i.e. no dm rebuild) mode
>> was broken in VBO mode, because updated (tess data) mcol wasn't moved to
>> colors GPUBuffer.
>>
>> Solved the later point by adding a new DM_DIRTY_MCOL_UPDATE_DRAW flag to
>> DerivedMesh dirty var, which is set each time vpaint stroke directly update
>> me->mcol, and forces GPU_color_setup() to refresh the gpu's colors buffer.
>>
>> Also got rid of the uggly GPU_color3_upload(), which basically did the
>> same thing, but with an additional intermediate buffer?\194?\160!
>>
>> Modified Paths:
>> --------------
>> trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h
>> trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
>> trunk/blender/source/blender/editors/sculpt_paint/paint_vertex.c
>> trunk/blender/source/blender/gpu/GPU_buffers.h
>> trunk/blender/source/blender/gpu/intern/gpu_buffers.c
>>
>> Modified: trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h
>> ===================================================================
>> --- trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h 2012-10-29
>> 16:07:16 UTC (rev 51736)
>> +++ trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h 2012-10-29
>> 16:26:18 UTC (rev 51737)
>> @@ -148,6 +148,11 @@
>> typedef enum DMDirtyFlag {
>> /* dm has valid tessellated faces, but tessellated CDDATA need to
>> be updated. */
>> DM_DIRTY_TESS_CDLAYERS = 1<< 0,
>> + /* One of the MCOL layers have been updated, force updating of
>> GPUDrawObject's colors buffer.
>> + * This is necessary with modern, VBO draw code, as e.g. in vpaint
>> mode me->mcol may be updated
>> + * without actually rebuilding dm (hence by defautl keeping same
>> GPUDrawObject, and same colors
>> + * buffer, which prevents update during a stroke!). */
>> + DM_DIRTY_MCOL_UPDATE_DRAW = 1<< 1,
>> } DMDirtyFlag;
>>
>> typedef struct DerivedMesh DerivedMesh;
>>
>> Modified: trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
>> ===================================================================
>> --- trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
>> 2012-10-29 16:07:16 UTC (rev 51736)
>> +++ trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
>> 2012-10-29 16:26:18 UTC (rev 51737)
>> @@ -617,7 +617,7 @@
>> MCol *realcol = dm->getTessFaceDataArray(dm, CD_TEXTURE_MCOL);
>> float *nors = dm->getTessFaceDataArray(dm, CD_NORMAL);
>> MTFace *tf = DM_get_tessface_data_layer(dm, CD_MTFACE);
>> - int i, j, orig, *index = DM_get_tessface_data_layer(dm,
>> CD_ORIGINDEX);
>> + int i, orig, *index = DM_get_tessface_data_layer(dm, CD_ORIGINDEX);
>> int startFace = 0 /*, lastFlag = 0xdeadbeef */ /* UNUSED */;
>> MCol *mcol = dm->getTessFaceDataArray(dm, CD_PREVIEW_MCOL);
>> if (!mcol)
>> @@ -717,23 +717,6 @@
>>
>> if (col != 0)
>> #endif
>> - {
>> - unsigned char *colors =
>> MEM_mallocN(dm->getNumTessFaces(dm) * 4 * 3 * sizeof(unsigned char),
>> "cdDM_drawFacesTex_common");
>> - for (i = 0; i< dm->getNumTessFaces(dm);
>> i++) {
>> - for (j = 0; j< 4; j++) {
>> - /* bgr -> rgb is
>> intentional (and stupid), but how its stored internally */
>> - colors[i * 12 + j * 3] =
>> col[i * 4 + j].b;
>> - colors[i * 12 + j * 3 + 1]
>> = col[i * 4 + j].g;
>> - colors[i * 12 + j * 3 + 2]
>> = col[i * 4 + j].r;
>> - }
>> - }
>> - GPU_color3_upload(dm, colors);
>> - MEM_freeN(colors);
>> - if (realcol)
>> - dm->drawObject->colType =
>> CD_TEXTURE_MCOL;
>> - else if (mcol)
>> - dm->drawObject->colType = CD_MCOL;
>> - }
>> GPU_color_setup(dm);
>> }
>>
>> @@ -908,8 +891,9 @@
>> int prevstart = 0;
>> GPU_vertex_setup(dm);
>> GPU_normal_setup(dm);
>> - if (useColors&& mc)
>> + if (useColors&& mc) {
>> GPU_color_setup(dm);
>> + }
>> if (!GPU_buffer_legacy(dm)) {
>> int tottri = dm->drawObject->tot_triangle_point /
>> 3;
>> glShadeModel(GL_SMOOTH);
>>
>> Modified: trunk/blender/source/blender/editors/sculpt_paint/paint_vertex.c
>> ===================================================================
>> --- trunk/blender/source/blender/editors/sculpt_paint/paint_vertex.c
>> 2012-10-29 16:07:16 UTC (rev 51736)
>> +++ trunk/blender/source/blender/editors/sculpt_paint/paint_vertex.c
>> 2012-10-29 16:26:18 UTC (rev 51737)
>> @@ -79,6 +79,7 @@
>> #include "WM_api.h"
>> #include "WM_types.h"
>>
>> +#include "GPU_buffers.h"
>>
>> #include "ED_armature.h"
>> #include "ED_mesh.h"
>> @@ -106,18 +107,40 @@
>> /* if the polygons from the mesh and the 'derivedFinal' match
>> * we can assume that no modifiers are applied and that its worth adding
>> tessellated faces
>> * so 'vertex_paint_use_fast_update_check()' returns TRUE */
>> -static int vertex_paint_use_tessface_check(Object *ob)
>> +static int vertex_paint_use_tessface_check(Object *ob, Mesh *me)
>> {
>> DerivedMesh *dm = ob->derivedFinal;
>>
>> - if (dm) {
>> - Mesh *me = BKE_mesh_from_object(ob);
>> - return (me->mpoly == CustomData_get_layer(&dm->faceData,
>> CD_MPOLY));
>> + if (me&& dm) {
>> + return (me->mpoly == CustomData_get_layer(&dm->polyData,
>> CD_MPOLY));
>> }
>>
>> return FALSE;
>> }
>>
>> +static void update_tessface_data(Object *ob, Mesh *me)
>> +{
>> + if (vertex_paint_use_tessface_check(ob, me)) {
>> + /* assume if these exist, that they are up to date& valid
>> */
>> + if (!me->mcol || !me->mface) {
>> + /* should always be true */
>> + /* XXX Why this clearing? tessface_calc will reset
>> it anyway! */
>> +/* if (me->mcol) {*/
>> +/* memset(me->mcol, 255, 4 * sizeof(MCol) *
>> me->totface);*/
>> +/* }*/
>> +
>> + /* create tessfaces because they will be used for
>> drawing& fast updates */
>> + BKE_mesh_tessface_calc(me); /* does own call to
>> update pointers */
>> + }
>> + }
>> + else {
>> + if (me->totface) {
>> + /* this wont be used, theres no need to keep it */
>> + BKE_mesh_tessface_clear(me);
>> + }
>> + }
>> +
>> +}
>> /* polling - retrieve whether cursor should be set or operator should be
>> done */
>>
>> /* Returns true if vertex paint mode is active */
>> @@ -331,25 +354,8 @@
>> mesh_update_customdata_pointers(me, TRUE);
>> }
>>
>> - if (vertex_paint_use_tessface_check(ob)) {
>> - /* assume if these exist, that they are up to date& valid
>> */
>> - if (!me->mcol || !me->mface) {
>> - /* should always be true */
>> - if (me->mcol) {
>> - memset(me->mcol, 255, 4 * sizeof(MCol) *
>> me->totface);
>> - }
>> + update_tessface_data(ob, me);
>>
>> - /* create tessfaces because they will be used for
>> drawing& fast updates */
>> - BKE_mesh_tessface_calc(me); /* does own call to
>> update pointers */
>> - }
>> - }
>> - else {
>> - if (me->totface) {
>> - /* this wont be used, theres no need to keep it */
>> - BKE_mesh_tessface_clear(me);
>> - }
>> - }
>> -
>> //if (shade)
>> // shadeMeshMCol(scene, ob, me);
>> //else
>> @@ -2600,7 +2606,12 @@
>> make_vertexcol(ob);
>> if (me->mloopcol == NULL)
>> return OPERATOR_CANCELLED;
>> -
>> +
>> + /* Update tessface data if needed
>> + * Added here too because e.g. switching to/from edit mode would
>> remove tessface data,
>> + * yet "fast_update" could still be used! */
>> + update_tessface_data(ob, me);
>> +
>> /* make mode data storage */
>> vpd = MEM_callocN(sizeof(struct VPaintData), "VPaintData");
>> paint_stroke_set_mode_data(stroke, vpd);
>> @@ -2616,9 +2627,11 @@
>> if (vertex_paint_use_fast_update_check(ob)) {
>> vpaint_build_poly_facemap(vpd, me);
>> vpd->use_fast_update = TRUE;
>> +/* printf("Fast update!\n");*/
>> }
>> else {
>> vpd->use_fast_update = FALSE;
>> +/* printf("No fast update!\n");*/
>> }
>>
>> /* for filtering */
>> @@ -2699,11 +2712,18 @@
>> ml = me->mloop + mpoly->loopstart;
>> mlc = me->mloopcol + mpoly->loopstart;
>> for (j = 0; j< mpoly->totloop; j++, ml++, mlc++) {
>> - if (ml->v == mf->v1) {
>> MESH_MLOOPCOL_TO_MCOL(mlc, mc + 0); }
>> - else if (ml->v == mf->v2) {
>> MESH_MLOOPCOL_TO_MCOL(mlc, mc + 1); }
>> - else if (ml->v == mf->v3) {
>> MESH_MLOOPCOL_TO_MCOL(mlc, mc + 2); }
>> - else if (mf->v4&& ml->v == mf->v4) {
>> MESH_MLOOPCOL_TO_MCOL(mlc, mc + 3); }
>> -
>> + if (ml->v == mf->v1) {
>> + MESH_MLOOPCOL_TO_MCOL(mlc, mc + 0);
>> + }
>> + else if (ml->v == mf->v2) {
>> + MESH_MLOOPCOL_TO_MCOL(mlc, mc + 1);
>> + }
>> + else if (ml->v == mf->v3) {
>> + MESH_MLOOPCOL_TO_MCOL(mlc, mc + 2);
>> + }
>> + else if (mf->v4&& ml->v == mf->v4) {
>> + MESH_MLOOPCOL_TO_MCOL(mlc, mc + 3);
>> + }
>> }
>> }
>> }
>> @@ -2784,6 +2804,10 @@
>> * avoid this if we can! */
>> DAG_id_tag_update(ob->data, 0);
>> }
>> + else if (!GPU_buffer_legacy(ob->derivedFinal)) {
>> + /* If using new VBO drawing, mark mcol as dirty to force
>> colors gpu buffer refresh! */
>> + ob->derivedFinal->dirty |= DM_DIRTY_MCOL_UPDATE_DRAW;
>> + }
>> }
>>
>> static void vpaint_stroke_done(const bContext *C, struct PaintStroke
>> *stroke)
>>
>> Modified: trunk/blender/source/blender/gpu/GPU_buffers.h
>> ===================================================================
>> --- trunk/blender/source/blender/gpu/GPU_buffers.h 2012-10-29
>> 16:07:16 UTC (rev 51736)
>> +++ trunk/blender/source/blender/gpu/GPU_buffers.h 2012-10-29
>> 16:26:18 UTC (rev 51737)
>> @@ -141,8 +141,6 @@
>> void *GPU_buffer_lock_stream( GPUBuffer *buffer );
>> void GPU_buffer_unlock( GPUBuffer *buffer );
>>
>> -/* upload three unsigned chars, representing RGB colors, for each vertex.
>> Resets dm->drawObject->colType to -1 */
>> -void GPU_color3_upload(struct DerivedMesh *dm, unsigned char *data );
>> /* switch color rendering on=1/off=0 */
>> void GPU_color_switch( int mode );
>>
>>
>> Modified: trunk/blender/source/blender/gpu/intern/gpu_buffers.c
>> ===================================================================
>> --- trunk/blender/source/blender/gpu/intern/gpu_buffers.c 2012-10-29
>> 16:07:16 UTC (rev 51736)
>> +++ trunk/blender/source/blender/gpu/intern/gpu_buffers.c 2012-10-29
>> 16:26:18 UTC (rev 51737)
>> @@ -708,34 +708,6 @@
>> }
>> }
>>
>> -
>> -static void GPU_buffer_copy_color3(DerivedMesh *dm, float *varray_, int
>> *index, int *mat_orig_to_new, void *user)
>> -{
>> - int i, totface;
>> - char *varray = (char *)varray_;
>> - char *mcol = (char *)user;
>> - MFace *f = dm->getTessFaceArray(dm);
>> -
>> - totface = dm->getNumTessFaces(dm);
>> - for (i = 0; i< totface; i++, f++) {
>> - int start = index[mat_orig_to_new[f->mat_nr]];
>> -
>> - /* v1 v2 v3 */
>> - copy_v3_v3_char(&varray[start],&mcol[i * 12]);
>> - copy_v3_v3_char(&varray[start + 3],&mcol[i * 12 + 3]);
>> - copy_v3_v3_char(&varray[start + 6],&mcol[i * 12 + 6]);
>> - index[mat_orig_to_new[f->mat_nr]] += 9;
>> -
>> - if (f->v4) {
>> - /* v3 v4 v1 */
>> - copy_v3_v3_char(&varray[start + 9],&mcol[i * 12 +
>> 6]);
>> - copy_v3_v3_char(&varray[start + 12],&mcol[i * 12
>> + 9]);
>> - copy_v3_v3_char(&varray[start + 15],&mcol[i *
>> 12]);
>> - index[mat_orig_to_new[f->mat_nr]] += 9;
>> - }
>> - }
>> -}
>> -
>> static void copy_mcol_uc3(unsigned char *v, unsigned char *col)
>> {
>> v[0] = col[3];
>> @@ -944,7 +916,7 @@
>> static GPUBuffer *gpu_buffer_setup_common(DerivedMesh *dm, GPUBufferType
>> type)
>> {
>> GPUBuffer **buf;
>> -
>> +
>> if (!dm->drawObject)
>> dm->drawObject = GPU_drawobject_new(dm);
>>
>> @@ -1008,6 +980,14 @@
>>
>> void GPU_color_setup(DerivedMesh *dm)
>> {
>> + /* In paint mode, dm may stay the same during stroke, however we
>> still want to update colors! */
>> + if ((dm->dirty& DM_DIRTY_MCOL_UPDATE_DRAW)&& dm->drawObject) {
>> + GPUBuffer **buf =
>> gpu_drawobject_buffer_from_type(dm->drawObject, GPU_BUFFER_COLOR);
>> + GPU_buffer_free(*buf);
>> + *buf = NULL;
>> + }
>> + dm->dirty&= ~DM_DIRTY_MCOL_UPDATE_DRAW;
>> +
>> if (!gpu_buffer_setup_common(dm, GPU_BUFFER_COLOR))
>> return;
>>
>> @@ -1168,20 +1148,6 @@
>> glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
>> }
>>
>> -/* confusion: code in cdderivedmesh calls both GPU_color_setup and
>> - * GPU_color3_upload; both of these set the `colors' buffer, so seems
>> - * like it will just needlessly overwrite? --nicholas */
>> -void GPU_color3_upload(DerivedMesh *dm, unsigned char *data)
>> -{
>> - if (dm->drawObject == 0)
>> - dm->drawObject = GPU_drawobject_new(dm);
>>
>> @@ Diff output truncated at 10240 characters. @@
>> _______________________________________________
>> Bf-blender-cvs mailing list
>> Bf-blender-cvs at blender.org
>> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>>
>
>
More information about the Bf-committers
mailing list