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:
Diffstat (limited to 'source/blender/src/drawmesh.c')
-rw-r--r--source/blender/src/drawmesh.c586
1 files changed, 0 insertions, 586 deletions
diff --git a/source/blender/src/drawmesh.c b/source/blender/src/drawmesh.c
deleted file mode 100644
index ba266fa8c29..00000000000
--- a/source/blender/src/drawmesh.c
+++ /dev/null
@@ -1,586 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#include <string.h>
-#include <math.h>
-
-#include "MEM_guardedalloc.h"
-
-#include "BLI_blenlib.h"
-#include "BLI_arithb.h"
-#include "BLI_edgehash.h"
-#include "BLI_editVert.h"
-
-#include "IMB_imbuf.h"
-#include "IMB_imbuf_types.h"
-
-#include "DNA_image_types.h"
-#include "DNA_lamp_types.h"
-#include "DNA_material_types.h"
-#include "DNA_mesh_types.h"
-#include "DNA_meshdata_types.h"
-#include "DNA_object_types.h"
-#include "DNA_property_types.h"
-#include "DNA_scene_types.h"
-#include "DNA_view3d_types.h"
-#include "DNA_userdef_types.h"
-
-#include "BKE_bmfont.h"
-#include "BKE_displist.h"
-#include "BKE_DerivedMesh.h"
-#include "BKE_effect.h"
-#include "BKE_global.h"
-#include "BKE_image.h"
-#include "BKE_main.h"
-#include "BKE_material.h"
-#include "BKE_mesh.h"
-#include "BKE_object.h"
-#include "BKE_property.h"
-#include "BKE_utildefines.h"
-
-#include "BIF_editmesh.h"
-#include "BIF_gl.h"
-#include "BIF_glutil.h"
-#include "BIF_mywindow.h"
-#include "BIF_resources.h"
-
-#include "BDR_editface.h"
-#include "BDR_vpaint.h"
-#include "BDR_drawmesh.h"
-
-#include "BSE_drawview.h"
-
-#include "GPU_extensions.h"
-#include "GPU_draw.h"
-
-#include "blendef.h"
-#include "nla.h"
-
-/***/
-
- /* Flags for marked edges */
-enum {
- eEdge_Visible = (1<<0),
- eEdge_Select = (1<<1),
-};
-
- /* Creates a hash of edges to flags indicating
- * adjacent tface select/active/etc flags.
- */
-static void get_marked_edge_info__orFlags(EdgeHash *eh, int v0, int v1, int flags)
-{
- int *flags_p;
-
- if (!BLI_edgehash_haskey(eh, v0, v1)) {
- BLI_edgehash_insert(eh, v0, v1, 0);
- }
-
- flags_p = (int*) BLI_edgehash_lookup_p(eh, v0, v1);
- *flags_p |= flags;
-}
-
-static EdgeHash *get_tface_mesh_marked_edge_info(Mesh *me)
-{
- EdgeHash *eh = BLI_edgehash_new();
- int i;
- MFace *mf;
- MTFace *tf = NULL;
-
- for (i=0; i<me->totface; i++) {
- mf = &me->mface[i];
- if (me->mtface)
- tf = &me->mtface[i];
-
- if (mf->v3) {
- if (!(mf->flag&ME_HIDE)) {
- unsigned int flags = eEdge_Visible;
- if (mf->flag&ME_FACE_SEL) flags |= eEdge_Select;
-
- get_marked_edge_info__orFlags(eh, mf->v1, mf->v2, flags);
- get_marked_edge_info__orFlags(eh, mf->v2, mf->v3, flags);
- if (mf->v4) {
- get_marked_edge_info__orFlags(eh, mf->v3, mf->v4, flags);
- get_marked_edge_info__orFlags(eh, mf->v4, mf->v1, flags);
- } else {
- get_marked_edge_info__orFlags(eh, mf->v3, mf->v1, flags);
- }
- }
- }
- }
-
- return eh;
-}
-
-
-static int draw_tfaces3D__setHiddenOpts(void *userData, int index)
-{
- struct { Mesh *me; EdgeHash *eh; } *data = userData;
- MEdge *med = &data->me->medge[index];
- uintptr_t flags = (intptr_t) BLI_edgehash_lookup(data->eh, med->v1, med->v2);
-
- if((G.f & G_DRAWSEAMS) && (med->flag&ME_SEAM)) {
- return 0;
- } else if(G.f & G_DRAWEDGES){
- if (G.f&G_HIDDENEDGES) {
- return 1;
- } else {
- return (flags & eEdge_Visible);
- }
- } else {
- return (flags & eEdge_Select);
- }
-}
-static int draw_tfaces3D__setSeamOpts(void *userData, int index)
-{
- struct { Mesh *me; EdgeHash *eh; } *data = userData;
- MEdge *med = &data->me->medge[index];
- uintptr_t flags = (intptr_t) BLI_edgehash_lookup(data->eh, med->v1, med->v2);
-
- if (med->flag&ME_SEAM) {
- if (G.f&G_HIDDENEDGES) {
- return 1;
- } else {
- return (flags & eEdge_Visible);
- }
- } else {
- return 0;
- }
-}
-static int draw_tfaces3D__setSelectOpts(void *userData, int index)
-{
- struct { Mesh *me; EdgeHash *eh; } *data = userData;
- MEdge *med = &data->me->medge[index];
- uintptr_t flags = (intptr_t) BLI_edgehash_lookup(data->eh, med->v1, med->v2);
-
- return flags & eEdge_Select;
-}
-static int draw_tfaces3D__setActiveOpts(void *userData, int index)
-{
- struct { Mesh *me; EdgeHash *eh; } *data = userData;
- MEdge *med = &data->me->medge[index];
- uintptr_t flags = (intptr_t) BLI_edgehash_lookup(data->eh, med->v1, med->v2);
-
- if (flags & eEdge_Select) {
- return 1;
- } else {
- return 0;
- }
-}
-static int draw_tfaces3D__drawFaceOpts(void *userData, int index)
-{
- Mesh *me = (Mesh*)userData;
-
- MFace *mface = &me->mface[index];
- if (!(mface->flag&ME_HIDE) && (mface->flag&ME_FACE_SEL))
- return 2; /* Don't set color */
- else
- return 0;
-}
-static void draw_tfaces3D(Object *ob, Mesh *me, DerivedMesh *dm)
-{
- struct { Mesh *me; EdgeHash *eh; } data;
-
- data.me = me;
- data.eh = get_tface_mesh_marked_edge_info(me);
-
- glEnable(GL_DEPTH_TEST);
- glDisable(GL_LIGHTING);
- bglPolygonOffset(1.0);
-
- /* Draw (Hidden) Edges */
- BIF_ThemeColor(TH_EDGE_FACESEL);
- dm->drawMappedEdges(dm, draw_tfaces3D__setHiddenOpts, &data);
-
- /* Draw Seams */
- if(G.f & G_DRAWSEAMS) {
- BIF_ThemeColor(TH_EDGE_SEAM);
- glLineWidth(2);
-
- dm->drawMappedEdges(dm, draw_tfaces3D__setSeamOpts, &data);
-
- glLineWidth(1);
- }
-
- /* Draw Selected Faces */
- if(G.f & G_DRAWFACES) {
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- BIF_ThemeColor4(TH_FACE_SELECT);
-
- dm->drawMappedFacesTex(dm, draw_tfaces3D__drawFaceOpts, (void*)me);
-
- glDisable(GL_BLEND);
- }
-
- bglPolygonOffset(1.0);
-
- /* Draw Stippled Outline for selected faces */
- glColor3ub(255, 255, 255);
- setlinestyle(1);
- dm->drawMappedEdges(dm, draw_tfaces3D__setSelectOpts, &data);
- setlinestyle(0);
-
- dm->drawMappedEdges(dm, draw_tfaces3D__setActiveOpts, &data);
-
- bglPolygonOffset(0.0); // resets correctly now, even after calling accumulated offsets
-
- BLI_edgehash_free(data.eh, NULL);
-}
-
-static Material *give_current_material_or_def(Object *ob, int matnr)
-{
- extern Material defmaterial; // render module abuse...
- Material *ma= give_current_material(ob, matnr);
-
- return ma?ma:&defmaterial;
-}
-
-static int set_draw_settings_cached(int clearcache, int textured, MTFace *texface, int lit, Object *litob, int litmatnr, int doublesided)
-{
- static int c_textured;
- static int c_lit;
- static int c_doublesided;
- static MTFace *c_texface;
- static Object *c_litob;
- static int c_litmatnr;
- static int c_badtex;
-
- if (clearcache) {
- c_textured= c_lit= c_doublesided= -1;
- c_texface= (MTFace*) -1;
- c_litob= (Object*) -1;
- c_litmatnr= -1;
- c_badtex= 0;
- }
-
- if (texface) {
- lit = lit && (lit==-1 || texface->mode&TF_LIGHT);
- textured = textured && (texface->mode&TF_TEX);
- doublesided = texface->mode&TF_TWOSIDE;
- } else {
- textured = 0;
- }
-
- if (doublesided!=c_doublesided) {
- if (doublesided) glDisable(GL_CULL_FACE);
- else glEnable(GL_CULL_FACE);
-
- c_doublesided= doublesided;
- }
-
- if (textured!=c_textured || texface!=c_texface) {
- if (textured ) {
- c_badtex= !GPU_set_tpage(texface);
- } else {
- GPU_set_tpage(0);
- c_badtex= 0;
- }
- c_textured= textured;
- c_texface= texface;
- }
-
- if (c_badtex) lit= 0;
- if (lit!=c_lit || litob!=c_litob || litmatnr!=c_litmatnr) {
- if (lit) {
- Material *ma= give_current_material_or_def(litob, litmatnr+1);
- float spec[4];
-
- spec[0]= ma->spec*ma->specr;
- spec[1]= ma->spec*ma->specg;
- spec[2]= ma->spec*ma->specb;
- spec[3]= 1.0;
-
- glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, spec);
- glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
- glEnable(GL_LIGHTING);
- glEnable(GL_COLOR_MATERIAL);
- }
- else {
- glDisable(GL_LIGHTING);
- glDisable(GL_COLOR_MATERIAL);
- }
- c_lit= lit;
- c_litob= litob;
- c_litmatnr= litmatnr;
- }
-
- return c_badtex;
-}
-
-/* Icky globals, fix with userdata parameter */
-
-struct TextureDrawState {
- Object *ob;
- int islit, istex;
- unsigned char obcol[4];
-} Gtexdraw = {NULL, 0, 0, {0, 0, 0, 0}};
-
-static void draw_textured_begin(Object *ob)
-{
- unsigned char obcol[4];
- int istex, solidtex= 0;
-
- if(G.vd->drawtype==OB_SOLID || (ob==G.obedit && G.vd->drawtype!=OB_TEXTURE)) {
- /* draw with default lights in solid draw mode and edit mode */
- solidtex= 1;
- Gtexdraw.islit= -1;
- }
- else
- /* draw with lights in the scene otherwise */
- Gtexdraw.islit= GPU_scene_object_lights(G.scene, ob, G.vd->lay, G.vd->viewmat);
-
- obcol[0]= CLAMPIS(ob->col[0]*255, 0, 255);
- obcol[1]= CLAMPIS(ob->col[1]*255, 0, 255);
- obcol[2]= CLAMPIS(ob->col[2]*255, 0, 255);
- obcol[3]= CLAMPIS(ob->col[3]*255, 0, 255);
-
- glCullFace(GL_BACK); glEnable(GL_CULL_FACE);
- if(solidtex || G.vd->drawtype==OB_TEXTURE) istex= 1;
- else istex= 0;
-
- Gtexdraw.ob = ob;
- Gtexdraw.istex = istex;
- memcpy(Gtexdraw.obcol, obcol, sizeof(obcol));
- set_draw_settings_cached(1, 0, 0, Gtexdraw.islit, 0, 0, 0);
- glShadeModel(GL_SMOOTH);
-}
-
-static void draw_textured_end()
-{
- /* switch off textures */
- GPU_set_tpage(0);
-
- glShadeModel(GL_FLAT);
- glDisable(GL_CULL_FACE);
-
- /* XXX, bad patch - GPU_default_lights() calls
- * glLightfv(GL_LIGHT_POSITION, ...) which
- * is transformed by the current matrix... we
- * need to make sure that matrix is identity.
- *
- * It would be better if drawmesh.c kept track
- * of and restored the light settings it changed.
- * - zr
- */
- glPushMatrix();
- glLoadIdentity();
- GPU_default_lights();
- glPopMatrix();
-}
-
-
-static int draw_tface__set_draw(MTFace *tface, MCol *mcol, int matnr)
-{
- if (tface && (tface->mode&TF_INVISIBLE)) return 0;
-
- if (tface && set_draw_settings_cached(0, Gtexdraw.istex, tface, Gtexdraw.islit, Gtexdraw.ob, matnr, TF_TWOSIDE)) {
- glColor3ub(0xFF, 0x00, 0xFF);
- return 2; /* Don't set color */
- } else if (tface && tface->mode&TF_OBCOL) {
- glColor3ubv(Gtexdraw.obcol);
- return 2; /* Don't set color */
- } else if (!mcol) {
- if (tface) glColor3f(1.0, 1.0, 1.0);
- else {
- Material *ma= give_current_material(Gtexdraw.ob, matnr+1);
- if(ma) glColor3f(ma->r, ma->g, ma->b);
- else glColor3f(1.0, 1.0, 1.0);
- }
- return 2; /* Don't set color */
- } else {
- return 1; /* Set color from mcol */
- }
-}
-
-static int draw_tface_mapped__set_draw(void *userData, int index)
-{
- Mesh *me = (Mesh*)userData;
- MTFace *tface = (me->mtface)? &me->mtface[index]: NULL;
- MFace *mface = (me->mface)? &me->mface[index]: NULL;
- MCol *mcol = (me->mcol)? &me->mcol[index]: NULL;
- int matnr = me->mface[index].mat_nr;
- if (mface && mface->flag&ME_HIDE) return 0;
- return draw_tface__set_draw(tface, mcol, matnr);
-}
-
-static int draw_em_tf_mapped__set_draw(void *userData, int index)
-{
- EditMesh *em = userData;
- EditFace *efa = EM_get_face_for_index(index);
- MTFace *tface;
- MCol *mcol;
- int matnr;
-
- if (efa==NULL || efa->h)
- return 0;
-
- tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- mcol = CustomData_em_get(&em->fdata, efa->data, CD_MCOL);
- matnr = efa->mat_nr;
-
- return draw_tface__set_draw(tface, mcol, matnr);
-}
-
-static int wpaint__setSolidDrawOptions(void *userData, int index, int *drawSmooth_r)
-{
- Mesh *me = (Mesh*)userData;
- MTFace *tface = (me->mtface)? &me->mtface[index]: NULL;
- MFace *mface = (me->mface)? &me->mface[index]: NULL;
-
- if ((mface->flag&ME_HIDE) || (tface && (tface->mode&TF_INVISIBLE)))
- return 0;
-
- *drawSmooth_r = 1;
- return 1;
-}
-
-void draw_mesh_text(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? */
- bProperty *prop = get_ob_property(ob, "Text");
- GPUVertexAttribs gattribs;
- int a, totface= me->totface;
-
- /* don't draw without tfaces */
- if(!tface)
- return;
-
- /* don't draw when editing */
- if(ob==G.obedit)
- return;
- else if(ob==OBACT)
- if(FACESEL_PAINT_TEST)
- return;
-
- ddm = mesh_get_derived_deform(ob, CD_MASK_BAREMESH);
-
- for(a=0, mf=mface; a<totface; a++, tface++, mf++) {
- int mode= tface->mode;
- int matnr= mf->mat_nr;
- int mf_smooth= mf->flag & ME_SMOOTH;
-
- if (!(mf->flag&ME_HIDE) && !(mode&TF_INVISIBLE) && (mode&TF_BMFONT)) {
- float v1[3], v2[3], v3[3], v4[3];
- char string[MAX_PROPSTRING];
- int characters, i, glattrib= -1, badtex= 0;
-
- if(glsl) {
- GPU_enable_material(matnr+1, &gattribs);
-
- for(i=0; i<gattribs.totlayer; i++) {
- if(gattribs.layer[i].type == CD_MTFACE) {
- glattrib = gattribs.layer[i].glindex;
- break;
- }
- }
- }
- else {
- badtex = set_draw_settings_cached(0, Gtexdraw.istex, tface, Gtexdraw.islit, Gtexdraw.ob, matnr, TF_TWOSIDE);
- 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);
-
- // The BM_FONT handling is in the gpu module, shared with the
- // game engine, was duplicated previously
-
- set_property_valstr(prop, string);
- characters = strlen(string);
-
- if(!BKE_image_get_ibuf(tface->tpage, NULL))
- characters = 0;
-
- if (!mf_smooth) {
- float nor[3];
-
- CalcNormFloat(v1, v2, v3, nor);
-
- glNormal3fv(nor);
- }
-
- GPU_render_text(tface, tface->mode, string, characters,
- (unsigned int*)mcol, v1, v2, v3, (mf->v4? v4: NULL), glattrib);
- }
- if (mcol) {
- mcol+=4;
- }
- }
-
- ddm->release(ddm);
-}
-
-void draw_mesh_textured(Object *ob, DerivedMesh *dm, int faceselect)
-{
- Mesh *me= ob->data;
-
- /* correct for negative scale */
- if(ob->transflag & OB_NEG_SCALE) glFrontFace(GL_CW);
- else glFrontFace(GL_CCW);
-
- /* draw the textured mesh */
- draw_textured_begin(ob);
-
- if(ob==G.obedit) {
- dm->drawMappedFacesTex(dm, draw_em_tf_mapped__set_draw, G.editMesh);
- } else if(faceselect) {
- if(G.f & G_WEIGHTPAINT)
- dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, me, 1);
- else
- dm->drawMappedFacesTex(dm, draw_tface_mapped__set_draw, me);
- }
- else
- dm->drawFacesTex(dm, draw_tface__set_draw);
-
- /* draw game engine text hack */
- if(get_ob_property(ob, "Text"))
- draw_mesh_text(ob, 0);
-
- draw_textured_end();
-
- /* draw edges and selected faces over textured mesh */
- if(!G.obedit && faceselect)
- draw_tfaces3D(ob, me, dm);
-
- /* reset from negative scale correction */
- glFrontFace(GL_CCW);
-
- /* in editmode, the blend mode needs to be set incase it was ADD */
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-}
-