[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20526] branches/soc-2009-yukishiro/source /blender: reduce material colour computation.
Jingyuan Huang
jingyuan.huang at gmail.com
Sun May 31 04:56:27 CEST 2009
Revision: 20526
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20526
Author: yukishiro
Date: 2009-05-31 04:56:25 +0200 (Sun, 31 May 2009)
Log Message:
-----------
reduce material colour computation. still not happy with how it's done
Modified Paths:
--------------
branches/soc-2009-yukishiro/source/blender/blenkernel/BKE_DerivedMesh.h
branches/soc-2009-yukishiro/source/blender/blenkernel/intern/DerivedMesh.c
branches/soc-2009-yukishiro/source/blender/editors/space_view3d/drawobject.c
branches/soc-2009-yukishiro/source/blender/editors/space_view3d/space_view3d.c
Modified: branches/soc-2009-yukishiro/source/blender/blenkernel/BKE_DerivedMesh.h
===================================================================
--- branches/soc-2009-yukishiro/source/blender/blenkernel/BKE_DerivedMesh.h 2009-05-31 02:35:58 UTC (rev 20525)
+++ branches/soc-2009-yukishiro/source/blender/blenkernel/BKE_DerivedMesh.h 2009-05-31 02:56:25 UTC (rev 20526)
@@ -461,6 +461,8 @@
void weight_to_rgb(float input, float *fr, float *fg, float *fb);
+void calc_sh_color(struct Scene *scene, struct Object *ob, DerivedMesh *dm, unsigned char *shcol);
+
/* convert layers requested by a GLSL material to actually available layers in
* the DerivedMesh, with both a pointer for arrays and an offset for editmesh */
typedef struct DMVertexAttribs {
Modified: branches/soc-2009-yukishiro/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/soc-2009-yukishiro/source/blender/blenkernel/intern/DerivedMesh.c 2009-05-31 02:35:58 UTC (rev 20525)
+++ branches/soc-2009-yukishiro/source/blender/blenkernel/intern/DerivedMesh.c 2009-05-31 02:56:25 UTC (rev 20526)
@@ -39,6 +39,8 @@
#include "DNA_effect_types.h"
#include "DNA_key_types.h"
+#include "DNA_lightenv_types.h"
+#include "DNA_material_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_modifier_types.h"
@@ -68,6 +70,7 @@
#include "BKE_fluidsim.h"
#include "BKE_global.h"
#include "BKE_key.h"
+#include "BKE_lightenv.h"
#include "BKE_material.h"
#include "BKE_modifier.h"
#include "BKE_mesh.h"
@@ -1582,13 +1585,66 @@
CustomData_add_layer(&dm->faceData, CD_WEIGHT_MCOL, CD_ASSIGN, wtcol, dm->numFaceData);
}
+static void calc_sh_vert_color(Object *ob, int index, MShCoeffs *mco, float (*lco)[3], unsigned char *col)
+{
+ Mesh *me = ob->data;
+ Material * mat;
+ float color[3];
+ float brightness[3];
+ int k;
+ // TODO: get face material colour
+ if (me->mat) mat = me->mat[0];
+
+ if (mat != NULL) {
+ color[0] = mat->r;
+ color[1] = mat->g;
+ color[2] = mat->b;
+ } else {
+ color[0] = color[1] = color[2] = 0.8;
+ }
+
+ brightness[0] = brightness[1] = brightness[2] = 0;
+ for (k = 0; k < 9; k++) {
+ brightness[0] += mco[index].val[k] * lco[k][0];
+ brightness[1] += mco[index].val[k] * lco[k][1];
+ brightness[2] += mco[index].val[k] * lco[k][2];
+ }
+ color[0] *= brightness[0];
+ color[1] *= brightness[1];
+ color[2] *= brightness[2];
+
+ col[0] = FTOCHAR(color[0]);
+ col[1] = FTOCHAR(color[1]);
+ col[2] = FTOCHAR(color[2]);
+ col[3] = 255;
+}
+
+void calc_sh_color(Scene *scene, Object *ob, DerivedMesh *dm, unsigned char *shcol)
+{
+ int i, totface= dm->getNumFaces(dm);
+ MFace *mf= dm->getFaceArray(dm);
+ Mesh *me= get_mesh(ob);
+ MShCoeffs *mco= CustomData_get_layer(&me->vdata, CD_MSHCOEFFS);
+ LightEnv *env= get_scene_lightenv(scene);
+
+ for (i=0; i<totface; i++, mf++) {
+ calc_sh_vert_color(ob, mf->v1, mco, env->shcoeffs, &shcol[(i*4 + 0) * 4]);
+ calc_sh_vert_color(ob, mf->v1, mco, env->shcoeffs, &shcol[(i*4 + 1) * 4]);
+ calc_sh_vert_color(ob, mf->v1, mco, env->shcoeffs, &shcol[(i*4 + 2) * 4]);
+ if (mf->v4)
+ calc_sh_vert_color(ob, mf->v1, mco, env->shcoeffs, &shcol[(i*4 + 3) * 4]);
+ }
+}
+
+
static void add_sh_mcol_dm(Scene *scene, Object *ob, DerivedMesh *dm)
{
unsigned char *shcol;
- int totface = dm->getNumFaces(dm);
+ int totface= dm->getNumFaces(dm);
shcol = MEM_callocN (sizeof (unsigned char) * totface * 4 * 4, "sh color");
+ calc_sh_color(scene, ob, dm, shcol);
CustomData_add_layer(&dm->faceData, CD_SH_MCOL, CD_ASSIGN, shcol, dm->numFaceData);
}
Modified: branches/soc-2009-yukishiro/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- branches/soc-2009-yukishiro/source/blender/editors/space_view3d/drawobject.c 2009-05-31 02:35:58 UTC (rev 20525)
+++ branches/soc-2009-yukishiro/source/blender/editors/space_view3d/drawobject.c 2009-05-31 02:56:25 UTC (rev 20526)
@@ -46,7 +46,6 @@
#include "DNA_effect_types.h"
#include "DNA_lamp_types.h"
#include "DNA_lattice_types.h"
-#include "DNA_lightenv_types.h"
#include "DNA_material_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
@@ -80,7 +79,6 @@
#include "BKE_global.h"
#include "BKE_image.h"
#include "BKE_key.h"
-#include "BKE_lightenv.h"
#include "BKE_lattice.h"
#include "BKE_mesh.h"
#include "BKE_material.h"
@@ -2279,43 +2277,7 @@
return 1;
}
-// TODO: consider move the routine somewhere else
-static void calc_sh_vert_color(Object *ob, int vert, MShCoeffs *mco, float (*lco)[3], unsigned char *col)
-{
- Mesh *me = ob->data;
- MVert v = me->mvert[vert];
- Material * mat;
- float color[3];
- float brightness[3];
- int k;
- // TODO: get vertex material colour
- if (me->mat) mat = me->mat[0];
-
- if (mat != NULL) {
- color[0] = mat->r;
- color[1] = mat->g;
- color[2] = mat->b;
- } else {
- color[0] = color[1] = color[2] = 0.8;
- }
-
- brightness[0] = brightness[1] = brightness[2] = 0;
- for (k = 0; k < 9; k++) {
- brightness[0] += mco[vert].val[k] * lco[k][0];
- brightness[1] += mco[vert].val[k] * lco[k][1];
- brightness[2] += mco[vert].val[k] * lco[k][2];
- }
- color[0] *= brightness[0];
- color[1] *= brightness[1];
- color[2] *= brightness[2];
-
- col[0] = FTOCHAR(color[0]);
- col[1] = FTOCHAR(color[1]);
- col[2] = FTOCHAR(color[2]);
- col[3] = 255;
-}
-
static void draw_mesh_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, int dt, int flag)
{
Object *ob= base->object;
@@ -2443,28 +2405,16 @@
dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, NULL, 0);
}
else if(G.f & G_LIGHTPAINT) {
- unsigned char *shcol;
- LightEnv *env;
- MShCoeffs *mco;
- MFace *mf = dm->getFaceArray(dm);//= me->mface;
- int num_faces, i;
glDisable(GL_LIGHTING);
glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);
glShadeModel(GL_SMOOTH);
- shcol = DM_get_face_data_layer(dm, CD_SH_MCOL);
- mco = CustomData_get_layer(&me->vdata, CD_MSHCOEFFS);
- env = get_scene_lightenv(scene);
-
- // TODO: calculation shouldn't be done every update
- for (i=0; i<totface; i++, mf++) {
- calc_sh_vert_color(ob, mf->v1, mco, env->shcoeffs, &shcol[(i*4 + 0) * 4]);
- calc_sh_vert_color(ob, mf->v1, mco, env->shcoeffs, &shcol[(i*4 + 1) * 4]);
- calc_sh_vert_color(ob, mf->v1, mco, env->shcoeffs, &shcol[(i*4 + 2) * 4]);
- if (mf->v4)
- calc_sh_vert_color(ob, mf->v1, mco, env->shcoeffs, &shcol[(i*4 + 3) * 4]);
+ unsigned char *shcol= DM_get_face_data_layer(dm, CD_SH_MCOL);
+ if (rv3d->pad3 == 1) {
+ calc_sh_color(scene, ob, dm, shcol);
+ rv3d->pad3 = 0;
}
dm->drawFacesColored(dm, me->flag, shcol, NULL);
Modified: branches/soc-2009-yukishiro/source/blender/editors/space_view3d/space_view3d.c
===================================================================
--- branches/soc-2009-yukishiro/source/blender/editors/space_view3d/space_view3d.c 2009-05-31 02:35:58 UTC (rev 20525)
+++ branches/soc-2009-yukishiro/source/blender/editors/space_view3d/space_view3d.c 2009-05-31 02:56:25 UTC (rev 20526)
@@ -368,6 +368,7 @@
static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn)
{
+ RegionView3D *rv3d;
/* context changes */
switch(wmn->category) {
case NC_SCENE:
@@ -405,6 +406,8 @@
case NC_MATERIAL:
switch(wmn->data) {
case ND_SHADING_DRAW:
+ rv3d = ar->regiondata;
+ rv3d->pad3 = 1;
ED_region_tag_redraw(ar);
break;
}
More information about the Bf-blender-cvs
mailing list