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/editors/space_view3d/drawobject.c')
-rw-r--r--source/blender/editors/space_view3d/drawobject.c818
1 files changed, 576 insertions, 242 deletions
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index 8dbaeed97fa..b737a65e2be 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -28,40 +28,18 @@
#include <string.h>
#include <math.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#include "MEM_guardedalloc.h"
-#include "IMB_imbuf.h"
-
-
-
-
-#include "DNA_armature_types.h"
-#include "DNA_boid_types.h"
#include "DNA_camera_types.h"
#include "DNA_curve_types.h"
#include "DNA_constraint_types.h" // for drawing constraint
-#include "DNA_effect_types.h"
#include "DNA_lamp_types.h"
#include "DNA_lattice_types.h"
#include "DNA_material_types.h"
-#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_meta_types.h"
-#include "DNA_modifier_types.h"
-#include "DNA_object_types.h"
-#include "DNA_object_force.h"
-#include "DNA_object_fluidsim.h"
-#include "DNA_particle_types.h"
-#include "DNA_space_types.h"
#include "DNA_scene_types.h"
-#include "DNA_screen_types.h"
#include "DNA_smoke_types.h"
-#include "DNA_userdef_types.h"
-#include "DNA_view3d_types.h"
#include "DNA_world_types.h"
#include "BLI_blenlib.h"
@@ -103,7 +81,6 @@
#include "BIF_glutil.h"
#include "GPU_draw.h"
-#include "GPU_material.h"
#include "GPU_extensions.h"
#include "ED_mesh.h"
@@ -111,10 +88,8 @@
#include "ED_screen.h"
#include "ED_sculpt.h"
#include "ED_types.h"
-#include "ED_util.h"
#include "UI_resources.h"
-#include "UI_interface_icons.h"
#include "WM_api.h"
#include "wm_subwindow.h"
@@ -128,13 +103,6 @@
((vd->drawtype==OB_TEXTURE && dt>OB_SOLID) || \
(vd->drawtype==OB_SOLID && vd->flag2 & V3D_SOLID_TEX))
-#define CHECK_OB_DRAWFACEDOT(sce, vd, dt) \
-( (sce->toolsettings->selectmode & SCE_SELECT_FACE) && \
- (vd->drawtype<=OB_SOLID) && \
- (G.f & G_BACKBUFSEL)==0 && \
- (((vd->drawtype==OB_SOLID) && (dt>=OB_SOLID) && (vd->flag2 & V3D_SOLID_TEX) && (vd->flag & V3D_ZBUF_SELECT)) == 0) \
- )
-
static void draw_bounding_volume(Scene *scene, Object *ob);
static void drawcube_size(float size);
@@ -142,6 +110,26 @@ static void drawcircle_size(float size);
static void draw_empty_sphere(float size);
static void draw_empty_cone(float size);
+static int check_ob_drawface_dot(Scene *sce, View3D *vd, char dt)
+{
+ if((sce->toolsettings->selectmode & SCE_SELECT_FACE) == 0)
+ return 0;
+
+ if(G.f & G_BACKBUFSEL)
+ return 0;
+
+ if((vd->flag & V3D_ZBUF_SELECT) == 0)
+ return 1;
+
+ /* if its drawing textures with zbuf sel, then dont draw dots */
+ if(dt==OB_TEXTURE && vd->drawtype==OB_TEXTURE)
+ return 0;
+
+ if(vd->drawtype>=OB_SOLID && vd->flag2 & V3D_SOLID_TEX)
+ return 0;
+
+ return 1;
+}
/* ************* only use while object drawing **************
* or after running ED_view3d_init_mats_rv3d
@@ -334,16 +322,114 @@ static float cosval[32] ={
1.00000000
};
+static void draw_xyz_wire(RegionView3D *rv3d, float mat[][4], float *c, float size, int axis)
+{
+ float v1[3]= {0.f, 0.f, 0.f}, v2[3] = {0.f, 0.f, 0.f};
+ float imat[4][4];
+ float dim;
+ float dx[3], dy[3];
+
+ /* hrms, really only works properly after glLoadMatrixf(rv3d->viewmat); */
+ float pixscale= rv3d->persmat[0][3]*c[0]+ rv3d->persmat[1][3]*c[1]+ rv3d->persmat[2][3]*c[2] + rv3d->persmat[3][3];
+ pixscale*= rv3d->pixsize;
+
+ /* halfway blend between fixed size in worldspace vs viewspace -
+ * alleviates some of the weirdness due to not using viewmat for gl matrix */
+ dim = (0.05*size*0.5) + (size*10.f*pixscale*0.5);
+
+ invert_m4_m4(imat, mat);
+ normalize_v3(imat[0]);
+ normalize_v3(imat[1]);
+
+ copy_v3_v3(dx, imat[0]);
+ copy_v3_v3(dy, imat[1]);
+
+ mul_v3_fl(dx, dim);
+ mul_v3_fl(dy, dim);
+
+ switch(axis) {
+ case 0: /* x axis */
+ glBegin(GL_LINES);
+
+ /* bottom left to top right */
+ sub_v3_v3v3(v1, c, dx);
+ sub_v3_v3(v1, dy);
+ add_v3_v3v3(v2, c, dx);
+ add_v3_v3(v2, dy);
+
+ glVertex3fv(v1);
+ glVertex3fv(v2);
+
+ /* top left to bottom right */
+ mul_v3_fl(dy, 2.f);
+ add_v3_v3(v1, dy);
+ sub_v3_v3(v2, dy);
+
+ glVertex3fv(v1);
+ glVertex3fv(v2);
+
+ glEnd();
+ break;
+ case 1: /* y axis */
+ glBegin(GL_LINES);
+
+ /* bottom left to top right */
+ mul_v3_fl(dx, 0.75f);
+ sub_v3_v3v3(v1, c, dx);
+ sub_v3_v3(v1, dy);
+ add_v3_v3v3(v2, c, dx);
+ add_v3_v3(v2, dy);
+
+ glVertex3fv(v1);
+ glVertex3fv(v2);
+
+ /* top left to center */
+ mul_v3_fl(dy, 2.f);
+ add_v3_v3(v1, dy);
+ copy_v3_v3(v2, c);
+
+ glVertex3fv(v1);
+ glVertex3fv(v2);
+
+ glEnd();
+ break;
+ case 2: /* z axis */
+ glBegin(GL_LINE_STRIP);
+
+ /* start at top left */
+ sub_v3_v3v3(v1, c, dx);
+ add_v3_v3v3(v1, c, dy);
+
+ glVertex3fv(v1);
+
+ mul_v3_fl(dx, 2.f);
+ add_v3_v3(v1, dx);
+
+ glVertex3fv(v1);
+
+ mul_v3_fl(dy, 2.f);
+ sub_v3_v3(v1, dx);
+ sub_v3_v3(v1, dy);
+
+ glVertex3fv(v1);
+
+ add_v3_v3(v1, dx);
+
+ glVertex3fv(v1);
+
+ glEnd();
+ break;
+ }
+
+}
+
/* flag is same as for draw_object */
-void drawaxes(float size, int flag, char drawtype)
+void drawaxes(RegionView3D *rv3d, float mat[][4], float size, int flag, char drawtype)
{
int axis;
float v1[3]= {0.0, 0.0, 0.0};
float v2[3]= {0.0, 0.0, 0.0};
float v3[3]= {0.0, 0.0, 0.0};
-
- if(G.f & G_RENDER_SHADOW)
- return;
switch(drawtype) {
@@ -424,12 +510,12 @@ void drawaxes(float size, int flag, char drawtype)
glVertex3fv(v1);
glVertex3fv(v2);
- v1[axis]= size*0.8;
- v1[arrow_axis]= -size*0.125;
+ v1[axis]= size*0.85;
+ v1[arrow_axis]= -size*0.08;
glVertex3fv(v1);
glVertex3fv(v2);
- v1[arrow_axis]= size*0.125;
+ v1[arrow_axis]= size*0.08;
glVertex3fv(v1);
glVertex3fv(v2);
@@ -437,15 +523,7 @@ void drawaxes(float size, int flag, char drawtype)
v2[axis]+= size*0.125;
- // patch for 3d cards crashing on glSelect for text drawing (IBM)
- if((flag & DRAW_PICKING) == 0) {
- if (axis==0)
- view3d_cached_text_draw_add(v2[0], v2[1], v2[2], "x", 0, V3D_CACHE_TEXT_ZBUF);
- else if (axis==1)
- view3d_cached_text_draw_add(v2[0], v2[1], v2[2], "y", 0, V3D_CACHE_TEXT_ZBUF);
- else
- view3d_cached_text_draw_add(v2[0], v2[1], v2[2], "z", 0, V3D_CACHE_TEXT_ZBUF);
- }
+ draw_xyz_wire(rv3d, mat, v2, size, axis);
}
break;
}
@@ -554,14 +632,14 @@ void view3d_cached_text_draw_end(View3D *v3d, ARegion *ar, int depth_write, floa
}
if(tot) {
+#if 0
bglMats mats; /* ZBuffer depth vars */
double ux, uy, uz;
float depth;
if(v3d->zbuf)
bgl_get_mats(&mats);
-
-
+#endif
if(rv3d->rflag & RV3D_CLIPPING)
for(a=0; a<6; a++)
glDisable(GL_CLIP_PLANE0+a);
@@ -578,7 +656,7 @@ void view3d_cached_text_draw_end(View3D *v3d, ARegion *ar, int depth_write, floa
else glDepthMask(0);
for(vos= strings->first; vos; vos= vos->next) {
-
+#if 0 // too slow, reading opengl info while drawing is very bad, better to see if we cn use the zbuffer while in pixel space - campbell
if(v3d->zbuf && (vos->flag & V3D_CACHE_TEXT_ZBUF)) {
gluProject(vos->vec[0], vos->vec[1], vos->vec[2], mats.modelview, mats.projection, (GLint *)mats.viewport, &ux, &uy, &uz);
glReadPixels(ar->winrct.xmin+vos->mval[0]+vos->xoffs, ar->winrct.ymin+vos->mval[1], 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth);
@@ -586,7 +664,7 @@ void view3d_cached_text_draw_end(View3D *v3d, ARegion *ar, int depth_write, floa
if(uz > depth)
continue;
}
-
+#endif
if(vos->mval[0]!=IS_CLIPPED) {
glColor3fv(vos->col);
BLF_draw_default((float)vos->mval[0]+vos->xoffs, (float)vos->mval[1], (depth_write)? 0.0f: 2.0f, vos->str);
@@ -697,9 +775,7 @@ static void drawshadbuflimits(Lamp *la, float mat[][4])
{
float sta[3], end[3], lavec[3];
- lavec[0]= -mat[2][0];
- lavec[1]= -mat[2][1];
- lavec[2]= -mat[2][2];
+ negate_v3_v3(lavec, mat[2]);
normalize_v3(lavec);
sta[0]= mat[3][0]+ la->clipsta*lavec[0];
@@ -794,25 +870,17 @@ static void spotvolume(float *lvec, float *vvec, float inp)
static void draw_spot_cone(Lamp *la, float x, float z)
{
- float vec[3];
-
z= fabs(z);
glBegin(GL_TRIANGLE_FAN);
glVertex3f(0.0f, 0.0f, -x);
if(la->mode & LA_SQUARE) {
- vec[0]= z;
- vec[1]= z;
- vec[2]= 0.0;
-
- glVertex3fv(vec);
- vec[1]= -z;
- glVertex3fv(vec);
- vec[0]= -z;
- glVertex3fv(vec);
- vec[1]= z;
- glVertex3fv(vec);
+ glVertex3f(z, z, 0);
+ glVertex3f(-z, z, 0);
+ glVertex3f(-z, -z, 0);
+ glVertex3f(z, -z, 0);
+ glVertex3f(z, z, 0);
}
else {
float angle;
@@ -866,9 +934,6 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
float imat[4][4], curcol[4];
char col[4];
int drawcone= (dt>OB_WIRE && !(G.f & G_PICKSEL) && la->type == LA_SPOT && (la->mode & LA_SHOW_CONE));
-
- if(G.f & G_RENDER_SHADOW)
- return;
if(drawcone && !v3d->transp) {
/* in this case we need to draw delayed */
@@ -915,21 +980,23 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
/* Outer circle */
circrad = 3.0f*lampsize;
+ setlinestyle(3);
+
drawcircball(GL_LINE_LOOP, vec, circrad, imat);
- }
- else
- circrad = 0.0f;
-
- setlinestyle(3);
- /* draw dashed outer circle if shadow is on. remember some lamps can't have certain shadows! */
- if (la->type!=LA_HEMI) {
- if ((la->mode & LA_SHAD_RAY) ||
- ((la->mode & LA_SHAD_BUF) && (la->type==LA_SPOT)) )
- {
- drawcircball(GL_LINE_LOOP, vec, circrad + 3.0f*pixsize, imat);
+ /* draw dashed outer circle if shadow is on. remember some lamps can't have certain shadows! */
+ if(la->type!=LA_HEMI) {
+ if( (la->mode & LA_SHAD_RAY) ||
+ ((la->mode & LA_SHAD_BUF) && (la->type==LA_SPOT))
+ ) {
+ drawcircball(GL_LINE_LOOP, vec, circrad + 3.0f*pixsize, imat);
+ }
}
}
+ else {
+ setlinestyle(3);
+ circrad = 0.0f;
+ }
/* draw the pretty sun rays */
if(la->type==LA_SUN) {
@@ -1002,17 +1069,20 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
/* draw the circle/square at the end of the cone */
glTranslatef(0.0, 0.0 , x);
if(la->mode & LA_SQUARE) {
- vvec[0]= fabs(z);
- vvec[1]= fabs(z);
- vvec[2]= 0.0;
+ float tvec[3];
+ float z_abs= fabs(z);
+
+ tvec[0]= tvec[1]= z_abs;
+ tvec[2]= 0.0;
+
glBegin(GL_LINE_LOOP);
- glVertex3fv(vvec);
- vvec[1]= -fabs(z);
- glVertex3fv(vvec);
- vvec[0]= -fabs(z);
- glVertex3fv(vvec);
- vvec[1]= fabs(z);
- glVertex3fv(vvec);
+ glVertex3fv(tvec);
+ tvec[1]= -z_abs; /* neg */
+ glVertex3fv(tvec);
+ tvec[0]= -z_abs; /* neg */
+ glVertex3fv(tvec);
+ tvec[1]= z_abs; /* pos */
+ glVertex3fv(tvec);
glEnd();
}
else circ(0.0, 0.0, fabs(z));
@@ -1029,6 +1099,22 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
if(drawcone)
draw_transp_spot_volume(la, x, z);
+
+ /* draw clip start, useful for wide cones where its not obvious where the start is */
+ glTranslatef(0.0, 0.0 , -x); /* reverse translation above */
+ if(la->type==LA_SPOT && (la->mode & LA_SHAD_BUF) ) {
+ float lvec_clip[3];
+ float vvec_clip[3];
+ float clipsta_fac= la->clipsta / -x;
+
+ interp_v3_v3v3(lvec_clip, vec, lvec, clipsta_fac);
+ interp_v3_v3v3(vvec_clip, vec, vvec, clipsta_fac);
+
+ glBegin(GL_LINE_STRIP);
+ glVertex3fv(lvec_clip);
+ glVertex3fv(vvec_clip);
+ glEnd();
+ }
}
else if ELEM(la->type, LA_HEMI, LA_SUN) {
@@ -1166,9 +1252,6 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob
float nobmat[4][4], vec[8][4], fac, facx, facy, depth;
int i;
- if(G.f & G_RENDER_SHADOW)
- return;
-
cam= ob->data;
glDisable(GL_LIGHTING);
@@ -1344,14 +1427,16 @@ static void drawlattice(Scene *scene, View3D *v3d, Object *ob)
Lattice *lt= ob->data;
DispList *dl;
int u, v, w;
- int use_wcol= 0;
+ int use_wcol= 0, is_edit= (lt->editlatt != NULL);
/* now we default make displist, this will modifiers work for non animated case */
if(ob->disp.first==NULL)
lattice_calc_modifiers(scene, ob);
dl= find_displist(&ob->disp, DL_VERTS);
- if(lt->editlatt) {
+ if(is_edit) {
+ lt= lt->editlatt;
+
cpack(0x004000);
if(ob->defbase.first && lt->dvert) {
@@ -1360,8 +1445,6 @@ static void drawlattice(Scene *scene, View3D *v3d, Object *ob)
}
}
- if(lt->editlatt) lt= lt->editlatt;
-
glBegin(GL_LINES);
for(w=0; w<lt->pntsw; w++) {
int wxt = (w==0 || w==lt->pntsw-1);
@@ -1391,7 +1474,7 @@ static void drawlattice(Scene *scene, View3D *v3d, Object *ob)
if(use_wcol)
glShadeModel(GL_FLAT);
- if( ((Lattice *)ob->data)->editlatt ) {
+ if(is_edit) {
if(v3d->zbuf) glDisable(GL_DEPTH_TEST);
lattice_draw_verts(lt, dl, 0);
@@ -1986,7 +2069,7 @@ static int draw_dm_creases__setDrawOptions(void *userData, int index)
return 0;
if (!BM_TestHFlag(eed, BM_HIDDEN) && *crease!=0.0) {
- UI_ThemeColorBlend(TH_WIRE, TH_EDGE_SELECT, *crease);
+ UI_ThemeColorBlend(TH_WIRE, TH_EDGE_CREASE, *crease);
return 1;
} else {
return 0;
@@ -2096,7 +2179,7 @@ static void draw_em_fancy_verts(Scene *scene, View3D *v3d, Object *obedit,
draw_dm_verts(em, cageDM, sel, eve_act);
}
- if( CHECK_OB_DRAWFACEDOT(scene, v3d, obedit->dt) ) {
+ if(check_ob_drawface_dot(scene, v3d, obedit->dt)) {
glPointSize(fsize);
glColor4ubv((GLubyte *)fcol);
draw_dm_face_centers(em, cageDM, sel);
@@ -2187,7 +2270,8 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d,
float area, col[3]; /* area of the face, color of the text to draw */
float grid= unit->system ? unit->scale_length : v3d->grid;
int do_split= unit->flag & USER_UNIT_OPT_SPLIT;
- if(G.f & (G_RENDER_OGL|G_RENDER_SHADOW))
+
+ if(v3d->flag2 & V3D_RENDER_OVERRIDE)
return;
/* make the precision of the pronted value proportionate to the gridsize */
@@ -2430,7 +2514,7 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object
else {
if (cageDM!=finalDM) {
UI_ThemeColorBlend(TH_WIRE, TH_BACK, 0.7);
- finalDM->drawEdges(finalDM, 1);
+ finalDM->drawEdges(finalDM, 1, 0);
}
}
@@ -2566,7 +2650,7 @@ static void draw_mesh_object_outline(View3D *v3d, Object *ob, DerivedMesh *dm)
GPU_disable_material();
}
else {
- dm->drawEdges(dm, 0);
+ dm->drawEdges(dm, 0, 1);
}
glLineWidth(1.0);
@@ -2610,7 +2694,8 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
if (ob==OBACT && paint_facesel_test(ob)) draw_wire = 0;
if(dt==OB_BOUNDBOX) {
- draw_bounding_volume(scene, ob);
+ if((v3d->flag2 & V3D_RENDER_OVERRIDE && v3d->drawtype >= OB_WIRE)==0)
+ draw_bounding_volume(scene, ob);
}
else if(hasHaloMat || (totface==0 && totedge==0)) {
glPointSize(1.5);
@@ -2624,8 +2709,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
CHECK_OB_DRAWTEXTURE(v3d, dt))
{
int faceselect= (ob==OBACT && paint_facesel_test(ob));
-
- if ((v3d->flag&V3D_SELECT_OUTLINE) && (base->flag&SELECT) && !(G.f&G_PICKSEL || paint_facesel_test(ob)) && !draw_wire) {
+ if ((v3d->flag&V3D_SELECT_OUTLINE) && ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) && (base->flag&SELECT) && !(G.f&G_PICKSEL || paint_facesel_test(ob)) && !draw_wire) {
draw_mesh_object_outline(v3d, ob, dm);
}
@@ -2649,7 +2733,8 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
else
UI_ThemeColor(TH_WIRE);
- dm->drawLooseEdges(dm);
+ if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0)
+ dm->drawLooseEdges(dm);
}
}
else if(dt==OB_SOLID) {
@@ -2667,7 +2752,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
glEnable(GL_LINE_STIPPLE);
glLineStipple(1, 0x8888);
- dm->drawEdges(dm, 1);
+ dm->drawEdges(dm, 1, 0);
bglPolygonOffset(rv3d->dist, 0.0);
glDepthMask(1);
@@ -2680,7 +2765,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
else {
Paint *p;
- if((v3d->flag&V3D_SELECT_OUTLINE) && (base->flag&SELECT) && !draw_wire && !ob->sculpt)
+ if((v3d->flag&V3D_SELECT_OUTLINE) && ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) && (base->flag&SELECT) && !draw_wire && !ob->sculpt)
draw_mesh_object_outline(v3d, ob, dm);
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, me->flag & ME_TWOSIDED );
@@ -2694,9 +2779,11 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
int fast= (p->flags & PAINT_FAST_NAVIGATE) && (rv3d->rflag & RV3D_NAVIGATING);
if(ob->sculpt->partial_redraw) {
- sculpt_get_redraw_planes(planes, ar, rv3d, ob);
- fpl = planes;
- ob->sculpt->partial_redraw = 0;
+ if(ar->do_draw & RGN_DRAW_PARTIAL) {
+ sculpt_get_redraw_planes(planes, ar, rv3d, ob);
+ fpl = planes;
+ ob->sculpt->partial_redraw = 0;
+ }
}
dm->drawFacesSolid(dm, fpl, fast, GPU_enable_material);
@@ -2714,7 +2801,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
} else {
UI_ThemeColor(TH_WIRE);
}
- if(!ob->sculpt)
+ if(!ob->sculpt && (v3d->flag2 & V3D_RENDER_OVERRIDE)==0)
dm->drawLooseEdges(dm);
}
}
@@ -2764,7 +2851,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
dm= mesh_get_derived_final(scene, ob, v3d->customdata_mask);
}
- if ((v3d->flag&V3D_SELECT_OUTLINE) && (base->flag&SELECT) && !draw_wire) {
+ if ((v3d->flag&V3D_SELECT_OUTLINE) && ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) && (base->flag&SELECT) && !draw_wire) {
draw_mesh_object_outline(v3d, ob, dm);
}
@@ -2781,7 +2868,8 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
} else {
UI_ThemeColor(TH_WIRE);
}
- dm->drawLooseEdges(dm);
+ if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0)
+ dm->drawLooseEdges(dm);
}
}
@@ -2835,8 +2923,9 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
glDepthMask(0); // disable write in zbuffer, selected edge wires show better
}
- dm->drawEdges(dm, (dt==OB_WIRE || totface==0));
-
+ if((v3d->flag2 & V3D_RENDER_OVERRIDE && v3d->drawtype >= OB_SOLID)==0)
+ dm->drawEdges(dm, (dt==OB_WIRE || totface==0), me->drawflag & ME_ALLEDGES);
+
if (dt!=OB_WIRE && draw_wire==2) {
glDepthMask(1);
bglPolygonOffset(rv3d->dist, 0.0);
@@ -3053,8 +3142,7 @@ static void drawDispListsolid(ListBase *lb, Object *ob, int glsl)
case DL_POLY:
if(ob->type==OB_SURF) {
int nr;
-
- UI_ThemeColor(TH_WIRE);
+
glDisable(GL_LIGHTING);
/* for some reason glDrawArrays crashes here in half of the platforms (not osx) */
@@ -3176,6 +3264,41 @@ static void drawDispListshaded(ListBase *lb, Object *ob)
glDisableClientState(GL_COLOR_ARRAY);
}
+static void drawCurveDMWired(Object *ob)
+{
+ DerivedMesh *dm = ob->derivedFinal;
+ dm->drawEdges (dm, 1, 0);
+}
+
+/* return 1 when nothing was drawn */
+static int drawCurveDerivedMesh(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, int dt)
+{
+ Object *ob= base->object;
+ DerivedMesh *dm = ob->derivedFinal;
+
+ if (!dm) {
+ return 1;
+ }
+
+ if(dt>OB_WIRE && dm->getNumFaces(dm)) {
+ int glsl = draw_glsl_material(scene, ob, v3d, dt);
+ GPU_begin_object_materials(v3d, rv3d, scene, ob, glsl, NULL);
+
+ if (!glsl)
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 0);
+
+ glEnable(GL_LIGHTING);
+ dm->drawFacesSolid(dm, NULL, 0, GPU_enable_material);
+ glDisable(GL_LIGHTING);
+ GPU_end_object_materials();
+ } else {
+ if((v3d->flag2 & V3D_RENDER_OVERRIDE && v3d->drawtype >= OB_SOLID)==0)
+ drawCurveDMWired (ob);
+ }
+
+ return 0;
+}
+
/* returns 1 when nothing was drawn */
static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, int dt)
{
@@ -3187,6 +3310,10 @@ static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *bas
solid= (dt > OB_WIRE);
+ if (drawCurveDerivedMesh(scene, v3d, rv3d, base, dt) == 0) {
+ return 0;
+ }
+
switch(ob->type) {
case OB_FONT:
case OB_CURVE:
@@ -3547,12 +3674,11 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
select=1;
}
+ psys_update_children(&sim);
+
psys->flag|=PSYS_DRAWING;
- if(part->type==PART_HAIR && !psys->childcache)
- totchild=0;
- else
- totchild=psys->totchild*part->disp/100;
+ totchild=psys->totchild*part->disp/100;
ma= give_current_material(ob,part->omat);
@@ -3587,11 +3713,18 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
totpart=psys->totpart;
- //if(part->flag&PART_GLOB_TIME)
cfra=bsystem_time(scene, 0, (float)CFRA, 0.0f);
- if(draw_as==PART_DRAW_PATH && psys->pathcache==NULL && psys->childcache==NULL)
- draw_as=PART_DRAW_DOT;
+ if(draw_as==PART_DRAW_PATH) {
+ if(psys->pathcache==NULL && psys->childcache==NULL)
+ psys_update_path_cache(&sim, cfra);
+
+ /* can't create pathcache for some reason*/
+ if(psys->pathcache==NULL && psys->childcache==NULL)
+ draw_as=PART_DRAW_DOT;
+ else if(psys->childcache==NULL)
+ totchild = 0;
+ }
/* 3. */
switch(draw_as){
@@ -3895,7 +4028,8 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
setlinestyle(0);
}
- if((part->draw & PART_DRAW_NUM || part->draw & PART_DRAW_HEALTH) && !(G.f & G_RENDER_SHADOW)){
+
+ if((part->draw & PART_DRAW_NUM || part->draw & PART_DRAW_HEALTH) && (v3d->flag2 & V3D_RENDER_OVERRIDE)==0){
float vec_txt[3];
char *val_pos= val;
val[0]= '\0';
@@ -3924,7 +4058,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
float *cd2=0,*cdata2=0;
/* setup gl flags */
- if(ob_dt > OB_WIRE) {
+ if (1) { //ob_dt > OB_WIRE) {
glEnableClientState(GL_NORMAL_ARRAY);
if(part->draw&PART_DRAW_MAT_COL)
@@ -3934,15 +4068,15 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);
}
- else {
+ /*else {
glDisableClientState(GL_NORMAL_ARRAY);
glDisable(GL_COLOR_MATERIAL);
glDisable(GL_LIGHTING);
UI_ThemeColor(TH_WIRE);
- }
+ }*/
- if(totchild && (part->draw&PART_DRAW_PARENT)==0)
+ if(totchild && ((part->draw&PART_DRAW_PARENT)==0 || psys_in_edit_mode(scene, psys)))
totpart=0;
else if(psys->pathcache==NULL)
totpart=0;
@@ -3954,7 +4088,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
if(path->steps > 0) {
glVertexPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), path->co);
- if(ob_dt > OB_WIRE) {
+ if(1) { //ob_dt > OB_WIRE) {
glNormalPointer(GL_FLOAT, sizeof(ParticleCacheKey), path->vel);
if(part->draw&PART_DRAW_MAT_COL)
glColorPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), path->col);
@@ -3970,7 +4104,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
path=cache[a];
glVertexPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), path->co);
- if(ob_dt > OB_WIRE) {
+ if(1) { //ob_dt > OB_WIRE) {
glNormalPointer(GL_FLOAT, sizeof(ParticleCacheKey), path->vel);
if(part->draw&PART_DRAW_MAT_COL)
glColorPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), path->col);
@@ -3981,7 +4115,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
/* restore & clean up */
- if(ob_dt > OB_WIRE) {
+ if(1) { //ob_dt > OB_WIRE) {
if(part->draw&PART_DRAW_MAT_COL)
glDisable(GL_COLOR_ARRAY);
glDisable(GL_COLOR_MATERIAL);
@@ -3992,6 +4126,20 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
cd2=cdata2=0;
glLineWidth(1.0f);
+
+ if((part->draw & PART_DRAW_NUM) && (v3d->flag2 & V3D_RENDER_OVERRIDE)==0){
+ cache=psys->pathcache;
+
+ for(a=0, pa=psys->particles; a<totpart; a++, pa++){
+ float vec_txt[3];
+ val[0]= '\0';
+
+ sprintf(val, "%i", a);
+ /* use worldspace beause object matrix is alredy applied */
+ mul_v3_m4v3(vec_txt, ob->imat, cache[a]->co);
+ view3d_cached_text_draw_add(vec_txt[0], vec_txt[1], vec_txt[2], val, 10, V3D_CACHE_TEXT_WORLDSPACE);
+ }
+ }
}
else if(pdd && ELEM(draw_as, 0, PART_DRAW_CIRC)==0){
glDisableClientState(GL_COLOR_ARRAY);
@@ -4414,23 +4562,21 @@ static void ob_draw_RE_motion(float com[3],float rotscale[3][3],float itw,float
}
/*place to add drawers */
-unsigned int nurbcol[8]= {
- 0, 0x9090, 0x409030, 0x603080, 0, 0x40fff0, 0x40c033, 0xA090F0 };
static void tekenhandlesN(Nurb *nu, short sel, short hide_handles)
{
BezTriple *bezt;
float *fp;
- unsigned int *col;
+ int basecol;
int a;
if(nu->hide || hide_handles) return;
-
+
glBegin(GL_LINES);
if(nu->type == CU_BEZIER) {
- if(sel) col= nurbcol+4;
- else col= nurbcol;
+ if(sel) basecol= TH_HANDLE_SEL_FREE;
+ else basecol= TH_HANDLE_FREE;
bezt= nu->bezt;
a= nu->pntsu;
@@ -4438,26 +4584,26 @@ static void tekenhandlesN(Nurb *nu, short sel, short hide_handles)
if(bezt->hide==0) {
if( (bezt->f2 & SELECT)==sel) {
fp= bezt->vec[0];
-
- cpack(col[(int)bezt->h1]);
+
+ UI_ThemeColor(basecol + bezt->h1);
glVertex3fv(fp);
glVertex3fv(fp+3);
- cpack(col[(int)bezt->h2]);
+ UI_ThemeColor(basecol + bezt->h2);
glVertex3fv(fp+3);
glVertex3fv(fp+6);
}
else if( (bezt->f1 & SELECT)==sel) {
fp= bezt->vec[0];
-
- cpack(col[(int)bezt->h1]);
+
+ UI_ThemeColor(basecol + bezt->h1);
glVertex3fv(fp);
glVertex3fv(fp+3);
}
else if( (bezt->f3 & SELECT)==sel) {
fp= bezt->vec[1];
-
- cpack(col[(int)bezt->h2]);
+
+ UI_ThemeColor(basecol + bezt->h2);
glVertex3fv(fp);
glVertex3fv(fp+3);
}
@@ -4468,17 +4614,54 @@ static void tekenhandlesN(Nurb *nu, short sel, short hide_handles)
glEnd();
}
-static void tekenvertsN(Nurb *nu, short sel, short hide_handles)
+static void tekenhandlesN_active(Nurb *nu)
+{
+ BezTriple *bezt;
+ float *fp;
+ int a;
+
+ if(nu->hide) return;
+
+ UI_ThemeColor(TH_ACTIVE_SPLINE);
+ glLineWidth(2);
+
+ glBegin(GL_LINES);
+
+ if(nu->type == CU_BEZIER) {
+ bezt= nu->bezt;
+ a= nu->pntsu;
+ while(a--) {
+ if(bezt->hide==0) {
+ fp= bezt->vec[0];
+
+ glVertex3fv(fp);
+ glVertex3fv(fp+3);
+
+ glVertex3fv(fp+3);
+ glVertex3fv(fp+6);
+ }
+ bezt++;
+ }
+ }
+ glEnd();
+
+ glColor3ub(0,0,0);
+ glLineWidth(1);
+}
+
+static void tekenvertsN(Nurb *nu, short sel, short hide_handles, void *lastsel)
{
BezTriple *bezt;
BPoint *bp;
float size;
- int a;
+ int a, color;
if(nu->hide) return;
- if(sel) UI_ThemeColor(TH_VERTEX_SELECT);
- else UI_ThemeColor(TH_VERTEX);
+ if(sel) color= TH_VERTEX_SELECT;
+ else color= TH_VERTEX;
+
+ UI_ThemeColor(color);
size= UI_GetThemeValuef(TH_VERTEX_SIZE);
glPointSize(size);
@@ -4491,7 +4674,17 @@ static void tekenvertsN(Nurb *nu, short sel, short hide_handles)
a= nu->pntsu;
while(a--) {
if(bezt->hide==0) {
- if (hide_handles) {
+ if (sel == 1 && bezt == lastsel) {
+ UI_ThemeColor(TH_LASTSEL_POINT);
+ bglVertex3fv(bezt->vec[1]);
+
+ if (!hide_handles) {
+ if(bezt->f1 & SELECT) bglVertex3fv(bezt->vec[0]);
+ if(bezt->f3 & SELECT) bglVertex3fv(bezt->vec[2]);
+ }
+
+ UI_ThemeColor(color);
+ } else if (hide_handles) {
if((bezt->f2 & SELECT)==sel) bglVertex3fv(bezt->vec[1]);
} else {
if((bezt->f1 & SELECT)==sel) bglVertex3fv(bezt->vec[0]);
@@ -4507,7 +4700,13 @@ static void tekenvertsN(Nurb *nu, short sel, short hide_handles)
a= nu->pntsu*nu->pntsv;
while(a--) {
if(bp->hide==0) {
- if((bp->f1 & SELECT)==sel) bglVertex3fv(bp->vec);
+ if (bp == lastsel) {
+ UI_ThemeColor(TH_LASTSEL_POINT);
+ bglVertex3fv(bp->vec);
+ UI_ThemeColor(color);
+ } else {
+ if((bp->f1 & SELECT)==sel) bglVertex3fv(bp->vec);
+ }
}
bp++;
}
@@ -4517,18 +4716,94 @@ static void tekenvertsN(Nurb *nu, short sel, short hide_handles)
glPointSize(1.0);
}
+static void editnurb_draw_active_poly(Nurb *nu)
+{
+ BPoint *bp;
+ int a, b;
+
+ UI_ThemeColor(TH_ACTIVE_SPLINE);
+ glLineWidth(2);
+
+ bp= nu->bp;
+ for(b=0; b<nu->pntsv; b++) {
+ if(nu->flagu & 1) glBegin(GL_LINE_LOOP);
+ else glBegin(GL_LINE_STRIP);
+
+ for(a=0; a<nu->pntsu; a++, bp++) {
+ glVertex3fv(bp->vec);
+ }
+
+ glEnd();
+ }
+
+ glColor3ub(0,0,0);
+ glLineWidth(1);
+}
+
+static void editnurb_draw_active_nurbs(Nurb *nu)
+{
+ BPoint *bp, *bp1;
+ int a, b, ofs;
+
+ UI_ThemeColor(TH_ACTIVE_SPLINE);
+ glLineWidth(2);
+
+ glBegin(GL_LINES);
+ bp= nu->bp;
+ for(b=0; b<nu->pntsv; b++) {
+ bp1= bp;
+ bp++;
+
+ for(a=nu->pntsu-1; a>0; a--, bp++) {
+ if(bp->hide==0 && bp1->hide==0) {
+ glVertex3fv(bp->vec);
+ glVertex3fv(bp1->vec);
+ }
+ bp1= bp;
+ }
+ }
+
+ if(nu->pntsv > 1) { /* surface */
+
+ ofs= nu->pntsu;
+ for(b=0; b<nu->pntsu; b++) {
+ bp1= nu->bp+b;
+ bp= bp1+ofs;
+ for(a=nu->pntsv-1; a>0; a--, bp+=ofs) {
+ if(bp->hide==0 && bp1->hide==0) {
+ glVertex3fv(bp->vec);
+ glVertex3fv(bp1->vec);
+ }
+ bp1= bp;
+ }
+ }
+ }
+
+ glEnd();
+
+ glColor3ub(0,0,0);
+ glLineWidth(1);
+}
+
static void draw_editnurb(Object *ob, Nurb *nurb, int sel)
{
Nurb *nu;
BPoint *bp, *bp1;
- int a, b, ofs;
-
+ int a, b, ofs, index;
+ Curve *cu= (Curve*)ob->data;
+
+ index= 0;
nu= nurb;
while(nu) {
if(nu->hide==0) {
switch(nu->type) {
case CU_POLY:
- cpack(nurbcol[3]);
+ if (!sel && index== cu->actnu) {
+ /* we should draw active spline highlight below everything */
+ editnurb_draw_active_poly(nu);
+ }
+
+ UI_ThemeColor(TH_NURB_ULINE);
bp= nu->bp;
for(b=0; b<nu->pntsv; b++) {
if(nu->flagu & 1) glBegin(GL_LINE_LOOP);
@@ -4542,6 +4817,10 @@ static void draw_editnurb(Object *ob, Nurb *nurb, int sel)
}
break;
case CU_NURBS:
+ if (!sel && index== cu->actnu) {
+ /* we should draw active spline highlight below everything */
+ editnurb_draw_active_nurbs(nu);
+ }
bp= nu->bp;
for(b=0; b<nu->pntsv; b++) {
@@ -4551,7 +4830,7 @@ static void draw_editnurb(Object *ob, Nurb *nurb, int sel)
if(bp->hide==0 && bp1->hide==0) {
if(sel) {
if( (bp->f1 & SELECT) && ( bp1->f1 & SELECT ) ) {
- cpack(nurbcol[5]);
+ UI_ThemeColor(TH_NURB_SEL_ULINE);
glBegin(GL_LINE_STRIP);
glVertex3fv(bp->vec);
@@ -4562,7 +4841,7 @@ static void draw_editnurb(Object *ob, Nurb *nurb, int sel)
else {
if( (bp->f1 & SELECT) && ( bp1->f1 & SELECT) );
else {
- cpack(nurbcol[1]);
+ UI_ThemeColor(TH_NURB_ULINE);
glBegin(GL_LINE_STRIP);
glVertex3fv(bp->vec);
@@ -4584,7 +4863,7 @@ static void draw_editnurb(Object *ob, Nurb *nurb, int sel)
if(bp->hide==0 && bp1->hide==0) {
if(sel) {
if( (bp->f1 & SELECT) && ( bp1->f1 & SELECT) ) {
- cpack(nurbcol[7]);
+ UI_ThemeColor(TH_NURB_SEL_VLINE);
glBegin(GL_LINE_STRIP);
glVertex3fv(bp->vec);
@@ -4595,7 +4874,7 @@ static void draw_editnurb(Object *ob, Nurb *nurb, int sel)
else {
if( (bp->f1 & SELECT) && ( bp1->f1 & SELECT) );
else {
- cpack(nurbcol[3]);
+ UI_ThemeColor(TH_NURB_VLINE);
glBegin(GL_LINE_STRIP);
glVertex3fv(bp->vec);
@@ -4612,6 +4891,8 @@ static void draw_editnurb(Object *ob, Nurb *nurb, int sel)
break;
}
}
+
+ ++index;
nu= nu->next;
}
}
@@ -4624,6 +4905,7 @@ static void drawnurb(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
Nurb *nu;
BevList *bl;
short hide_handles = (cu->drawflag & CU_HIDE_HANDLES);
+ int index;
// XXX retopo_matrix_update(v3d);
@@ -4633,11 +4915,15 @@ static void drawnurb(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
if(v3d->zbuf) glDisable(GL_DEPTH_TEST);
- /* first non-selected handles */
+ /* first non-selected and active handles */
+ index= 0;
for(nu=nurb; nu; nu=nu->next) {
if(nu->type == CU_BEZIER) {
+ if (index == cu->actnu && !hide_handles)
+ tekenhandlesN_active(nu);
tekenhandlesN(nu, 0, hide_handles);
}
+ ++index;
}
draw_editnurb(ob, nurb, 0);
draw_editnurb(ob, nurb, 1);
@@ -4645,7 +4931,7 @@ static void drawnurb(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
for(nu=nurb; nu; nu=nu->next) {
if(nu->type == CU_BEZIER && (cu->drawflag & CU_HIDE_HANDLES)==0)
tekenhandlesN(nu, 1, hide_handles);
- tekenvertsN(nu, 0, hide_handles);
+ tekenvertsN(nu, 0, hide_handles, NULL);
}
if(v3d->zbuf) glEnable(GL_DEPTH_TEST);
@@ -4667,8 +4953,8 @@ static void drawnurb(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
mul_qt_v3(bevp->quat, vec_a);
mul_qt_v3(bevp->quat, vec_b);
- add_v3_v3v3(vec_a, vec_a, bevp->vec);
- add_v3_v3v3(vec_b, vec_b, bevp->vec);
+ add_v3_v3(vec_a, bevp->vec);
+ add_v3_v3(vec_b, bevp->vec);
VECSUBFAC(vec_a, vec_a, bevp->dir, fac);
VECSUBFAC(vec_b, vec_b, bevp->dir, fac);
@@ -4688,7 +4974,7 @@ static void drawnurb(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
if(v3d->zbuf) glDisable(GL_DEPTH_TEST);
for(nu=nurb; nu; nu=nu->next) {
- tekenvertsN(nu, 1, hide_handles);
+ tekenvertsN(nu, 1, hide_handles, cu->lastsel);
}
if(v3d->zbuf) glEnable(GL_DEPTH_TEST);
@@ -4935,6 +5221,8 @@ static int drawmball(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
}
if(ml==NULL) return 1;
+
+ if(v3d->flag2 & V3D_RENDER_OVERRIDE) return 0;
/* in case solid draw, reset wire colors */
if(ob->flag & SELECT) {
@@ -4986,9 +5274,6 @@ static void draw_forcefield(Scene *scene, Object *ob, RegionView3D *rv3d)
int curcol;
float size;
- if(G.f & G_RENDER_SHADOW)
- return;
-
/* XXX why? */
if(ob!=scene->obedit && (ob->flag & SELECT)) {
if(ob==OBACT) curcol= TH_ACTIVE;
@@ -5077,13 +5362,13 @@ static void draw_forcefield(Scene *scene, Object *ob, RegionView3D *rv3d)
/*path end*/
setlinestyle(3);
- where_on_path(ob, 1.0f, guidevec1, guidevec2, NULL, NULL);
+ where_on_path(ob, 1.0f, guidevec1, guidevec2, NULL, NULL, NULL);
UI_ThemeColorBlend(curcol, TH_BACK, 0.5);
drawcircball(GL_LINE_LOOP, guidevec1, mindist, imat);
/*path beginning*/
setlinestyle(0);
- where_on_path(ob, 0.0f, guidevec1, guidevec2, NULL, NULL);
+ where_on_path(ob, 0.0f, guidevec1, guidevec2, NULL, NULL, NULL);
UI_ThemeColorBlend(curcol, TH_BACK, 0.5);
drawcircball(GL_LINE_LOOP, guidevec1, mindist, imat);
@@ -5236,7 +5521,7 @@ static void draw_bounding_volume(Scene *scene, Object *ob)
bb= mesh_get_bb(ob);
}
else if ELEM3(ob->type, OB_CURVE, OB_SURF, OB_FONT) {
- bb= ( (Curve *)ob->data )->bb;
+ bb= ob->bb ? ob->bb : ( (Curve *)ob->data )->bb;
}
else if(ob->type==OB_MBALL) {
bb= ob->bb;
@@ -5303,9 +5588,22 @@ static void drawSolidSelect(Scene *scene, View3D *v3d, ARegion *ar, Base *base)
if(ELEM3(ob->type, OB_FONT,OB_CURVE, OB_SURF)) {
Curve *cu = ob->data;
- if (displist_has_faces(&cu->disp) && boundbox_clip(rv3d, ob->obmat, cu->bb)) {
+ DerivedMesh *dm = ob->derivedFinal;
+ int hasfaces= 0;
+
+ if (dm) {
+ hasfaces= dm->getNumFaces(dm);
+ } else {
+ hasfaces= displist_has_faces(&cu->disp);
+ }
+
+ if (hasfaces && boundbox_clip(rv3d, ob->obmat, ob->bb ? ob->bb : cu->bb)) {
draw_index_wire= 0;
- drawDispListwire(&cu->disp);
+ if (dm) {
+ draw_mesh_object_outline(v3d, ob, dm);
+ } else {
+ drawDispListwire(&cu->disp);
+ }
draw_index_wire= 1;
}
} else if (ob->type==OB_MBALL) {
@@ -5350,10 +5648,16 @@ static void drawWireExtra(Scene *scene, RegionView3D *rv3d, Object *ob)
if (ELEM3(ob->type, OB_FONT, OB_CURVE, OB_SURF)) {
Curve *cu = ob->data;
- if (boundbox_clip(rv3d, ob->obmat, cu->bb)) {
+ if (boundbox_clip(rv3d, ob->obmat, ob->bb ? ob->bb : cu->bb)) {
if (ob->type==OB_CURVE)
draw_index_wire= 0;
- drawDispListwire(&cu->disp);
+
+ if (ob->derivedFinal) {
+ drawCurveDMWired(ob);
+ } else {
+ drawDispListwire(&cu->disp);
+ }
+
if (ob->type==OB_CURVE)
draw_index_wire= 1;
}
@@ -5404,9 +5708,6 @@ void drawRBpivot(bRigidBodyJointConstraint *data)
float eu[3]= {radsPerDeg*data->axX, radsPerDeg*data->axY, radsPerDeg*data->axZ};
float mat[4][4];
- if(G.f & G_RENDER_SHADOW)
- return;
-
eul_to_mat4(mat,eu);
glLineWidth (4.0f);
setlinestyle(2);
@@ -5457,6 +5758,9 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
if (ob!=scene->obedit) {
if (ob->restrictflag & OB_RESTRICT_VIEW)
return;
+ if ((ob->restrictflag & OB_RESTRICT_RENDER) &&
+ (v3d->flag2 & V3D_RENDER_OVERRIDE))
+ return;
}
/* XXX particles are not safe for simultaneous threaded render */
@@ -5672,7 +5976,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
}
/* draw outline for selected solid objects, mesh does itself */
- if((v3d->flag & V3D_SELECT_OUTLINE) && ob->type!=OB_MESH) {
+ if((v3d->flag & V3D_SELECT_OUTLINE) && ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) && ob->type!=OB_MESH) {
if(dt>OB_WIRE && dt<OB_TEXTURE && (ob->mode & OB_MODE_EDIT)==0 && (flag & DRAW_SCENESET)==0) {
if (!(ob->dtx&OB_DRAWWIRE) && (ob->flag&SELECT) && !(flag&DRAW_PICKING)) {
@@ -5771,9 +6075,11 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
set_inverted_drawing(0);
}
}
- else if(dt==OB_BOUNDBOX)
- draw_bounding_volume(scene, ob);
- else if(boundbox_clip(rv3d, ob->obmat, cu->bb))
+ else if(dt==OB_BOUNDBOX) {
+ if((v3d->flag2 & V3D_RENDER_OVERRIDE && v3d->drawtype >= OB_WIRE)==0)
+ draw_bounding_volume(scene, ob);
+ }
+ else if(boundbox_clip(rv3d, ob->obmat, ob->bb ? ob->bb : cu->bb))
empty_object= drawDispList(scene, v3d, rv3d, base, dt);
break;
@@ -5784,14 +6090,16 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
if(cu->editnurb) {
drawnurb(scene, v3d, rv3d, base, cu->editnurb->first, dt);
}
- else if(dt==OB_BOUNDBOX)
- draw_bounding_volume(scene, ob);
- else if(boundbox_clip(rv3d, ob->obmat, cu->bb)) {
+ else if(dt==OB_BOUNDBOX) {
+ if((v3d->flag2 & V3D_RENDER_OVERRIDE && v3d->drawtype >= OB_WIRE)==0)
+ draw_bounding_volume(scene, ob);
+ }
+ else if(boundbox_clip(rv3d, ob->obmat, ob->bb ? ob->bb : cu->bb)) {
empty_object= drawDispList(scene, v3d, rv3d, base, dt);
if(cu->path)
curve_draw_speed(scene, ob);
- }
+ }
break;
case OB_MBALL:
{
@@ -5799,51 +6107,69 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
if(mb->editelems)
drawmball(scene, v3d, rv3d, base, dt);
- else if(dt==OB_BOUNDBOX)
- draw_bounding_volume(scene, ob);
+ else if(dt==OB_BOUNDBOX) {
+ if((v3d->flag2 & V3D_RENDER_OVERRIDE && v3d->drawtype >= OB_WIRE)==0)
+ draw_bounding_volume(scene, ob);
+ }
else
empty_object= drawmball(scene, v3d, rv3d, base, dt);
break;
}
case OB_EMPTY:
- drawaxes(ob->empty_drawsize, flag, ob->empty_drawtype);
+ if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0)
+ drawaxes(rv3d, rv3d->viewmatob, ob->empty_drawsize, flag, ob->empty_drawtype);
break;
case OB_LAMP:
- drawlamp(scene, v3d, rv3d, base, dt, flag);
- if(dtx || (base->flag & SELECT)) glMultMatrixf(ob->obmat);
+ if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) {
+ drawlamp(scene, v3d, rv3d, base, dt, flag);
+ if(dtx || (base->flag & SELECT)) glMultMatrixf(ob->obmat);
+ }
break;
case OB_CAMERA:
- drawcamera(scene, v3d, rv3d, ob, flag);
+ if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0 || (rv3d->persp==RV3D_CAMOB && v3d->camera==ob)) /* special exception for active camera */
+ drawcamera(scene, v3d, rv3d, ob, flag);
break;
case OB_LATTICE:
- drawlattice(scene, v3d, ob);
+ if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) {
+ drawlattice(scene, v3d, ob);
+ }
break;
case OB_ARMATURE:
- if(dt>OB_WIRE) GPU_enable_material(0, NULL); // we use default material
- empty_object= draw_armature(scene, v3d, ar, base, dt, flag);
- if(dt>OB_WIRE) GPU_disable_material();
+ if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) {
+ if(dt>OB_WIRE) GPU_enable_material(0, NULL); // we use default material
+ empty_object= draw_armature(scene, v3d, ar, base, dt, flag);
+ if(dt>OB_WIRE) GPU_disable_material();
+ }
break;
default:
- drawaxes(1.0, flag, OB_ARROWS);
+ if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) {
+ drawaxes(rv3d, rv3d->viewmatob, 1.0, flag, OB_ARROWS);
+ }
}
- if(ob->soft /*&& flag & OB_SBMOTION*/){
- float mrt[3][3],msc[3][3],mtr[3][3];
- SoftBody *sb = 0;
- float tipw = 0.5f, tiph = 0.5f,drawsize = 4.0f;
- if ((sb= ob->soft)){
- if(sb->solverflags & SBSO_ESTIMATEIPO){
- glLoadMatrixf(rv3d->viewmat);
- copy_m3_m3(msc,sb->lscale);
- copy_m3_m3(mrt,sb->lrot);
- mul_m3_m3m3(mtr,mrt,msc);
- ob_draw_RE_motion(sb->lcom,mtr,tipw,tiph,drawsize);
- glMultMatrixf(ob->obmat);
+ if((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) {
+
+ if(ob->soft /*&& flag & OB_SBMOTION*/){
+ float mrt[3][3],msc[3][3],mtr[3][3];
+ SoftBody *sb = 0;
+ float tipw = 0.5f, tiph = 0.5f,drawsize = 4.0f;
+ if ((sb= ob->soft)){
+ if(sb->solverflags & SBSO_ESTIMATEIPO){
+
+ glLoadMatrixf(rv3d->viewmat);
+ copy_m3_m3(msc,sb->lscale);
+ copy_m3_m3(mrt,sb->lrot);
+ mul_m3_m3m3(mtr,mrt,msc);
+ ob_draw_RE_motion(sb->lcom,mtr,tipw,tiph,drawsize);
+ glMultMatrixf(ob->obmat);
+ }
}
}
- }
- if(ob->pd && ob->pd->forcefield) draw_forcefield(scene, ob, rv3d);
+ if(ob->pd && ob->pd->forcefield) {
+ draw_forcefield(scene, ob, rv3d);
+ }
+ }
/* code for new particle system */
if( (warning_recursive==0) &&
@@ -5852,7 +6178,6 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
(ob!=scene->obedit)
) {
ParticleSystem *psys;
- PTCacheEdit *edit = PE_get_current(scene, ob);
if(col || (ob->flag & SELECT)) cpack(0xFFFFFF); /* for visibility, also while wpaint */
//glDepthMask(GL_FALSE);
@@ -5863,9 +6188,11 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
for(psys=ob->particlesystem.first; psys; psys=psys->next) {
/* run this so that possible child particles get cached */
- if(ob->mode & OB_MODE_PARTICLE_EDIT && ob==OBACT)
+ if(ob->mode & OB_MODE_PARTICLE_EDIT && ob==OBACT) {
+ PTCacheEdit *edit = PE_create_current(scene, ob);
if(edit && edit->psys == psys)
draw_update_ptcache_edit(scene, ob, edit);
+ }
draw_new_particle_system(scene, v3d, rv3d, base, psys, dt);
}
@@ -5885,7 +6212,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
) {
if(ob->mode & OB_MODE_PARTICLE_EDIT && ob==OBACT) {
- PTCacheEdit *edit = PE_get_current(scene, ob);
+ PTCacheEdit *edit = PE_create_current(scene, ob);
if(edit) {
glLoadMatrixf(rv3d->viewmat);
draw_ptcache_edit(scene, v3d, rv3d, ob, edit, dt);
@@ -5999,7 +6326,8 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
}
}
- {
+ if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) {
+
bConstraint *con;
for(con=ob->constraints.first; con; con= con->next)
{
@@ -6010,27 +6338,31 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
drawRBpivot(data);
}
}
- }
- /* draw extra: after normal draw because of makeDispList */
- if(dtx && !(G.f & (G_RENDER_OGL|G_RENDER_SHADOW))) {
- if(dtx & OB_AXIS) {
- drawaxes(1.0f, flag, OB_ARROWS);
- }
- if(dtx & OB_BOUNDBOX) draw_bounding_volume(scene, ob);
- if(dtx & OB_TEXSPACE) drawtexspace(ob);
- if(dtx & OB_DRAWNAME) {
- /* patch for several 3d cards (IBM mostly) that crash on glSelect with text drawing */
- /* but, we also dont draw names for sets or duplicators */
- if(flag == 0) {
- view3d_cached_text_draw_add(0.0f, 0.0f, 0.0f, ob->id.name+2, 10, 0);
+ /* draw extra: after normal draw because of makeDispList */
+ if(dtx && (G.f & G_RENDER_OGL)==0) {
+
+ if(dtx & OB_AXIS) {
+ drawaxes(rv3d, rv3d->viewmatob, 1.0f, flag, OB_ARROWS);
+ }
+ if(dtx & OB_BOUNDBOX) {
+ if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0)
+ draw_bounding_volume(scene, ob);
+ }
+ if(dtx & OB_TEXSPACE) drawtexspace(ob);
+ if(dtx & OB_DRAWNAME) {
+ /* patch for several 3d cards (IBM mostly) that crash on glSelect with text drawing */
+ /* but, we also dont draw names for sets or duplicators */
+ if(flag == 0) {
+ view3d_cached_text_draw_add(0.0f, 0.0f, 0.0f, ob->id.name+2, 10, 0);
+ }
}
+ /*if(dtx & OB_DRAWIMAGE) drawDispListwire(&ob->disp);*/
+ if((dtx & OB_DRAWWIRE) && dt>=OB_SOLID) drawWireExtra(scene, rv3d, ob);
}
- /*if(dtx & OB_DRAWIMAGE) drawDispListwire(&ob->disp);*/
- if((dtx & OB_DRAWWIRE) && dt>=OB_SOLID) drawWireExtra(scene, rv3d, ob);
}
- if(dt<OB_SHADED) {
+ if(dt<OB_SHADED && (v3d->flag2 & V3D_RENDER_OVERRIDE)==0) {
if((ob->gameflag & OB_DYNAMIC) ||
((ob->gameflag & OB_BOUNDS) && (ob->boundtype == OB_BOUND_SPHERE))) {
float imat[4][4], vec[3];
@@ -6053,13 +6385,15 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
if(warning_recursive) return;
if(base->flag & OB_FROMDUPLI) return;
- if(G.f & G_RENDER_SHADOW) return;
+ if(v3d->flag2 & V3D_RENDER_OVERRIDE) return;
/* object centers, need to be drawn in viewmat space for speed, but OK for picking select */
if(ob!=OBACT || !(ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT))) {
int do_draw_center= -1; /* defines below are zero or positive... */
- if((scene->basact)==base)
+ if(v3d->flag2 & V3D_RENDER_OVERRIDE) {
+ /* dont draw */
+ } else if((scene->basact)==base)
do_draw_center= ACTIVE;
else if(base->flag & SELECT)
do_draw_center= SELECT;
@@ -6076,15 +6410,15 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
else if((flag & DRAW_CONSTCOLOR)==0) {
/* we don't draw centers for duplicators and sets */
if(U.obcenter_dia > 0) {
- /* check > 0 otherwise grease pencil can draw into the circle select which is annoying. */
- drawcentercircle(v3d, rv3d, ob->obmat[3], do_draw_center, ob->id.lib || ob->id.us>1);
+ /* check > 0 otherwise grease pencil can draw into the circle select which is annoying. */
+ drawcentercircle(v3d, rv3d, ob->obmat[3], do_draw_center, ob->id.lib || ob->id.us>1);
}
}
}
}
/* not for sets, duplicators or picking */
- if(flag==0 && (!(v3d->flag & V3D_HIDE_HELPLINES))) {
+ if(flag==0 && (v3d->flag & V3D_HIDE_HELPLINES)== 0 && (v3d->flag2 & V3D_RENDER_OVERRIDE)== 0) {
ListBase *list;
/* draw hook center and offset line */
@@ -6225,7 +6559,7 @@ static void bbs_mesh_solid_EM(BMEditMesh *em, Scene *scene, View3D *v3d,
ptrs[1] = (void*)(intptr_t) 1;
dm->drawMappedFaces(dm, bbs_mesh_solid__setSolidDrawOptions, ptrs, 0);
- if( CHECK_OB_DRAWFACEDOT(scene, v3d, ob->dt) ) {
+ if(check_ob_drawface_dot(scene, v3d, ob->dt)) {
glPointSize(UI_GetThemeValuef(TH_FACEDOT_SIZE));
bglBegin(GL_POINTS);
@@ -6345,9 +6679,9 @@ static void draw_object_mesh_instance(Scene *scene, View3D *v3d, RegionView3D *r
if(dt<=OB_WIRE) {
if(dm)
- dm->drawEdges(dm, 1);
+ dm->drawEdges(dm, 1, 0);
else if(edm)
- edm->drawEdges(edm, 1);
+ edm->drawEdges(edm, 1, 0);
}
else {
if(outline)
@@ -6391,7 +6725,7 @@ void draw_object_instance(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object
draw_object_mesh_instance(scene, v3d, rv3d, ob, dt, outline);
break;
case OB_EMPTY:
- drawaxes(ob->empty_drawsize, 0, ob->empty_drawtype);
+ drawaxes(rv3d, rv3d->viewmatob, ob->empty_drawsize, 0, ob->empty_drawtype);
break;
}
}