Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2012-02-08 13:07:24 +0400
committerCampbell Barton <ideasman42@gmail.com>2012-02-08 13:07:24 +0400
commita5eb673b4dd1a8cb0946b9e999efbc9cbc7a00ee (patch)
tree98b8ff52b8a05d3b0f962be6f9de8af856ded8ee /source/blender/editors/space_view3d/drawmesh.c
parent76ccd3d5ed19b3955b4f02651a5f3a65fc43d1e3 (diff)
use MPoly's rather then MFaces (since these don't necessarily exist) for drawing game engine bitmap font text.
minor edits to draw_tface_mapped__set_draw() to make it more efficient.
Diffstat (limited to 'source/blender/editors/space_view3d/drawmesh.c')
-rw-r--r--source/blender/editors/space_view3d/drawmesh.c113
1 files changed, 81 insertions, 32 deletions
diff --git a/source/blender/editors/space_view3d/drawmesh.c b/source/blender/editors/space_view3d/drawmesh.c
index edde4f3d7c1..6f38cfc78ef 100644
--- a/source/blender/editors/space_view3d/drawmesh.c
+++ b/source/blender/editors/space_view3d/drawmesh.c
@@ -520,22 +520,27 @@ static void add_tface_color_layer(DerivedMesh *dm)
static int draw_tface_mapped__set_draw(void *userData, int index)
{
- Mesh *me = (Mesh*)userData;
- MTexPoly *tpoly = (me->mtpoly)? &me->mtpoly[index]: NULL;
- MPoly *mpoly = (me->mpoly)? &me->mpoly[index]: NULL;
- MTFace mtf;
- int matnr = me->mpoly[index].mat_nr;
+ Mesh *me = (Mesh *)userData;
- BLI_assert(index >= 0 && index < me->totpoly);
+ /* array checked for NULL before calling */
+ MPoly *mpoly = &me->mpoly[index];
- if (mpoly && mpoly->flag&ME_HIDE) return 0;
+ BLI_assert(index >= 0 && index < me->totpoly);
- memset(&mtf, 0, sizeof(mtf));
- if (tpoly) {
- ME_MTEXFACE_CPY(&mtf, tpoly);
+ if (mpoly->flag & ME_HIDE) {
+ return 0;
}
+ else {
+ MTexPoly *tpoly = (me->mtpoly) ? &me->mtpoly[index] : NULL;
+ MTFace mtf= {{{0}}};
+ int matnr = mpoly->mat_nr;
- return draw_tface__set_draw(&mtf, (me->mcol != NULL), matnr);
+ if (tpoly) {
+ ME_MTEXFACE_CPY(&mtf, tpoly);
+ }
+
+ return draw_tface__set_draw(&mtf, (me->mloopcol != NULL), matnr);
+ }
}
static int draw_em_tf_mapped__set_draw(void *userData, int index)
@@ -589,15 +594,24 @@ static void draw_mesh_text(Scene *scene, Object *ob, int glsl)
{
Mesh *me = ob->data;
DerivedMesh *ddm;
- MFace *mf, *mface= me->mface;
- MTFace *tface= me->mtface;
- MCol *mcol= me->mcol; /* why does mcol exist? */
+ MPoly *mp, *mface = me->mpoly;
+ MTexPoly *mtpoly = me->mtpoly;
+ MLoopUV *mloopuv = me->mloopuv;
+ MLoopUV *luv;
+ MLoopCol *mloopcol = me->mloopcol; /* why does mcol exist? */
+ MLoopCol *lcol;
+
bProperty *prop = get_ob_property(ob, "Text");
GPUVertexAttribs gattribs;
- int a, totface= me->totface;
+ int a, totpoly = me->totpoly;
+
+ /* fake values to pass to GPU_render_text() */
+ MCol tmp_mcol[4] = {{0}};
+ MCol *tmp_mcol_pt = mloopcol ? tmp_mcol : NULL;
+ MTFace tmp_tf = {{{0}}};
/* don't draw without tfaces */
- if(!tface)
+ if(!mtpoly || !mloopuv)
return;
/* don't draw when editing */
@@ -609,17 +623,23 @@ static void draw_mesh_text(Scene *scene, Object *ob, int glsl)
ddm = mesh_get_derived_deform(scene, ob, CD_MASK_BAREMESH);
- for(a=0, mf=mface; a<totface; a++, tface++, mf++) {
- short matnr= mf->mat_nr;
- int mf_smooth= mf->flag & ME_SMOOTH;
+ for(a=0, mp=mface; a<totpoly ; a++, mtpoly++, mp++) {
+ short matnr= mp->mat_nr;
+ int mf_smooth= mp->flag & ME_SMOOTH;
Material *mat = me->mat[matnr];
int mode= mat->game.flag;
- if (!(mode&GEMAT_INVISIBLE) && (mode&GEMAT_TEXT)) {
+ if (!(mode&GEMAT_INVISIBLE) && (mode&GEMAT_TEXT) && mp->totloop >= 3) {
+ /* get the polygon as a tri/quad */
+ int mp_vi[4];
float v1[3], v2[3], v3[3], v4[3];
char string[MAX_PROPSTRING];
int characters, i, glattrib= -1, badtex= 0;
+
+ /* TEXFACE */
+ ME_MTEXFACE_CPY(&tmp_tf, mtpoly);
+
if(glsl) {
GPU_enable_material(matnr+1, &gattribs);
@@ -631,17 +651,49 @@ static void draw_mesh_text(Scene *scene, Object *ob, int glsl)
}
}
else {
- badtex = set_draw_settings_cached(0, tface, mat, Gtexdraw);
+ badtex = set_draw_settings_cached(0, &tmp_tf, mat, Gtexdraw);
if (badtex) {
- if (mcol) mcol+=4;
continue;
}
}
- ddm->getVertCo(ddm, mf->v1, v1);
- ddm->getVertCo(ddm, mf->v2, v2);
- ddm->getVertCo(ddm, mf->v3, v3);
- if (mf->v4) ddm->getVertCo(ddm, mf->v4, v4);
+ mp_vi[0] = me->mloop[mp->loopstart + 0].v;
+ mp_vi[1] = me->mloop[mp->loopstart + 1].v;
+ mp_vi[2] = me->mloop[mp->loopstart + 2].v;
+ mp_vi[3] = (mp->totloop >= 4) ? me->mloop[mp->loopstart + 3].v : 0;
+
+ /* UV */
+ luv = &mloopuv[mp->loopstart];
+ copy_v2_v2(tmp_tf.uv[0], luv->uv); luv++;
+ copy_v2_v2(tmp_tf.uv[1], luv->uv); luv++;
+ copy_v2_v2(tmp_tf.uv[2], luv->uv); luv++;
+ if (mp->totloop >= 4) {
+ copy_v2_v2(tmp_tf.uv[3], luv->uv);
+ }
+
+ /* COLOR */
+ if (mloopcol) {
+ unsigned int totloop_clamp = MIN2(4, mp->totloop);
+ unsigned int j;
+ lcol = &mloopcol[mp->loopstart];
+
+ for (j = 0; j <= totloop_clamp; j++, lcol++) {
+ tmp_mcol[j].a = lcol->a;
+ tmp_mcol[j].r = lcol->r;
+ tmp_mcol[j].g = lcol->g;
+ tmp_mcol[j].b = lcol->b;
+ }
+ }
+
+ /* LOCATION */
+ ddm->getVertCo(ddm, mp_vi[0], v1);
+ ddm->getVertCo(ddm, mp_vi[1], v2);
+ ddm->getVertCo(ddm, mp_vi[2], v3);;
+ if (mp->totloop >= 4) {
+ ddm->getVertCo(ddm, mp_vi[3], v4);
+ }
+
+
// The BM_FONT handling is in the gpu module, shared with the
// game engine, was duplicated previously
@@ -649,7 +701,7 @@ static void draw_mesh_text(Scene *scene, Object *ob, int glsl)
set_property_valstr(prop, string);
characters = strlen(string);
- if(!BKE_image_get_ibuf(tface->tpage, NULL))
+ if(!BKE_image_get_ibuf(mtpoly->tpage, NULL))
characters = 0;
if (!mf_smooth) {
@@ -660,11 +712,8 @@ static void draw_mesh_text(Scene *scene, Object *ob, int glsl)
glNormal3fv(nor);
}
- GPU_render_text(tface, mode, string, characters,
- (unsigned int*)mcol, v1, v2, v3, (mf->v4? v4: NULL), glattrib);
- }
- if (mcol) {
- mcol+=4;
+ GPU_render_text(&tmp_tf, mode, string, characters,
+ (unsigned int*)tmp_mcol_pt, v1, v2, v3, (mp->totloop >= 4 ? v4: NULL), glattrib);
}
}