2011-02-23 10:52:22 +00:00
|
|
|
/*
|
2008-12-18 17:38:21 +00:00
|
|
|
* ***** 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,
|
2010-02-12 13:34:04 +00:00
|
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
2008-12-18 17:38:21 +00:00
|
|
|
*
|
|
|
|
* The Original Code is Copyright (C) 2008 Blender Foundation.
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* Contributor(s): Blender Foundation
|
|
|
|
*
|
|
|
|
* ***** END GPL LICENSE BLOCK *****
|
|
|
|
*/
|
|
|
|
|
2011-02-27 20:29:51 +00:00
|
|
|
/** \file blender/editors/space_view3d/view3d_draw.c
|
|
|
|
* \ingroup spview3d
|
|
|
|
*/
|
|
|
|
|
2008-12-18 17:38:21 +00:00
|
|
|
#include <string.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <math.h>
|
|
|
|
|
|
|
|
#include "DNA_armature_types.h"
|
|
|
|
#include "DNA_camera_types.h"
|
2009-01-07 14:46:50 +00:00
|
|
|
#include "DNA_customdata_types.h"
|
2010-08-04 04:01:27 +00:00
|
|
|
#include "DNA_object_types.h"
|
2008-12-19 12:14:58 +00:00
|
|
|
#include "DNA_group_types.h"
|
2008-12-18 17:38:21 +00:00
|
|
|
#include "DNA_key_types.h"
|
2009-06-08 20:08:19 +00:00
|
|
|
#include "DNA_lamp_types.h"
|
2008-12-18 17:38:21 +00:00
|
|
|
#include "DNA_scene_types.h"
|
|
|
|
#include "DNA_world_types.h"
|
|
|
|
|
|
|
|
#include "MEM_guardedalloc.h"
|
|
|
|
|
|
|
|
#include "BLI_blenlib.h"
|
2009-11-10 20:43:45 +00:00
|
|
|
#include "BLI_math.h"
|
2008-12-18 17:38:21 +00:00
|
|
|
#include "BLI_rand.h"
|
2011-01-07 18:36:47 +00:00
|
|
|
#include "BLI_utildefines.h"
|
2012-09-03 07:37:38 +00:00
|
|
|
#include "BLI_endian_switch.h"
|
2008-12-18 17:38:21 +00:00
|
|
|
|
|
|
|
#include "BKE_anim.h"
|
2011-11-05 13:00:39 +00:00
|
|
|
#include "BKE_camera.h"
|
2.5
New: Custom region draw callbacks.
For Martin: an example is now in space_view3d/view3d_edit.c
On middlemouse rotate view, it draws a small square in center.
It works likes this:
#include "ED_space_api.h"
handle= ED_region_draw_cb_activate(region->type, drawfunc, type)
and to stop it:
ED_region_draw_cb_exit(region->type, handle)
drawfunc is of type (const bContext *C, ARegion *ar)
currently it gets called only as type REGION_DRAW_POST, later we
can add more (PRE, POST_XRAY, POST_2D, etc).
For correct usage, these calls should return leaving view transform
unaltered.
2009-01-09 15:04:52 +00:00
|
|
|
#include "BKE_context.h"
|
2009-01-07 14:46:50 +00:00
|
|
|
#include "BKE_customdata.h"
|
2008-12-18 17:38:21 +00:00
|
|
|
#include "BKE_image.h"
|
|
|
|
#include "BKE_key.h"
|
|
|
|
#include "BKE_object.h"
|
|
|
|
#include "BKE_global.h"
|
2009-08-15 19:48:50 +00:00
|
|
|
#include "BKE_paint.h"
|
2008-12-18 17:38:21 +00:00
|
|
|
#include "BKE_scene.h"
|
2011-05-20 04:14:29 +00:00
|
|
|
#include "BKE_screen.h"
|
2009-08-12 14:11:53 +00:00
|
|
|
#include "BKE_unit.h"
|
2011-11-07 12:55:18 +00:00
|
|
|
#include "BKE_movieclip.h"
|
2008-12-18 17:38:21 +00:00
|
|
|
|
2011-11-02 18:20:53 +00:00
|
|
|
#include "RE_engine.h"
|
2012-07-08 20:36:00 +00:00
|
|
|
#include "RE_pipeline.h" /* make_stars */
|
2008-12-18 17:38:21 +00:00
|
|
|
|
|
|
|
#include "IMB_imbuf_types.h"
|
|
|
|
#include "IMB_imbuf.h"
|
Color Management, Stage 2: Switch color pipeline to use OpenColorIO
Replace old color pipeline which was supporting linear/sRGB color spaces
only with OpenColorIO-based pipeline.
This introduces two configurable color spaces:
- Input color space for images and movie clips. This space is used to convert
images/movies from color space in which file is saved to Blender's linear
space (for float images, byte images are not internally converted, only input
space is stored for such images and used later).
This setting could be found in image/clip data block settings.
- Display color space which defines space in which particular display is working.
This settings could be found in scene's Color Management panel.
When render result is being displayed on the screen, apart from converting image
to display space, some additional conversions could happen.
This conversions are:
- View, which defines tone curve applying before display transformation.
These are different ways to view the image on the same display device.
For example it could be used to emulate film view on sRGB display.
- Exposure affects on image exposure before tone map is applied.
- Gamma is post-display gamma correction, could be used to match particular
display gamma.
- RGB curves are user-defined curves which are applying before display
transformation, could be used for different purposes.
All this settings by default are only applying on render result and does not
affect on other images. If some particular image needs to be affected by this
transformation, "View as Render" setting of image data block should be set to
truth. Movie clips are always affected by all display transformations.
This commit also introduces configurable color space in which sequencer is
working. This setting could be found in scene's Color Management panel and
it should be used if such stuff as grading needs to be done in color space
different from sRGB (i.e. when Film view on sRGB display is use, using VD16
space as sequencer's internal space would make grading working in space
which is close to the space using for display).
Some technical notes:
- Image buffer's float buffer is now always in linear space, even if it was
created from 16bit byte images.
- Space of byte buffer is stored in image buffer's rect_colorspace property.
- Profile of image buffer was removed since it's not longer meaningful.
- OpenGL and GLSL is supposed to always work in sRGB space. It is possible
to support other spaces, but it's quite large project which isn't so
much important.
- Legacy Color Management option disabled is emulated by using None display.
It could have some regressions, but there's no clear way to avoid them.
- If OpenColorIO is disabled on build time, it should make blender behaving
in the same way as previous release with color management enabled.
More details could be found at this page (more details would be added soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.64/Color_Management
--
Thanks to Xavier Thomas, Lukas Toene for initial work on OpenColorIO
integration and to Brecht van Lommel for some further development and code/
usecase review!
2012-09-15 10:05:07 +00:00
|
|
|
#include "IMB_colormanagement.h"
|
2008-12-18 17:38:21 +00:00
|
|
|
|
|
|
|
#include "BIF_gl.h"
|
|
|
|
#include "BIF_glutil.h"
|
|
|
|
|
|
|
|
#include "WM_api.h"
|
2009-05-05 23:10:32 +00:00
|
|
|
#include "BLF_api.h"
|
2008-12-18 17:38:21 +00:00
|
|
|
|
2009-01-07 14:46:50 +00:00
|
|
|
#include "ED_armature.h"
|
2008-12-21 10:33:24 +00:00
|
|
|
#include "ED_keyframing.h"
|
2009-08-26 12:01:15 +00:00
|
|
|
#include "ED_gpencil.h"
|
2008-12-18 17:38:21 +00:00
|
|
|
#include "ED_screen.h"
|
2.5
New: Custom region draw callbacks.
For Martin: an example is now in space_view3d/view3d_edit.c
On middlemouse rotate view, it draws a small square in center.
It works likes this:
#include "ED_space_api.h"
handle= ED_region_draw_cb_activate(region->type, drawfunc, type)
and to stop it:
ED_region_draw_cb_exit(region->type, handle)
drawfunc is of type (const bContext *C, ARegion *ar)
currently it gets called only as type REGION_DRAW_POST, later we
can add more (PRE, POST_XRAY, POST_2D, etc).
For correct usage, these calls should return leaving view transform
unaltered.
2009-01-09 15:04:52 +00:00
|
|
|
#include "ED_space_api.h"
|
2010-02-12 00:44:26 +00:00
|
|
|
#include "ED_screen_types.h"
|
2009-07-08 16:17:47 +00:00
|
|
|
#include "ED_transform.h"
|
2008-12-18 17:38:21 +00:00
|
|
|
|
|
|
|
#include "UI_interface.h"
|
|
|
|
#include "UI_interface_icons.h"
|
|
|
|
#include "UI_resources.h"
|
|
|
|
|
2008-12-19 12:14:58 +00:00
|
|
|
#include "GPU_draw.h"
|
|
|
|
#include "GPU_material.h"
|
2010-03-08 20:08:04 +00:00
|
|
|
#include "GPU_extensions.h"
|
2008-12-19 12:14:58 +00:00
|
|
|
|
2012-07-08 20:36:00 +00:00
|
|
|
#include "view3d_intern.h" /* own include */
|
2008-12-18 17:38:21 +00:00
|
|
|
|
2012-11-16 07:56:47 +00:00
|
|
|
/* handy utility for drawing shapes in the viewport for arbitrary code.
|
|
|
|
* could add lines and points too */
|
|
|
|
// #define DEBUG_DRAW
|
|
|
|
#ifdef DEBUG_DRAW
|
|
|
|
static void bl_debug_draw(void);
|
|
|
|
/* add these locally when using these functions for testing */
|
|
|
|
extern void bl_debug_draw_quad_clear(void);
|
|
|
|
extern void bl_debug_draw_quad_add(const float v0[3], const float v1[3], const float v2[3], const float v3[3]);
|
|
|
|
extern void bl_debug_draw_edge_add(const float v0[3], const float v1[3]);
|
|
|
|
#endif
|
2008-12-18 17:38:21 +00:00
|
|
|
|
|
|
|
static void star_stuff_init_func(void)
|
|
|
|
{
|
2012-04-23 16:29:13 +00:00
|
|
|
cpack(0xFFFFFF);
|
2008-12-18 17:38:21 +00:00
|
|
|
glPointSize(1.0);
|
|
|
|
glBegin(GL_POINTS);
|
|
|
|
}
|
2012-05-08 15:55:29 +00:00
|
|
|
static void star_stuff_vertex_func(float *i)
|
2008-12-18 17:38:21 +00:00
|
|
|
{
|
|
|
|
glVertex3fv(i);
|
|
|
|
}
|
|
|
|
static void star_stuff_term_func(void)
|
|
|
|
{
|
|
|
|
glEnd();
|
|
|
|
}
|
|
|
|
|
|
|
|
void circf(float x, float y, float rad)
|
|
|
|
{
|
|
|
|
GLUquadricObj *qobj = gluNewQuadric();
|
|
|
|
|
|
|
|
gluQuadricDrawStyle(qobj, GLU_FILL);
|
|
|
|
|
|
|
|
glPushMatrix();
|
|
|
|
|
2012-04-11 08:15:13 +00:00
|
|
|
glTranslatef(x, y, 0.0);
|
2008-12-18 17:38:21 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
gluDisk(qobj, 0.0, rad, 32, 1);
|
2008-12-18 17:38:21 +00:00
|
|
|
|
|
|
|
glPopMatrix();
|
|
|
|
|
|
|
|
gluDeleteQuadric(qobj);
|
|
|
|
}
|
|
|
|
|
|
|
|
void circ(float x, float y, float rad)
|
|
|
|
{
|
|
|
|
GLUquadricObj *qobj = gluNewQuadric();
|
|
|
|
|
|
|
|
gluQuadricDrawStyle(qobj, GLU_SILHOUETTE);
|
|
|
|
|
|
|
|
glPushMatrix();
|
|
|
|
|
2012-04-11 08:15:13 +00:00
|
|
|
glTranslatef(x, y, 0.0);
|
2008-12-18 17:38:21 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
gluDisk(qobj, 0.0, rad, 32, 1);
|
2008-12-18 17:38:21 +00:00
|
|
|
|
|
|
|
glPopMatrix();
|
|
|
|
|
|
|
|
gluDeleteQuadric(qobj);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* ********* custom clipping *********** */
|
|
|
|
|
2.5
View3D has been split now in a local part (RegionView3D) and a
per-area part (old View3D). Currently local is:
- view transform
- camera zoom/offset
- gpencil (todo)
- custom clipping planes
Rest is in Area still, like active camera, draw type, layers,
localview, custom centers, around-settings, transform widget,
gridlines, and so on (mostly stuff as available in header).
To see it work; also added new feature for region split,
press SHIFT+ALT+CTRL+S for four-split.
The idea is to make a preset 4-split, configured to stick
to top/right/front views for three views.
Another cool idea to explore is to then box-clip all drawing
based on these 3 views.
Note about the code:
- currently view3d still stores some depricated settings, to
convert from older files. Not all settings are copied over
though, like custom clip planes or the 'lock view to object'.
- since some view3d ops are now on area level, the operators
for it should keep track of that.
Bugfix in transform: quat initialize in operator-invoke missed
one zero.
Als brought back GE to compile for missing Ipos and channels.
2009-01-19 16:54:41 +00:00
|
|
|
static void view3d_draw_clipping(RegionView3D *rv3d)
|
2008-12-18 17:38:21 +00:00
|
|
|
{
|
2012-03-25 23:54:33 +00:00
|
|
|
BoundBox *bb = rv3d->clipbb;
|
2011-09-11 02:50:01 +00:00
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (bb) {
|
2012-06-16 09:18:00 +00:00
|
|
|
static unsigned int clipping_index[6][4] = {
|
|
|
|
{0, 1, 2, 3},
|
|
|
|
{0, 4, 5, 1},
|
|
|
|
{4, 7, 6, 5},
|
|
|
|
{7, 3, 2, 6},
|
|
|
|
{1, 5, 6, 2},
|
|
|
|
{7, 4, 0, 3}
|
|
|
|
};
|
2011-09-11 02:50:01 +00:00
|
|
|
|
2012-05-22 08:24:52 +00:00
|
|
|
/* fill in zero alpha for rendering & re-projection [#31530] */
|
|
|
|
unsigned char col[4];
|
|
|
|
UI_GetThemeColorShade3ubv(TH_BACK, -8, col);
|
|
|
|
col[3] = 0;
|
|
|
|
glColor4ubv(col);
|
2011-09-11 02:50:01 +00:00
|
|
|
|
|
|
|
glEnableClientState(GL_VERTEX_ARRAY);
|
|
|
|
glVertexPointer(3, GL_FLOAT, 0, bb->vec);
|
2012-03-25 23:54:33 +00:00
|
|
|
glDrawElements(GL_QUADS, sizeof(clipping_index) / sizeof(unsigned int), GL_UNSIGNED_INT, clipping_index);
|
2011-09-11 02:50:01 +00:00
|
|
|
glDisableClientState(GL_VERTEX_ARRAY);
|
|
|
|
|
2009-01-20 18:31:11 +00:00
|
|
|
}
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
|
|
|
|
2012-02-28 13:03:56 +00:00
|
|
|
void ED_view3d_clipping_set(RegionView3D *rv3d)
|
2008-12-18 17:38:21 +00:00
|
|
|
{
|
|
|
|
double plane[4];
|
2012-02-28 13:03:56 +00:00
|
|
|
const unsigned int tot = (rv3d->viewlock) ? 4 : 6;
|
|
|
|
unsigned int a;
|
|
|
|
|
|
|
|
for (a = 0; a < tot; a++) {
|
2012-03-09 06:04:17 +00:00
|
|
|
copy_v4db_v4fl(plane, rv3d->clip[a]);
|
2012-02-28 13:03:56 +00:00
|
|
|
glClipPlane(GL_CLIP_PLANE0 + a, plane);
|
|
|
|
glEnable(GL_CLIP_PLANE0 + a);
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-02-28 13:03:56 +00:00
|
|
|
/* use these to temp disable/enable clipping when 'rv3d->rflag & RV3D_CLIPPING' is set */
|
|
|
|
void ED_view3d_clipping_disable(void)
|
2008-12-18 17:38:21 +00:00
|
|
|
{
|
2012-02-28 13:03:56 +00:00
|
|
|
unsigned int a;
|
|
|
|
|
|
|
|
for (a = 0; a < 6; a++) {
|
|
|
|
glDisable(GL_CLIP_PLANE0 + a);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void ED_view3d_clipping_enable(void)
|
|
|
|
{
|
|
|
|
unsigned int a;
|
|
|
|
|
|
|
|
for (a = 0; a < 6; a++) {
|
|
|
|
glEnable(GL_CLIP_PLANE0 + a);
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-12-11 14:29:01 +00:00
|
|
|
static int view3d_clipping_test(const float vec[3], float clip[6][4])
|
2008-12-18 17:38:21 +00:00
|
|
|
{
|
|
|
|
float view[3];
|
2010-07-26 06:34:56 +00:00
|
|
|
copy_v3_v3(view, vec);
|
2011-09-11 02:50:01 +00:00
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (0.0f < clip[0][3] + dot_v3v3(view, clip[0]))
|
|
|
|
if (0.0f < clip[1][3] + dot_v3v3(view, clip[1]))
|
|
|
|
if (0.0f < clip[2][3] + dot_v3v3(view, clip[2]))
|
|
|
|
if (0.0f < clip[3][3] + dot_v3v3(view, clip[3]))
|
2008-12-18 17:38:21 +00:00
|
|
|
return 0;
|
2009-11-21 16:44:05 +00:00
|
|
|
|
2008-12-18 17:38:21 +00:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2012-02-28 13:03:56 +00:00
|
|
|
/* for 'local' ED_view3d_clipping_local must run first
|
2009-11-21 16:44:05 +00:00
|
|
|
* then all comparisons can be done in localspace */
|
2012-02-28 13:03:56 +00:00
|
|
|
int ED_view3d_clipping_test(RegionView3D *rv3d, const float vec[3], const int is_local)
|
2009-11-21 16:44:05 +00:00
|
|
|
{
|
2012-02-28 13:03:56 +00:00
|
|
|
return view3d_clipping_test(vec, is_local ? rv3d->clip_local : rv3d->clip);
|
2009-11-21 16:44:05 +00:00
|
|
|
}
|
|
|
|
|
2008-12-18 17:38:21 +00:00
|
|
|
/* ********* end custom clipping *********** */
|
|
|
|
|
|
|
|
|
2012-03-08 11:57:51 +00:00
|
|
|
static void drawgrid_draw(ARegion *ar, double wx, double wy, double x, double y, double dx)
|
2010-07-30 08:43:22 +00:00
|
|
|
{
|
2012-03-08 11:57:51 +00:00
|
|
|
double verts[2][2];
|
2010-07-30 08:43:22 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
x += (wx);
|
|
|
|
y += (wy);
|
2010-07-30 08:43:22 +00:00
|
|
|
|
2011-09-11 04:31:09 +00:00
|
|
|
/* set fixed 'Y' */
|
2012-03-25 23:54:33 +00:00
|
|
|
verts[0][1] = 0.0f;
|
|
|
|
verts[1][1] = (double)ar->winy;
|
2010-07-30 08:43:22 +00:00
|
|
|
|
2011-09-11 04:31:09 +00:00
|
|
|
/* iter over 'X' */
|
2012-09-30 06:12:47 +00:00
|
|
|
verts[0][0] = verts[1][0] = x - dx * floor(x / dx);
|
2011-09-11 04:31:09 +00:00
|
|
|
glEnableClientState(GL_VERTEX_ARRAY);
|
2012-03-08 11:57:51 +00:00
|
|
|
glVertexPointer(2, GL_DOUBLE, 0, verts);
|
2008-12-18 17:38:21 +00:00
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
while (verts[0][0] < ar->winx) {
|
2011-09-11 04:31:09 +00:00
|
|
|
glDrawArrays(GL_LINES, 0, 2);
|
|
|
|
verts[0][0] = verts[1][0] = verts[0][0] + dx;
|
|
|
|
}
|
2008-12-18 17:38:21 +00:00
|
|
|
|
2011-09-11 04:31:09 +00:00
|
|
|
/* set fixed 'X' */
|
2012-03-25 23:54:33 +00:00
|
|
|
verts[0][0] = 0.0f;
|
|
|
|
verts[1][0] = (double)ar->winx;
|
2010-07-30 08:43:22 +00:00
|
|
|
|
2011-09-11 04:31:09 +00:00
|
|
|
/* iter over 'Y' */
|
2012-09-30 06:12:47 +00:00
|
|
|
verts[0][1] = verts[1][1] = y - dx * floor(y / dx);
|
2012-02-22 16:52:06 +00:00
|
|
|
while (verts[0][1] < ar->winy) {
|
2011-09-11 04:31:09 +00:00
|
|
|
glDrawArrays(GL_LINES, 0, 2);
|
|
|
|
verts[0][1] = verts[1][1] = verts[0][1] + dx;
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
|
|
|
|
2011-09-11 04:31:09 +00:00
|
|
|
glDisableClientState(GL_VERTEX_ARRAY);
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
|
|
|
|
2012-05-24 21:58:12 +00:00
|
|
|
#define GRID_MIN_PX_D 6.0
|
|
|
|
#define GRID_MIN_PX_F 6.0f
|
2009-08-12 14:11:53 +00:00
|
|
|
|
2010-11-23 14:14:06 +00:00
|
|
|
static void drawgrid(UnitSettings *unit, ARegion *ar, View3D *v3d, const char **grid_unit)
|
2008-12-18 17:38:21 +00:00
|
|
|
{
|
|
|
|
/* extern short bgpicmode; */
|
2012-03-25 23:54:33 +00:00
|
|
|
RegionView3D *rv3d = ar->regiondata;
|
2012-03-08 11:57:51 +00:00
|
|
|
double wx, wy, x, y, fw, fx, fy, dx;
|
|
|
|
double vec4[4];
|
2010-12-20 03:59:22 +00:00
|
|
|
unsigned char col[3], col2[3];
|
2009-08-12 14:11:53 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
fx = rv3d->persmat[3][0];
|
|
|
|
fy = rv3d->persmat[3][1];
|
|
|
|
fw = rv3d->persmat[3][3];
|
2008-12-18 17:38:21 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
wx = (ar->winx / 2.0); /* because of rounding errors, grid at wrong location */
|
|
|
|
wy = (ar->winy / 2.0);
|
2008-12-18 17:38:21 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
x = (wx) * fx / fw;
|
|
|
|
y = (wy) * fy / fw;
|
2008-12-18 17:38:21 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
vec4[0] = vec4[1] = v3d->grid;
|
2009-08-12 17:02:03 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
vec4[2] = 0.0;
|
|
|
|
vec4[3] = 1.0;
|
2012-03-08 11:57:51 +00:00
|
|
|
mul_m4_v4d(rv3d->persmat, vec4);
|
2012-03-25 23:54:33 +00:00
|
|
|
fx = vec4[0];
|
|
|
|
fy = vec4[1];
|
|
|
|
fw = vec4[3];
|
2008-12-18 17:38:21 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
dx = fabs(x - (wx) * fx / fw);
|
|
|
|
if (dx == 0) dx = fabs(y - (wy) * fy / fw);
|
2008-12-18 17:38:21 +00:00
|
|
|
|
2012-07-08 20:36:00 +00:00
|
|
|
glDepthMask(0); /* disable write in zbuffer */
|
2008-12-18 17:38:21 +00:00
|
|
|
|
|
|
|
/* check zoom out */
|
|
|
|
UI_ThemeColor(TH_GRID);
|
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (unit->system) {
|
2009-08-12 17:02:03 +00:00
|
|
|
/* Use GRID_MIN_PX*2 for units because very very small grid
|
|
|
|
* items are less useful when dealing with units */
|
2009-08-12 14:11:53 +00:00
|
|
|
void *usys;
|
|
|
|
int len, i;
|
2012-03-08 11:57:51 +00:00
|
|
|
double dx_scalar;
|
2009-08-12 14:11:53 +00:00
|
|
|
float blend_fac;
|
|
|
|
|
2009-08-13 07:37:41 +00:00
|
|
|
bUnit_GetSystem(&usys, &len, unit->system, B_UNIT_LENGTH);
|
2009-08-12 14:11:53 +00:00
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (usys) {
|
2012-03-25 23:54:33 +00:00
|
|
|
i = len;
|
2012-02-22 16:52:06 +00:00
|
|
|
while (i--) {
|
2012-03-25 23:54:33 +00:00
|
|
|
double scalar = bUnit_GetScaler(usys, i);
|
2009-08-12 14:11:53 +00:00
|
|
|
|
2012-05-24 21:58:12 +00:00
|
|
|
dx_scalar = dx * scalar / (double)unit->scale_length;
|
|
|
|
if (dx_scalar < (GRID_MIN_PX_D * 2.0))
|
2009-08-12 14:11:53 +00:00
|
|
|
continue;
|
|
|
|
|
2009-08-12 17:02:03 +00:00
|
|
|
/* Store the smallest drawn grid size units name so users know how big each grid cell is */
|
2012-03-25 23:54:33 +00:00
|
|
|
if (*grid_unit == NULL) {
|
|
|
|
*grid_unit = bUnit_GetNameDisplay(usys, i);
|
2012-05-24 21:58:12 +00:00
|
|
|
rv3d->gridview = (float)((scalar * (double)v3d->grid) / (double)unit->scale_length);
|
2009-08-12 17:02:03 +00:00
|
|
|
}
|
2012-05-24 21:58:12 +00:00
|
|
|
blend_fac = 1.0f - ((GRID_MIN_PX_F * 2.0f) / (float)dx_scalar);
|
2009-08-12 14:11:53 +00:00
|
|
|
|
|
|
|
/* tweak to have the fade a bit nicer */
|
2012-03-25 23:54:33 +00:00
|
|
|
blend_fac = (blend_fac * blend_fac) * 2.0f;
|
2009-08-12 14:11:53 +00:00
|
|
|
CLAMP(blend_fac, 0.3f, 1.0f);
|
|
|
|
|
|
|
|
|
|
|
|
UI_ThemeColorBlend(TH_BACK, TH_GRID, blend_fac);
|
|
|
|
|
|
|
|
drawgrid_draw(ar, wx, wy, x, y, dx_scalar);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
2009-08-12 17:02:03 +00:00
|
|
|
short sublines = v3d->gridsubdiv;
|
|
|
|
|
2012-05-24 21:58:12 +00:00
|
|
|
if (dx < GRID_MIN_PX_D) {
|
2012-03-25 23:54:33 +00:00
|
|
|
rv3d->gridview *= sublines;
|
|
|
|
dx *= sublines;
|
|
|
|
|
2012-05-24 21:58:12 +00:00
|
|
|
if (dx < GRID_MIN_PX_D) {
|
2012-03-25 23:54:33 +00:00
|
|
|
rv3d->gridview *= sublines;
|
|
|
|
dx *= sublines;
|
|
|
|
|
2012-05-24 21:58:12 +00:00
|
|
|
if (dx < GRID_MIN_PX_D) {
|
2012-03-25 23:54:33 +00:00
|
|
|
rv3d->gridview *= sublines;
|
|
|
|
dx *= sublines;
|
2012-10-07 09:48:59 +00:00
|
|
|
if (dx < GRID_MIN_PX_D) {
|
|
|
|
/* pass */
|
|
|
|
}
|
2009-08-12 14:11:53 +00:00
|
|
|
else {
|
|
|
|
UI_ThemeColor(TH_GRID);
|
|
|
|
drawgrid_draw(ar, wx, wy, x, y, dx);
|
|
|
|
}
|
|
|
|
}
|
2012-07-08 20:36:00 +00:00
|
|
|
else { /* start blending out */
|
2012-05-24 21:58:12 +00:00
|
|
|
UI_ThemeColorBlend(TH_BACK, TH_GRID, dx / (GRID_MIN_PX_D * 6.0));
|
2008-12-18 17:38:21 +00:00
|
|
|
drawgrid_draw(ar, wx, wy, x, y, dx);
|
2009-08-12 14:11:53 +00:00
|
|
|
|
|
|
|
UI_ThemeColor(TH_GRID);
|
2012-03-25 23:54:33 +00:00
|
|
|
drawgrid_draw(ar, wx, wy, x, y, sublines * dx);
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
|
|
|
}
|
2012-07-08 20:36:00 +00:00
|
|
|
else { /* start blending out (GRID_MIN_PX < dx < (GRID_MIN_PX*10)) */
|
2012-05-24 21:58:12 +00:00
|
|
|
UI_ThemeColorBlend(TH_BACK, TH_GRID, dx / (GRID_MIN_PX_D * 6.0));
|
2008-12-18 17:38:21 +00:00
|
|
|
drawgrid_draw(ar, wx, wy, x, y, dx);
|
2009-08-12 14:11:53 +00:00
|
|
|
|
2008-12-18 17:38:21 +00:00
|
|
|
UI_ThemeColor(TH_GRID);
|
2012-03-25 23:54:33 +00:00
|
|
|
drawgrid_draw(ar, wx, wy, x, y, sublines * dx);
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
|
|
|
}
|
2009-08-12 14:11:53 +00:00
|
|
|
else {
|
2012-07-08 20:36:00 +00:00
|
|
|
if (dx > (GRID_MIN_PX_D * 10.0)) { /* start blending in */
|
2012-03-25 23:54:33 +00:00
|
|
|
rv3d->gridview /= sublines;
|
|
|
|
dx /= sublines;
|
2012-07-08 20:36:00 +00:00
|
|
|
if (dx > (GRID_MIN_PX_D * 10.0)) { /* start blending in */
|
2012-03-25 23:54:33 +00:00
|
|
|
rv3d->gridview /= sublines;
|
|
|
|
dx /= sublines;
|
2012-05-24 21:58:12 +00:00
|
|
|
if (dx > (GRID_MIN_PX_D * 10.0)) {
|
2009-08-12 14:11:53 +00:00
|
|
|
UI_ThemeColor(TH_GRID);
|
|
|
|
drawgrid_draw(ar, wx, wy, x, y, dx);
|
|
|
|
}
|
|
|
|
else {
|
2012-05-24 21:58:12 +00:00
|
|
|
UI_ThemeColorBlend(TH_BACK, TH_GRID, dx / (GRID_MIN_PX_D * 6.0));
|
2009-08-12 14:11:53 +00:00
|
|
|
drawgrid_draw(ar, wx, wy, x, y, dx);
|
|
|
|
UI_ThemeColor(TH_GRID);
|
2012-03-25 23:54:33 +00:00
|
|
|
drawgrid_draw(ar, wx, wy, x, y, dx * sublines);
|
2009-08-12 14:11:53 +00:00
|
|
|
}
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
|
|
|
else {
|
2012-05-24 21:58:12 +00:00
|
|
|
UI_ThemeColorBlend(TH_BACK, TH_GRID, dx / (GRID_MIN_PX_D * 6.0));
|
2008-12-18 17:38:21 +00:00
|
|
|
drawgrid_draw(ar, wx, wy, x, y, dx);
|
|
|
|
UI_ThemeColor(TH_GRID);
|
2012-03-25 23:54:33 +00:00
|
|
|
drawgrid_draw(ar, wx, wy, x, y, dx * sublines);
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
2012-05-24 21:58:12 +00:00
|
|
|
UI_ThemeColorBlend(TH_BACK, TH_GRID, dx / (GRID_MIN_PX_D * 6.0));
|
2008-12-18 17:38:21 +00:00
|
|
|
drawgrid_draw(ar, wx, wy, x, y, dx);
|
2009-08-12 14:11:53 +00:00
|
|
|
UI_ThemeColor(TH_GRID);
|
2012-03-25 23:54:33 +00:00
|
|
|
drawgrid_draw(ar, wx, wy, x, y, dx * sublines);
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-08-12 14:11:53 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
x += (wx);
|
|
|
|
y += (wy);
|
2008-12-18 17:38:21 +00:00
|
|
|
UI_GetThemeColor3ubv(TH_GRID, col);
|
|
|
|
|
|
|
|
setlinestyle(0);
|
|
|
|
|
|
|
|
/* center cross */
|
2010-12-20 13:32:26 +00:00
|
|
|
/* horizontal line */
|
2012-03-25 23:54:33 +00:00
|
|
|
if (ELEM(rv3d->view, RV3D_VIEW_RIGHT, RV3D_VIEW_LEFT))
|
2010-12-20 03:59:22 +00:00
|
|
|
UI_make_axis_color(col, col2, 'Y');
|
2010-12-20 13:32:26 +00:00
|
|
|
else UI_make_axis_color(col, col2, 'X');
|
2010-12-20 03:59:22 +00:00
|
|
|
glColor3ubv(col2);
|
2008-12-18 17:38:21 +00:00
|
|
|
|
|
|
|
fdrawline(0.0, y, (float)ar->winx, y);
|
|
|
|
|
2010-12-20 13:32:26 +00:00
|
|
|
/* vertical line */
|
2012-03-25 23:54:33 +00:00
|
|
|
if (ELEM(rv3d->view, RV3D_VIEW_TOP, RV3D_VIEW_BOTTOM))
|
2010-12-20 03:59:22 +00:00
|
|
|
UI_make_axis_color(col, col2, 'Y');
|
|
|
|
else UI_make_axis_color(col, col2, 'Z');
|
|
|
|
glColor3ubv(col2);
|
2008-12-18 17:38:21 +00:00
|
|
|
|
|
|
|
fdrawline(x, 0.0, x, (float)ar->winy);
|
|
|
|
|
2012-07-08 20:36:00 +00:00
|
|
|
glDepthMask(1); /* enable write in zbuffer */
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
2009-08-12 14:11:53 +00:00
|
|
|
#undef GRID_MIN_PX
|
2008-12-18 17:38:21 +00:00
|
|
|
|
2012-12-09 10:48:18 +00:00
|
|
|
/** could move this elsewhere, but tied into #ED_view3d_grid_scale */
|
|
|
|
float ED_scene_grid_scale(Scene *scene, const char **grid_unit)
|
2008-12-18 17:38:21 +00:00
|
|
|
{
|
2010-11-23 17:14:03 +00:00
|
|
|
/* apply units */
|
2012-02-22 16:52:06 +00:00
|
|
|
if (scene->unit.system) {
|
2010-11-23 17:14:03 +00:00
|
|
|
void *usys;
|
|
|
|
int len;
|
|
|
|
|
|
|
|
bUnit_GetSystem(&usys, &len, scene->unit.system, B_UNIT_LENGTH);
|
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (usys) {
|
2012-03-25 23:54:33 +00:00
|
|
|
int i = bUnit_GetBaseUnit(usys);
|
2012-05-31 16:04:03 +00:00
|
|
|
if (grid_unit)
|
|
|
|
*grid_unit = bUnit_GetNameDisplay(usys, i);
|
2012-12-09 10:48:18 +00:00
|
|
|
return (float)bUnit_GetScaler(usys, i) / scene->unit.scale_length;
|
2010-11-23 17:14:03 +00:00
|
|
|
}
|
|
|
|
}
|
2011-09-11 04:31:09 +00:00
|
|
|
|
2012-12-09 10:48:18 +00:00
|
|
|
return 1.0f;
|
|
|
|
}
|
|
|
|
|
|
|
|
float ED_view3d_grid_scale(Scene *scene, View3D *v3d, const char **grid_unit)
|
|
|
|
{
|
|
|
|
return v3d->grid * ED_scene_grid_scale(scene, grid_unit);
|
2012-05-31 16:04:03 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void drawfloor(Scene *scene, View3D *v3d, const char **grid_unit)
|
|
|
|
{
|
|
|
|
float grid, grid_scale;
|
|
|
|
unsigned char col_grid[3];
|
|
|
|
const int gridlines = v3d->gridlines / 2;
|
|
|
|
|
|
|
|
if (v3d->gridlines < 3) return;
|
|
|
|
|
|
|
|
/* use 'grid_scale' instead of 'v3d->grid' from now on */
|
|
|
|
grid_scale = ED_view3d_grid_scale(scene, v3d, grid_unit);
|
2012-03-25 23:54:33 +00:00
|
|
|
grid = gridlines * grid_scale;
|
2010-11-23 17:14:03 +00:00
|
|
|
|
2012-07-08 20:36:00 +00:00
|
|
|
if (v3d->zbuf && scene->obedit)
|
|
|
|
glDepthMask(0); /* for zbuffer-select */
|
2011-09-11 04:31:09 +00:00
|
|
|
|
|
|
|
UI_GetThemeColor3ubv(TH_GRID, col_grid);
|
|
|
|
|
2008-12-18 17:38:21 +00:00
|
|
|
/* draw the Y axis and/or grid lines */
|
2012-02-22 16:52:06 +00:00
|
|
|
if (v3d->gridflag & V3D_SHOW_FLOOR) {
|
2012-03-25 23:54:33 +00:00
|
|
|
float vert[4][3] = {{0.0f}};
|
2011-09-11 04:56:32 +00:00
|
|
|
unsigned char col_bg[3];
|
|
|
|
unsigned char col_grid_emphasise[3], col_grid_light[3];
|
2011-09-11 05:50:44 +00:00
|
|
|
int a;
|
2012-03-25 23:54:33 +00:00
|
|
|
int prev_emphasise = -1;
|
2011-09-11 04:56:32 +00:00
|
|
|
|
|
|
|
UI_GetThemeColor3ubv(TH_BACK, col_bg);
|
|
|
|
|
|
|
|
/* emphasise division lines lighter instead of darker, if background is darker than grid */
|
|
|
|
UI_GetColorPtrShade3ubv(col_grid, col_grid_light, 10);
|
|
|
|
UI_GetColorPtrShade3ubv(col_grid, col_grid_emphasise,
|
2012-03-25 23:54:33 +00:00
|
|
|
(((col_grid[0] + col_grid[1] + col_grid[2]) + 30) >
|
|
|
|
(col_bg[0] + col_bg[1] + col_bg[2])) ? 20 : -10);
|
2011-09-11 04:56:32 +00:00
|
|
|
|
2011-09-11 05:50:44 +00:00
|
|
|
/* set fixed axis */
|
2012-03-25 23:54:33 +00:00
|
|
|
vert[0][0] = vert[2][1] = grid;
|
|
|
|
vert[1][0] = vert[3][1] = -grid;
|
2011-09-11 05:50:44 +00:00
|
|
|
|
|
|
|
glEnableClientState(GL_VERTEX_ARRAY);
|
|
|
|
glVertexPointer(3, GL_FLOAT, 0, vert);
|
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
for (a = -gridlines; a <= gridlines; a++) {
|
|
|
|
const float line = a * grid_scale;
|
|
|
|
const int is_emphasise = (a % 10) == 0;
|
2011-09-11 05:10:27 +00:00
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (is_emphasise != prev_emphasise) {
|
2011-09-11 05:50:44 +00:00
|
|
|
glColor3ubv(is_emphasise ? col_grid_emphasise : col_grid_light);
|
2012-03-25 23:54:33 +00:00
|
|
|
prev_emphasise = is_emphasise;
|
2011-09-11 05:50:44 +00:00
|
|
|
}
|
2011-09-11 04:56:32 +00:00
|
|
|
|
2011-09-11 05:50:44 +00:00
|
|
|
/* set variable axis */
|
2012-06-06 14:38:47 +00:00
|
|
|
vert[0][1] = vert[1][1] = vert[2][0] = vert[3][0] = line;
|
2011-09-11 05:10:27 +00:00
|
|
|
|
2011-09-11 05:50:44 +00:00
|
|
|
glDrawArrays(GL_LINES, 0, 4);
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
2011-09-11 05:50:44 +00:00
|
|
|
|
|
|
|
glDisableClientState(GL_VERTEX_ARRAY);
|
|
|
|
|
|
|
|
GPU_print_error("sdsd");
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
|
|
|
|
2012-10-21 05:46:41 +00:00
|
|
|
/* draw the Z axis line */
|
2008-12-18 17:38:21 +00:00
|
|
|
/* check for the 'show Z axis' preference */
|
2011-09-11 04:56:32 +00:00
|
|
|
if (v3d->gridflag & (V3D_SHOW_X | V3D_SHOW_Y | V3D_SHOW_Z)) {
|
|
|
|
int axis;
|
2012-03-25 23:54:33 +00:00
|
|
|
for (axis = 0; axis < 3; axis++) {
|
|
|
|
if (v3d->gridflag & (V3D_SHOW_X << axis)) {
|
|
|
|
float vert[3];
|
|
|
|
unsigned char tcol[3];
|
|
|
|
|
|
|
|
UI_make_axis_color(col_grid, tcol, 'X' + axis);
|
|
|
|
glColor3ubv(tcol);
|
|
|
|
|
|
|
|
glBegin(GL_LINE_STRIP);
|
|
|
|
zero_v3(vert);
|
|
|
|
vert[axis] = grid;
|
|
|
|
glVertex3fv(vert);
|
|
|
|
vert[axis] = -grid;
|
|
|
|
glVertex3fv(vert);
|
|
|
|
glEnd();
|
|
|
|
}
|
2011-09-11 04:56:32 +00:00
|
|
|
}
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
|
|
|
|
Axis Colours are now Themeable
This commit allows you to set the RGB <-> XYZ axis colours used for things like
the mini axis indicator, grid axis indicators, manipulators, transform
constraint indicators, F-Curves (when using XYZ to RGB colouring option), and
perhaps something else I've missed. Previously, these places all used hardcoded
defines (220 * i/j/k), but the readability of these colours was often quite
poor, especially when used with certain themes.
The settings for these colours can be found under the "User Interface" section
of the themes (i.e. same set of colours is used across editors). I could have
made these per editor, but since it's unlikely that these will need to be too
different across editors in practice (+ being easier to version patch), they are
stored under the UI section.
2012-11-09 06:36:11 +00:00
|
|
|
if (v3d->zbuf && scene->obedit) glDepthMask(1);
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
|
|
|
|
Holiday coding log :)
Nice formatted version (pictures soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.66/Usability
Short list of main changes:
- Transparent region option (over main region), added code to blend in/out such panels.
- Min size window now 640 x 480
- Fixed DPI for ui - lots of cleanup and changes everywhere. Icon image need correct size still, layer-in-use icon needs remake.
- Macbook retina support, use command line --no-native-pixels to disable it
- Timeline Marker label was drawing wrong
- Trackpad and magic mouse: supports zoom (hold ctrl)
- Fix for splash position: removed ghost function and made window size update after creation immediate
- Fast undo buffer save now adds UI as well. Could be checked for regular file save even...
Quit.blend and temp file saving use this now.
- Dixed filename in window on reading quit.blend or temp saves, and they now add a warning in window title: "(Recovered)"
- New Userpref option "Keep Session" - this always saves quit.blend, and loads on start.
This allows keeping UI and data without actual saves, until you actually save.
When you load startup.blend and quit, it recognises the quit.blend as a startup (no file name in header)
- Added 3D view copy/paste buffers (selected objects). Shortcuts ctrl-c, ctrl-v (OSX, cmd-c, cmd-v).
Coded partial file saving for it. Could be used for other purposes. Todo: use OS clipboards.
- User preferences (themes, keymaps, user settings) now can be saved as a separate file.
Old option is called "Save Startup File" the new one "Save User Settings".
To visualise this difference, the 'save startup file' button has been removed from user preferences window. That option is available as CTRL+U and in File menu still.
- OSX: fixed bug that stopped giving mouse events outside window.
This also fixes "Continuous Grab" for OSX. (error since 2009)
2012-12-12 18:58:11 +00:00
|
|
|
|
2008-12-18 17:38:21 +00:00
|
|
|
static void drawcursor(Scene *scene, ARegion *ar, View3D *v3d)
|
|
|
|
{
|
2012-10-04 17:52:12 +00:00
|
|
|
int co[2];
|
|
|
|
|
2012-03-18 07:38:51 +00:00
|
|
|
/* we don't want the clipping for cursor */
|
2012-10-07 14:00:18 +00:00
|
|
|
if (ED_view3d_project_int_global(ar, give_cursor(scene, v3d), co, V3D_PROJ_TEST_NOP) == V3D_PROJ_RET_OK) {
|
2012-12-13 10:37:04 +00:00
|
|
|
const float f5 = 0.25f * U.widget_unit;
|
|
|
|
const float f10 = 0.5f * U.widget_unit;
|
|
|
|
const float f20 = U.widget_unit;
|
Holiday coding log :)
Nice formatted version (pictures soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.66/Usability
Short list of main changes:
- Transparent region option (over main region), added code to blend in/out such panels.
- Min size window now 640 x 480
- Fixed DPI for ui - lots of cleanup and changes everywhere. Icon image need correct size still, layer-in-use icon needs remake.
- Macbook retina support, use command line --no-native-pixels to disable it
- Timeline Marker label was drawing wrong
- Trackpad and magic mouse: supports zoom (hold ctrl)
- Fix for splash position: removed ghost function and made window size update after creation immediate
- Fast undo buffer save now adds UI as well. Could be checked for regular file save even...
Quit.blend and temp file saving use this now.
- Dixed filename in window on reading quit.blend or temp saves, and they now add a warning in window title: "(Recovered)"
- New Userpref option "Keep Session" - this always saves quit.blend, and loads on start.
This allows keeping UI and data without actual saves, until you actually save.
When you load startup.blend and quit, it recognises the quit.blend as a startup (no file name in header)
- Added 3D view copy/paste buffers (selected objects). Shortcuts ctrl-c, ctrl-v (OSX, cmd-c, cmd-v).
Coded partial file saving for it. Could be used for other purposes. Todo: use OS clipboards.
- User preferences (themes, keymaps, user settings) now can be saved as a separate file.
Old option is called "Save Startup File" the new one "Save User Settings".
To visualise this difference, the 'save startup file' button has been removed from user preferences window. That option is available as CTRL+U and in File menu still.
- OSX: fixed bug that stopped giving mouse events outside window.
This also fixes "Continuous Grab" for OSX. (error since 2009)
2012-12-12 18:58:11 +00:00
|
|
|
|
2008-12-18 17:38:21 +00:00
|
|
|
setlinestyle(0);
|
|
|
|
cpack(0xFF);
|
Holiday coding log :)
Nice formatted version (pictures soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.66/Usability
Short list of main changes:
- Transparent region option (over main region), added code to blend in/out such panels.
- Min size window now 640 x 480
- Fixed DPI for ui - lots of cleanup and changes everywhere. Icon image need correct size still, layer-in-use icon needs remake.
- Macbook retina support, use command line --no-native-pixels to disable it
- Timeline Marker label was drawing wrong
- Trackpad and magic mouse: supports zoom (hold ctrl)
- Fix for splash position: removed ghost function and made window size update after creation immediate
- Fast undo buffer save now adds UI as well. Could be checked for regular file save even...
Quit.blend and temp file saving use this now.
- Dixed filename in window on reading quit.blend or temp saves, and they now add a warning in window title: "(Recovered)"
- New Userpref option "Keep Session" - this always saves quit.blend, and loads on start.
This allows keeping UI and data without actual saves, until you actually save.
When you load startup.blend and quit, it recognises the quit.blend as a startup (no file name in header)
- Added 3D view copy/paste buffers (selected objects). Shortcuts ctrl-c, ctrl-v (OSX, cmd-c, cmd-v).
Coded partial file saving for it. Could be used for other purposes. Todo: use OS clipboards.
- User preferences (themes, keymaps, user settings) now can be saved as a separate file.
Old option is called "Save Startup File" the new one "Save User Settings".
To visualise this difference, the 'save startup file' button has been removed from user preferences window. That option is available as CTRL+U and in File menu still.
- OSX: fixed bug that stopped giving mouse events outside window.
This also fixes "Continuous Grab" for OSX. (error since 2009)
2012-12-12 18:58:11 +00:00
|
|
|
circ((float)co[0], (float)co[1], f10);
|
|
|
|
setlinestyle(4);
|
2008-12-18 17:38:21 +00:00
|
|
|
cpack(0xFFFFFF);
|
Holiday coding log :)
Nice formatted version (pictures soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.66/Usability
Short list of main changes:
- Transparent region option (over main region), added code to blend in/out such panels.
- Min size window now 640 x 480
- Fixed DPI for ui - lots of cleanup and changes everywhere. Icon image need correct size still, layer-in-use icon needs remake.
- Macbook retina support, use command line --no-native-pixels to disable it
- Timeline Marker label was drawing wrong
- Trackpad and magic mouse: supports zoom (hold ctrl)
- Fix for splash position: removed ghost function and made window size update after creation immediate
- Fast undo buffer save now adds UI as well. Could be checked for regular file save even...
Quit.blend and temp file saving use this now.
- Dixed filename in window on reading quit.blend or temp saves, and they now add a warning in window title: "(Recovered)"
- New Userpref option "Keep Session" - this always saves quit.blend, and loads on start.
This allows keeping UI and data without actual saves, until you actually save.
When you load startup.blend and quit, it recognises the quit.blend as a startup (no file name in header)
- Added 3D view copy/paste buffers (selected objects). Shortcuts ctrl-c, ctrl-v (OSX, cmd-c, cmd-v).
Coded partial file saving for it. Could be used for other purposes. Todo: use OS clipboards.
- User preferences (themes, keymaps, user settings) now can be saved as a separate file.
Old option is called "Save Startup File" the new one "Save User Settings".
To visualise this difference, the 'save startup file' button has been removed from user preferences window. That option is available as CTRL+U and in File menu still.
- OSX: fixed bug that stopped giving mouse events outside window.
This also fixes "Continuous Grab" for OSX. (error since 2009)
2012-12-12 18:58:11 +00:00
|
|
|
circ((float)co[0], (float)co[1], f10);
|
2008-12-18 17:38:21 +00:00
|
|
|
setlinestyle(0);
|
|
|
|
cpack(0x0);
|
|
|
|
|
Holiday coding log :)
Nice formatted version (pictures soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.66/Usability
Short list of main changes:
- Transparent region option (over main region), added code to blend in/out such panels.
- Min size window now 640 x 480
- Fixed DPI for ui - lots of cleanup and changes everywhere. Icon image need correct size still, layer-in-use icon needs remake.
- Macbook retina support, use command line --no-native-pixels to disable it
- Timeline Marker label was drawing wrong
- Trackpad and magic mouse: supports zoom (hold ctrl)
- Fix for splash position: removed ghost function and made window size update after creation immediate
- Fast undo buffer save now adds UI as well. Could be checked for regular file save even...
Quit.blend and temp file saving use this now.
- Dixed filename in window on reading quit.blend or temp saves, and they now add a warning in window title: "(Recovered)"
- New Userpref option "Keep Session" - this always saves quit.blend, and loads on start.
This allows keeping UI and data without actual saves, until you actually save.
When you load startup.blend and quit, it recognises the quit.blend as a startup (no file name in header)
- Added 3D view copy/paste buffers (selected objects). Shortcuts ctrl-c, ctrl-v (OSX, cmd-c, cmd-v).
Coded partial file saving for it. Could be used for other purposes. Todo: use OS clipboards.
- User preferences (themes, keymaps, user settings) now can be saved as a separate file.
Old option is called "Save Startup File" the new one "Save User Settings".
To visualise this difference, the 'save startup file' button has been removed from user preferences window. That option is available as CTRL+U and in File menu still.
- OSX: fixed bug that stopped giving mouse events outside window.
This also fixes "Continuous Grab" for OSX. (error since 2009)
2012-12-12 18:58:11 +00:00
|
|
|
sdrawline(co[0] - f20, co[1], co[0] - f5, co[1]);
|
|
|
|
sdrawline(co[0] + f5, co[1], co[0] + f20, co[1]);
|
|
|
|
sdrawline(co[0], co[1] - f20, co[0], co[1] - f5);
|
|
|
|
sdrawline(co[0], co[1] + f5, co[0], co[1] + f20);
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-10-19 13:04:40 +00:00
|
|
|
/* Draw a live substitute of the view icon, which is always shown
|
|
|
|
* colors copied from transform_manipulator.c, we should keep these matching. */
|
Holiday coding log :)
Nice formatted version (pictures soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.66/Usability
Short list of main changes:
- Transparent region option (over main region), added code to blend in/out such panels.
- Min size window now 640 x 480
- Fixed DPI for ui - lots of cleanup and changes everywhere. Icon image need correct size still, layer-in-use icon needs remake.
- Macbook retina support, use command line --no-native-pixels to disable it
- Timeline Marker label was drawing wrong
- Trackpad and magic mouse: supports zoom (hold ctrl)
- Fix for splash position: removed ghost function and made window size update after creation immediate
- Fast undo buffer save now adds UI as well. Could be checked for regular file save even...
Quit.blend and temp file saving use this now.
- Dixed filename in window on reading quit.blend or temp saves, and they now add a warning in window title: "(Recovered)"
- New Userpref option "Keep Session" - this always saves quit.blend, and loads on start.
This allows keeping UI and data without actual saves, until you actually save.
When you load startup.blend and quit, it recognises the quit.blend as a startup (no file name in header)
- Added 3D view copy/paste buffers (selected objects). Shortcuts ctrl-c, ctrl-v (OSX, cmd-c, cmd-v).
Coded partial file saving for it. Could be used for other purposes. Todo: use OS clipboards.
- User preferences (themes, keymaps, user settings) now can be saved as a separate file.
Old option is called "Save Startup File" the new one "Save User Settings".
To visualise this difference, the 'save startup file' button has been removed from user preferences window. That option is available as CTRL+U and in File menu still.
- OSX: fixed bug that stopped giving mouse events outside window.
This also fixes "Continuous Grab" for OSX. (error since 2009)
2012-12-12 18:58:11 +00:00
|
|
|
static void draw_view_axis(ARegion *ar, RegionView3D *rv3d)
|
2008-12-18 17:38:21 +00:00
|
|
|
{
|
|
|
|
const float k = U.rvisize; /* axis size */
|
|
|
|
const float toll = 0.5; /* used to see when view is quasi-orthogonal */
|
2012-12-16 09:37:15 +00:00
|
|
|
const float startx = k + 1.0f + ED_region_overlapping_offset(ar); /* axis center in screen coordinates, x=y */
|
Holiday coding log :)
Nice formatted version (pictures soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.66/Usability
Short list of main changes:
- Transparent region option (over main region), added code to blend in/out such panels.
- Min size window now 640 x 480
- Fixed DPI for ui - lots of cleanup and changes everywhere. Icon image need correct size still, layer-in-use icon needs remake.
- Macbook retina support, use command line --no-native-pixels to disable it
- Timeline Marker label was drawing wrong
- Trackpad and magic mouse: supports zoom (hold ctrl)
- Fix for splash position: removed ghost function and made window size update after creation immediate
- Fast undo buffer save now adds UI as well. Could be checked for regular file save even...
Quit.blend and temp file saving use this now.
- Dixed filename in window on reading quit.blend or temp saves, and they now add a warning in window title: "(Recovered)"
- New Userpref option "Keep Session" - this always saves quit.blend, and loads on start.
This allows keeping UI and data without actual saves, until you actually save.
When you load startup.blend and quit, it recognises the quit.blend as a startup (no file name in header)
- Added 3D view copy/paste buffers (selected objects). Shortcuts ctrl-c, ctrl-v (OSX, cmd-c, cmd-v).
Coded partial file saving for it. Could be used for other purposes. Todo: use OS clipboards.
- User preferences (themes, keymaps, user settings) now can be saved as a separate file.
Old option is called "Save Startup File" the new one "Save User Settings".
To visualise this difference, the 'save startup file' button has been removed from user preferences window. That option is available as CTRL+U and in File menu still.
- OSX: fixed bug that stopped giving mouse events outside window.
This also fixes "Continuous Grab" for OSX. (error since 2009)
2012-12-12 18:58:11 +00:00
|
|
|
const float starty = k + 1.0f;
|
2008-12-18 17:38:21 +00:00
|
|
|
float ydisp = 0.0; /* vertical displacement to allow obj info text */
|
2012-03-25 23:54:33 +00:00
|
|
|
int bright = 25 * (float)U.rvibright + 5; /* axis alpha (rvibright has range 0-10) */
|
2010-10-19 13:04:40 +00:00
|
|
|
|
|
|
|
float vec[3];
|
2008-12-18 17:38:21 +00:00
|
|
|
float dx, dy;
|
|
|
|
|
|
|
|
/* thickness of lines is proportional to k */
|
2010-10-19 13:04:40 +00:00
|
|
|
glLineWidth(2);
|
|
|
|
|
2010-10-30 17:13:03 +00:00
|
|
|
glEnable(GL_BLEND);
|
|
|
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
|
|
|
2008-12-18 17:38:21 +00:00
|
|
|
/* X */
|
2010-10-19 13:04:40 +00:00
|
|
|
vec[0] = 1;
|
2008-12-18 17:38:21 +00:00
|
|
|
vec[1] = vec[2] = 0;
|
2009-11-10 20:43:45 +00:00
|
|
|
mul_qt_v3(rv3d->viewquat, vec);
|
2008-12-18 17:38:21 +00:00
|
|
|
dx = vec[0] * k;
|
|
|
|
dy = vec[1] * k;
|
Axis Colours are now Themeable
This commit allows you to set the RGB <-> XYZ axis colours used for things like
the mini axis indicator, grid axis indicators, manipulators, transform
constraint indicators, F-Curves (when using XYZ to RGB colouring option), and
perhaps something else I've missed. Previously, these places all used hardcoded
defines (220 * i/j/k), but the readability of these colours was often quite
poor, especially when used with certain themes.
The settings for these colours can be found under the "User Interface" section
of the themes (i.e. same set of colours is used across editors). I could have
made these per editor, but since it's unlikely that these will need to be too
different across editors in practice (+ being easier to version patch), they are
stored under the UI section.
2012-11-09 06:36:11 +00:00
|
|
|
|
|
|
|
UI_ThemeColorShadeAlpha(TH_AXIS_X, 0, bright);
|
2010-10-19 13:04:40 +00:00
|
|
|
glBegin(GL_LINES);
|
Holiday coding log :)
Nice formatted version (pictures soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.66/Usability
Short list of main changes:
- Transparent region option (over main region), added code to blend in/out such panels.
- Min size window now 640 x 480
- Fixed DPI for ui - lots of cleanup and changes everywhere. Icon image need correct size still, layer-in-use icon needs remake.
- Macbook retina support, use command line --no-native-pixels to disable it
- Timeline Marker label was drawing wrong
- Trackpad and magic mouse: supports zoom (hold ctrl)
- Fix for splash position: removed ghost function and made window size update after creation immediate
- Fast undo buffer save now adds UI as well. Could be checked for regular file save even...
Quit.blend and temp file saving use this now.
- Dixed filename in window on reading quit.blend or temp saves, and they now add a warning in window title: "(Recovered)"
- New Userpref option "Keep Session" - this always saves quit.blend, and loads on start.
This allows keeping UI and data without actual saves, until you actually save.
When you load startup.blend and quit, it recognises the quit.blend as a startup (no file name in header)
- Added 3D view copy/paste buffers (selected objects). Shortcuts ctrl-c, ctrl-v (OSX, cmd-c, cmd-v).
Coded partial file saving for it. Could be used for other purposes. Todo: use OS clipboards.
- User preferences (themes, keymaps, user settings) now can be saved as a separate file.
Old option is called "Save Startup File" the new one "Save User Settings".
To visualise this difference, the 'save startup file' button has been removed from user preferences window. That option is available as CTRL+U and in File menu still.
- OSX: fixed bug that stopped giving mouse events outside window.
This also fixes "Continuous Grab" for OSX. (error since 2009)
2012-12-12 18:58:11 +00:00
|
|
|
glVertex2f(startx, starty + ydisp);
|
|
|
|
glVertex2f(startx + dx, starty + dy + ydisp);
|
2010-10-19 13:04:40 +00:00
|
|
|
glEnd();
|
|
|
|
|
2011-03-27 15:57:27 +00:00
|
|
|
if (fabsf(dx) > toll || fabsf(dy) > toll) {
|
Holiday coding log :)
Nice formatted version (pictures soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.66/Usability
Short list of main changes:
- Transparent region option (over main region), added code to blend in/out such panels.
- Min size window now 640 x 480
- Fixed DPI for ui - lots of cleanup and changes everywhere. Icon image need correct size still, layer-in-use icon needs remake.
- Macbook retina support, use command line --no-native-pixels to disable it
- Timeline Marker label was drawing wrong
- Trackpad and magic mouse: supports zoom (hold ctrl)
- Fix for splash position: removed ghost function and made window size update after creation immediate
- Fast undo buffer save now adds UI as well. Could be checked for regular file save even...
Quit.blend and temp file saving use this now.
- Dixed filename in window on reading quit.blend or temp saves, and they now add a warning in window title: "(Recovered)"
- New Userpref option "Keep Session" - this always saves quit.blend, and loads on start.
This allows keeping UI and data without actual saves, until you actually save.
When you load startup.blend and quit, it recognises the quit.blend as a startup (no file name in header)
- Added 3D view copy/paste buffers (selected objects). Shortcuts ctrl-c, ctrl-v (OSX, cmd-c, cmd-v).
Coded partial file saving for it. Could be used for other purposes. Todo: use OS clipboards.
- User preferences (themes, keymaps, user settings) now can be saved as a separate file.
Old option is called "Save Startup File" the new one "Save User Settings".
To visualise this difference, the 'save startup file' button has been removed from user preferences window. That option is available as CTRL+U and in File menu still.
- OSX: fixed bug that stopped giving mouse events outside window.
This also fixes "Continuous Grab" for OSX. (error since 2009)
2012-12-12 18:58:11 +00:00
|
|
|
BLF_draw_default_ascii(startx + dx + 2, starty + dy + ydisp + 2, 0.0f, "x", 1);
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
|
|
|
|
2010-10-30 17:13:03 +00:00
|
|
|
/* BLF_draw_default disables blending */
|
|
|
|
glEnable(GL_BLEND);
|
|
|
|
|
2008-12-18 17:38:21 +00:00
|
|
|
/* Y */
|
2010-10-19 13:04:40 +00:00
|
|
|
vec[1] = 1;
|
2008-12-18 17:38:21 +00:00
|
|
|
vec[0] = vec[2] = 0;
|
2009-11-10 20:43:45 +00:00
|
|
|
mul_qt_v3(rv3d->viewquat, vec);
|
2008-12-18 17:38:21 +00:00
|
|
|
dx = vec[0] * k;
|
|
|
|
dy = vec[1] * k;
|
Axis Colours are now Themeable
This commit allows you to set the RGB <-> XYZ axis colours used for things like
the mini axis indicator, grid axis indicators, manipulators, transform
constraint indicators, F-Curves (when using XYZ to RGB colouring option), and
perhaps something else I've missed. Previously, these places all used hardcoded
defines (220 * i/j/k), but the readability of these colours was often quite
poor, especially when used with certain themes.
The settings for these colours can be found under the "User Interface" section
of the themes (i.e. same set of colours is used across editors). I could have
made these per editor, but since it's unlikely that these will need to be too
different across editors in practice (+ being easier to version patch), they are
stored under the UI section.
2012-11-09 06:36:11 +00:00
|
|
|
|
|
|
|
UI_ThemeColorShadeAlpha(TH_AXIS_Y, 0, bright);
|
2010-10-19 13:04:40 +00:00
|
|
|
glBegin(GL_LINES);
|
Holiday coding log :)
Nice formatted version (pictures soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.66/Usability
Short list of main changes:
- Transparent region option (over main region), added code to blend in/out such panels.
- Min size window now 640 x 480
- Fixed DPI for ui - lots of cleanup and changes everywhere. Icon image need correct size still, layer-in-use icon needs remake.
- Macbook retina support, use command line --no-native-pixels to disable it
- Timeline Marker label was drawing wrong
- Trackpad and magic mouse: supports zoom (hold ctrl)
- Fix for splash position: removed ghost function and made window size update after creation immediate
- Fast undo buffer save now adds UI as well. Could be checked for regular file save even...
Quit.blend and temp file saving use this now.
- Dixed filename in window on reading quit.blend or temp saves, and they now add a warning in window title: "(Recovered)"
- New Userpref option "Keep Session" - this always saves quit.blend, and loads on start.
This allows keeping UI and data without actual saves, until you actually save.
When you load startup.blend and quit, it recognises the quit.blend as a startup (no file name in header)
- Added 3D view copy/paste buffers (selected objects). Shortcuts ctrl-c, ctrl-v (OSX, cmd-c, cmd-v).
Coded partial file saving for it. Could be used for other purposes. Todo: use OS clipboards.
- User preferences (themes, keymaps, user settings) now can be saved as a separate file.
Old option is called "Save Startup File" the new one "Save User Settings".
To visualise this difference, the 'save startup file' button has been removed from user preferences window. That option is available as CTRL+U and in File menu still.
- OSX: fixed bug that stopped giving mouse events outside window.
This also fixes "Continuous Grab" for OSX. (error since 2009)
2012-12-12 18:58:11 +00:00
|
|
|
glVertex2f(startx, starty + ydisp);
|
|
|
|
glVertex2f(startx + dx, starty + dy + ydisp);
|
2010-10-19 13:04:40 +00:00
|
|
|
glEnd();
|
|
|
|
|
2011-03-27 15:57:27 +00:00
|
|
|
if (fabsf(dx) > toll || fabsf(dy) > toll) {
|
Holiday coding log :)
Nice formatted version (pictures soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.66/Usability
Short list of main changes:
- Transparent region option (over main region), added code to blend in/out such panels.
- Min size window now 640 x 480
- Fixed DPI for ui - lots of cleanup and changes everywhere. Icon image need correct size still, layer-in-use icon needs remake.
- Macbook retina support, use command line --no-native-pixels to disable it
- Timeline Marker label was drawing wrong
- Trackpad and magic mouse: supports zoom (hold ctrl)
- Fix for splash position: removed ghost function and made window size update after creation immediate
- Fast undo buffer save now adds UI as well. Could be checked for regular file save even...
Quit.blend and temp file saving use this now.
- Dixed filename in window on reading quit.blend or temp saves, and they now add a warning in window title: "(Recovered)"
- New Userpref option "Keep Session" - this always saves quit.blend, and loads on start.
This allows keeping UI and data without actual saves, until you actually save.
When you load startup.blend and quit, it recognises the quit.blend as a startup (no file name in header)
- Added 3D view copy/paste buffers (selected objects). Shortcuts ctrl-c, ctrl-v (OSX, cmd-c, cmd-v).
Coded partial file saving for it. Could be used for other purposes. Todo: use OS clipboards.
- User preferences (themes, keymaps, user settings) now can be saved as a separate file.
Old option is called "Save Startup File" the new one "Save User Settings".
To visualise this difference, the 'save startup file' button has been removed from user preferences window. That option is available as CTRL+U and in File menu still.
- OSX: fixed bug that stopped giving mouse events outside window.
This also fixes "Continuous Grab" for OSX. (error since 2009)
2012-12-12 18:58:11 +00:00
|
|
|
BLF_draw_default_ascii(startx + dx + 2, starty + dy + ydisp + 2, 0.0f, "y", 1);
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
2010-10-30 17:13:03 +00:00
|
|
|
|
|
|
|
glEnable(GL_BLEND);
|
2008-12-18 17:38:21 +00:00
|
|
|
|
|
|
|
/* Z */
|
2010-10-19 13:04:40 +00:00
|
|
|
vec[2] = 1;
|
2008-12-18 17:38:21 +00:00
|
|
|
vec[1] = vec[0] = 0;
|
2009-11-10 20:43:45 +00:00
|
|
|
mul_qt_v3(rv3d->viewquat, vec);
|
2008-12-18 17:38:21 +00:00
|
|
|
dx = vec[0] * k;
|
|
|
|
dy = vec[1] * k;
|
2010-10-19 13:04:40 +00:00
|
|
|
|
Axis Colours are now Themeable
This commit allows you to set the RGB <-> XYZ axis colours used for things like
the mini axis indicator, grid axis indicators, manipulators, transform
constraint indicators, F-Curves (when using XYZ to RGB colouring option), and
perhaps something else I've missed. Previously, these places all used hardcoded
defines (220 * i/j/k), but the readability of these colours was often quite
poor, especially when used with certain themes.
The settings for these colours can be found under the "User Interface" section
of the themes (i.e. same set of colours is used across editors). I could have
made these per editor, but since it's unlikely that these will need to be too
different across editors in practice (+ being easier to version patch), they are
stored under the UI section.
2012-11-09 06:36:11 +00:00
|
|
|
UI_ThemeColorShadeAlpha(TH_AXIS_Z, 0, bright);
|
2010-10-19 13:04:40 +00:00
|
|
|
glBegin(GL_LINES);
|
Holiday coding log :)
Nice formatted version (pictures soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.66/Usability
Short list of main changes:
- Transparent region option (over main region), added code to blend in/out such panels.
- Min size window now 640 x 480
- Fixed DPI for ui - lots of cleanup and changes everywhere. Icon image need correct size still, layer-in-use icon needs remake.
- Macbook retina support, use command line --no-native-pixels to disable it
- Timeline Marker label was drawing wrong
- Trackpad and magic mouse: supports zoom (hold ctrl)
- Fix for splash position: removed ghost function and made window size update after creation immediate
- Fast undo buffer save now adds UI as well. Could be checked for regular file save even...
Quit.blend and temp file saving use this now.
- Dixed filename in window on reading quit.blend or temp saves, and they now add a warning in window title: "(Recovered)"
- New Userpref option "Keep Session" - this always saves quit.blend, and loads on start.
This allows keeping UI and data without actual saves, until you actually save.
When you load startup.blend and quit, it recognises the quit.blend as a startup (no file name in header)
- Added 3D view copy/paste buffers (selected objects). Shortcuts ctrl-c, ctrl-v (OSX, cmd-c, cmd-v).
Coded partial file saving for it. Could be used for other purposes. Todo: use OS clipboards.
- User preferences (themes, keymaps, user settings) now can be saved as a separate file.
Old option is called "Save Startup File" the new one "Save User Settings".
To visualise this difference, the 'save startup file' button has been removed from user preferences window. That option is available as CTRL+U and in File menu still.
- OSX: fixed bug that stopped giving mouse events outside window.
This also fixes "Continuous Grab" for OSX. (error since 2009)
2012-12-12 18:58:11 +00:00
|
|
|
glVertex2f(startx, starty + ydisp);
|
|
|
|
glVertex2f(startx + dx, starty + dy + ydisp);
|
2010-10-19 13:04:40 +00:00
|
|
|
glEnd();
|
|
|
|
|
2011-03-27 15:57:27 +00:00
|
|
|
if (fabsf(dx) > toll || fabsf(dy) > toll) {
|
Holiday coding log :)
Nice formatted version (pictures soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.66/Usability
Short list of main changes:
- Transparent region option (over main region), added code to blend in/out such panels.
- Min size window now 640 x 480
- Fixed DPI for ui - lots of cleanup and changes everywhere. Icon image need correct size still, layer-in-use icon needs remake.
- Macbook retina support, use command line --no-native-pixels to disable it
- Timeline Marker label was drawing wrong
- Trackpad and magic mouse: supports zoom (hold ctrl)
- Fix for splash position: removed ghost function and made window size update after creation immediate
- Fast undo buffer save now adds UI as well. Could be checked for regular file save even...
Quit.blend and temp file saving use this now.
- Dixed filename in window on reading quit.blend or temp saves, and they now add a warning in window title: "(Recovered)"
- New Userpref option "Keep Session" - this always saves quit.blend, and loads on start.
This allows keeping UI and data without actual saves, until you actually save.
When you load startup.blend and quit, it recognises the quit.blend as a startup (no file name in header)
- Added 3D view copy/paste buffers (selected objects). Shortcuts ctrl-c, ctrl-v (OSX, cmd-c, cmd-v).
Coded partial file saving for it. Could be used for other purposes. Todo: use OS clipboards.
- User preferences (themes, keymaps, user settings) now can be saved as a separate file.
Old option is called "Save Startup File" the new one "Save User Settings".
To visualise this difference, the 'save startup file' button has been removed from user preferences window. That option is available as CTRL+U and in File menu still.
- OSX: fixed bug that stopped giving mouse events outside window.
This also fixes "Continuous Grab" for OSX. (error since 2009)
2012-12-12 18:58:11 +00:00
|
|
|
BLF_draw_default_ascii(startx + dx + 2, starty + dy + ydisp + 2, 0.0f, "z", 1);
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
2010-10-19 13:04:40 +00:00
|
|
|
|
2008-12-18 17:38:21 +00:00
|
|
|
/* restore line-width */
|
2010-10-19 13:04:40 +00:00
|
|
|
|
2008-12-18 17:38:21 +00:00
|
|
|
glLineWidth(1.0);
|
2010-10-30 17:13:03 +00:00
|
|
|
glDisable(GL_BLEND);
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
|
|
|
|
2011-07-26 02:35:46 +00:00
|
|
|
/* draw center and axis of rotation for ongoing 3D mouse navigation */
|
|
|
|
static void draw_rotation_guide(RegionView3D *rv3d)
|
|
|
|
{
|
2012-07-08 20:36:00 +00:00
|
|
|
float o[3]; /* center of rotation */
|
|
|
|
float end[3]; /* endpoints for drawing */
|
2011-07-26 02:35:46 +00:00
|
|
|
|
2012-07-08 20:36:00 +00:00
|
|
|
float color[4] = {0.0f, 0.4235f, 1.0f, 1.0f}; /* bright blue so it matches device LEDs */
|
2011-07-26 02:35:46 +00:00
|
|
|
|
|
|
|
negate_v3_v3(o, rv3d->ofs);
|
|
|
|
|
|
|
|
glEnable(GL_BLEND);
|
|
|
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
|
|
glShadeModel(GL_SMOOTH);
|
|
|
|
glPointSize(5);
|
|
|
|
glEnable(GL_POINT_SMOOTH);
|
2012-07-08 20:36:00 +00:00
|
|
|
glDepthMask(0); /* don't overwrite zbuf */
|
2011-07-26 02:35:46 +00:00
|
|
|
|
|
|
|
if (rv3d->rot_angle != 0.f) {
|
2012-07-08 20:36:00 +00:00
|
|
|
/* -- draw rotation axis -- */
|
2011-07-26 02:35:46 +00:00
|
|
|
float scaled_axis[3];
|
2011-07-26 16:17:00 +00:00
|
|
|
const float scale = rv3d->dist;
|
|
|
|
mul_v3_v3fl(scaled_axis, rv3d->rot_axis, scale);
|
2011-09-11 05:50:44 +00:00
|
|
|
|
|
|
|
|
2011-07-26 02:35:46 +00:00
|
|
|
glBegin(GL_LINE_STRIP);
|
2012-07-08 20:36:00 +00:00
|
|
|
color[3] = 0.f; /* more transparent toward the ends */
|
2011-09-11 05:50:44 +00:00
|
|
|
glColor4fv(color);
|
|
|
|
add_v3_v3v3(end, o, scaled_axis);
|
|
|
|
glVertex3fv(end);
|
2011-07-26 16:17:00 +00:00
|
|
|
|
2012-07-08 20:36:00 +00:00
|
|
|
// color[3] = 0.2f + fabsf(rv3d->rot_angle); /* modulate opacity with angle */
|
2011-09-11 05:50:44 +00:00
|
|
|
// ^^ neat idea, but angle is frame-rate dependent, so it's usually close to 0.2
|
|
|
|
|
2012-07-08 20:36:00 +00:00
|
|
|
color[3] = 0.5f; /* more opaque toward the center */
|
2011-09-11 05:50:44 +00:00
|
|
|
glColor4fv(color);
|
|
|
|
glVertex3fv(o);
|
|
|
|
|
|
|
|
color[3] = 0.f;
|
|
|
|
glColor4fv(color);
|
|
|
|
sub_v3_v3v3(end, o, scaled_axis);
|
|
|
|
glVertex3fv(end);
|
2011-07-26 02:35:46 +00:00
|
|
|
glEnd();
|
|
|
|
|
2012-07-08 20:36:00 +00:00
|
|
|
/* -- draw ring around rotation center -- */
|
2011-07-30 05:23:10 +00:00
|
|
|
{
|
2012-03-25 23:54:33 +00:00
|
|
|
#define ROT_AXIS_DETAIL 13
|
2011-09-11 05:50:44 +00:00
|
|
|
|
|
|
|
const float s = 0.05f * scale;
|
|
|
|
const float step = 2.f * (float)(M_PI / ROT_AXIS_DETAIL);
|
|
|
|
float angle;
|
|
|
|
int i;
|
|
|
|
|
2012-07-08 20:36:00 +00:00
|
|
|
float q[4]; /* rotate ring so it's perpendicular to axis */
|
2011-09-11 05:50:44 +00:00
|
|
|
const int upright = fabsf(rv3d->rot_axis[2]) >= 0.95f;
|
|
|
|
if (!upright) {
|
|
|
|
const float up[3] = {0.f, 0.f, 1.f};
|
|
|
|
float vis_angle, vis_axis[3];
|
|
|
|
|
|
|
|
cross_v3_v3v3(vis_axis, up, rv3d->rot_axis);
|
|
|
|
vis_angle = acosf(dot_v3v3(up, rv3d->rot_axis));
|
|
|
|
axis_angle_to_quat(q, vis_axis, vis_angle);
|
2011-07-30 05:23:10 +00:00
|
|
|
}
|
|
|
|
|
2012-07-08 20:36:00 +00:00
|
|
|
color[3] = 0.25f; /* somewhat faint */
|
2011-09-11 05:50:44 +00:00
|
|
|
glColor4fv(color);
|
|
|
|
glBegin(GL_LINE_LOOP);
|
|
|
|
for (i = 0, angle = 0.f; i < ROT_AXIS_DETAIL; ++i, angle += step) {
|
2012-09-30 06:12:47 +00:00
|
|
|
float p[3] = {s * cosf(angle), s * sinf(angle), 0.0f};
|
2011-07-30 05:23:10 +00:00
|
|
|
|
2011-09-11 05:50:44 +00:00
|
|
|
if (!upright) {
|
|
|
|
mul_qt_v3(q, p);
|
|
|
|
}
|
2011-07-30 05:23:10 +00:00
|
|
|
|
2011-09-11 05:50:44 +00:00
|
|
|
add_v3_v3(p, o);
|
|
|
|
glVertex3fv(p);
|
2011-07-30 05:23:10 +00:00
|
|
|
}
|
2011-09-11 05:50:44 +00:00
|
|
|
glEnd();
|
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
#undef ROT_AXIS_DETAIL
|
2011-07-30 05:23:10 +00:00
|
|
|
}
|
|
|
|
|
2012-07-08 20:36:00 +00:00
|
|
|
color[3] = 1.0f; /* solid dot */
|
2011-07-26 02:35:46 +00:00
|
|
|
}
|
|
|
|
else
|
2012-07-08 20:36:00 +00:00
|
|
|
color[3] = 0.5f; /* see-through dot */
|
2011-07-26 02:35:46 +00:00
|
|
|
|
2012-07-08 20:36:00 +00:00
|
|
|
/* -- draw rotation center -- */
|
2011-07-26 02:35:46 +00:00
|
|
|
glColor4fv(color);
|
|
|
|
glBegin(GL_POINTS);
|
2012-03-25 23:54:33 +00:00
|
|
|
glVertex3fv(o);
|
2011-07-26 02:35:46 +00:00
|
|
|
glEnd();
|
|
|
|
|
2012-07-08 20:36:00 +00:00
|
|
|
/* find screen coordinates for rotation center, then draw pretty icon */
|
|
|
|
#if 0
|
|
|
|
mul_m4_v3(rv3d->persinv, rot_center);
|
|
|
|
UI_icon_draw(rot_center[0], rot_center[1], ICON_NDOF_TURN);
|
|
|
|
#endif
|
|
|
|
/* ^^ just playing around, does not work */
|
2011-07-26 02:35:46 +00:00
|
|
|
|
|
|
|
glDisable(GL_BLEND);
|
|
|
|
glDisable(GL_POINT_SMOOTH);
|
2011-07-26 16:17:00 +00:00
|
|
|
glDepthMask(1);
|
2011-07-26 02:35:46 +00:00
|
|
|
}
|
2008-12-18 17:38:21 +00:00
|
|
|
|
Holiday coding log :)
Nice formatted version (pictures soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.66/Usability
Short list of main changes:
- Transparent region option (over main region), added code to blend in/out such panels.
- Min size window now 640 x 480
- Fixed DPI for ui - lots of cleanup and changes everywhere. Icon image need correct size still, layer-in-use icon needs remake.
- Macbook retina support, use command line --no-native-pixels to disable it
- Timeline Marker label was drawing wrong
- Trackpad and magic mouse: supports zoom (hold ctrl)
- Fix for splash position: removed ghost function and made window size update after creation immediate
- Fast undo buffer save now adds UI as well. Could be checked for regular file save even...
Quit.blend and temp file saving use this now.
- Dixed filename in window on reading quit.blend or temp saves, and they now add a warning in window title: "(Recovered)"
- New Userpref option "Keep Session" - this always saves quit.blend, and loads on start.
This allows keeping UI and data without actual saves, until you actually save.
When you load startup.blend and quit, it recognises the quit.blend as a startup (no file name in header)
- Added 3D view copy/paste buffers (selected objects). Shortcuts ctrl-c, ctrl-v (OSX, cmd-c, cmd-v).
Coded partial file saving for it. Could be used for other purposes. Todo: use OS clipboards.
- User preferences (themes, keymaps, user settings) now can be saved as a separate file.
Old option is called "Save Startup File" the new one "Save User Settings".
To visualise this difference, the 'save startup file' button has been removed from user preferences window. That option is available as CTRL+U and in File menu still.
- OSX: fixed bug that stopped giving mouse events outside window.
This also fixes "Continuous Grab" for OSX. (error since 2009)
2012-12-12 18:58:11 +00:00
|
|
|
static void draw_view_icon(ARegion *ar, RegionView3D *rv3d)
|
2008-12-18 17:38:21 +00:00
|
|
|
{
|
|
|
|
BIFIconID icon;
|
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
if (ELEM(rv3d->view, RV3D_VIEW_TOP, RV3D_VIEW_BOTTOM))
|
|
|
|
icon = ICON_AXIS_TOP;
|
|
|
|
else if (ELEM(rv3d->view, RV3D_VIEW_FRONT, RV3D_VIEW_BACK))
|
|
|
|
icon = ICON_AXIS_FRONT;
|
|
|
|
else if (ELEM(rv3d->view, RV3D_VIEW_RIGHT, RV3D_VIEW_LEFT))
|
|
|
|
icon = ICON_AXIS_SIDE;
|
2012-02-27 10:35:39 +00:00
|
|
|
else return;
|
2008-12-18 17:38:21 +00:00
|
|
|
|
|
|
|
glEnable(GL_BLEND);
|
|
|
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
|
|
|
2012-12-16 09:37:15 +00:00
|
|
|
UI_icon_draw(5.0 + ED_region_overlapping_offset(ar), 5.0, icon);
|
2008-12-18 17:38:21 +00:00
|
|
|
|
|
|
|
glDisable(GL_BLEND);
|
|
|
|
}
|
|
|
|
|
2010-12-03 17:05:21 +00:00
|
|
|
static const char *view3d_get_name(View3D *v3d, RegionView3D *rv3d)
|
2008-12-18 17:38:21 +00:00
|
|
|
{
|
2010-12-03 17:05:21 +00:00
|
|
|
const char *name = NULL;
|
2008-12-18 17:38:21 +00:00
|
|
|
|
2.5
View3D has been split now in a local part (RegionView3D) and a
per-area part (old View3D). Currently local is:
- view transform
- camera zoom/offset
- gpencil (todo)
- custom clipping planes
Rest is in Area still, like active camera, draw type, layers,
localview, custom centers, around-settings, transform widget,
gridlines, and so on (mostly stuff as available in header).
To see it work; also added new feature for region split,
press SHIFT+ALT+CTRL+S for four-split.
The idea is to make a preset 4-split, configured to stick
to top/right/front views for three views.
Another cool idea to explore is to then box-clip all drawing
based on these 3 views.
Note about the code:
- currently view3d still stores some depricated settings, to
convert from older files. Not all settings are copied over
though, like custom clip planes or the 'lock view to object'.
- since some view3d ops are now on area level, the operators
for it should keep track of that.
Bugfix in transform: quat initialize in operator-invoke missed
one zero.
Als brought back GE to compile for missing Ipos and channels.
2009-01-19 16:54:41 +00:00
|
|
|
switch (rv3d->view) {
|
2009-10-27 02:54:25 +00:00
|
|
|
case RV3D_VIEW_FRONT:
|
|
|
|
if (rv3d->persp == RV3D_ORTHO) name = "Front Ortho";
|
2009-01-20 14:23:32 +00:00
|
|
|
else name = "Front Persp";
|
2008-12-18 17:38:21 +00:00
|
|
|
break;
|
2009-10-27 02:54:25 +00:00
|
|
|
case RV3D_VIEW_BACK:
|
|
|
|
if (rv3d->persp == RV3D_ORTHO) name = "Back Ortho";
|
2009-01-20 14:23:32 +00:00
|
|
|
else name = "Back Persp";
|
2008-12-18 17:38:21 +00:00
|
|
|
break;
|
2009-10-27 02:54:25 +00:00
|
|
|
case RV3D_VIEW_TOP:
|
|
|
|
if (rv3d->persp == RV3D_ORTHO) name = "Top Ortho";
|
2009-01-20 14:23:32 +00:00
|
|
|
else name = "Top Persp";
|
2008-12-18 17:38:21 +00:00
|
|
|
break;
|
2009-10-27 02:54:25 +00:00
|
|
|
case RV3D_VIEW_BOTTOM:
|
|
|
|
if (rv3d->persp == RV3D_ORTHO) name = "Bottom Ortho";
|
2009-01-20 14:23:32 +00:00
|
|
|
else name = "Bottom Persp";
|
|
|
|
break;
|
2009-10-27 02:54:25 +00:00
|
|
|
case RV3D_VIEW_RIGHT:
|
|
|
|
if (rv3d->persp == RV3D_ORTHO) name = "Right Ortho";
|
2009-01-20 14:23:32 +00:00
|
|
|
else name = "Right Persp";
|
|
|
|
break;
|
2009-10-27 02:54:25 +00:00
|
|
|
case RV3D_VIEW_LEFT:
|
|
|
|
if (rv3d->persp == RV3D_ORTHO) name = "Left Ortho";
|
2009-01-20 14:23:32 +00:00
|
|
|
else name = "Left Persp";
|
|
|
|
break;
|
|
|
|
|
2008-12-18 17:38:21 +00:00
|
|
|
default:
|
2012-03-25 23:54:33 +00:00
|
|
|
if (rv3d->persp == RV3D_CAMOB) {
|
2008-12-18 17:38:21 +00:00
|
|
|
if ((v3d->camera) && (v3d->camera->type == OB_CAMERA)) {
|
|
|
|
Camera *cam;
|
|
|
|
cam = v3d->camera->data;
|
|
|
|
name = (cam->type != CAM_ORTHO) ? "Camera Persp" : "Camera Ortho";
|
2012-02-22 16:52:06 +00:00
|
|
|
}
|
|
|
|
else {
|
2008-12-18 17:38:21 +00:00
|
|
|
name = "Object as Camera";
|
|
|
|
}
|
2012-02-22 16:52:06 +00:00
|
|
|
}
|
|
|
|
else {
|
2009-10-27 02:54:25 +00:00
|
|
|
name = (rv3d->persp == RV3D_ORTHO) ? "User Ortho" : "User Persp";
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return name;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void draw_viewport_name(ARegion *ar, View3D *v3d)
|
|
|
|
{
|
2012-03-25 23:54:33 +00:00
|
|
|
RegionView3D *rv3d = ar->regiondata;
|
|
|
|
const char *name = view3d_get_name(v3d, rv3d);
|
2010-11-11 06:35:45 +00:00
|
|
|
char tmpstr[24];
|
2008-12-18 17:38:21 +00:00
|
|
|
|
2009-09-22 04:40:16 +00:00
|
|
|
if (v3d->localvd) {
|
2010-11-11 11:46:45 +00:00
|
|
|
BLI_snprintf(tmpstr, sizeof(tmpstr), "%s (Local)", name);
|
2012-03-25 23:54:33 +00:00
|
|
|
name = tmpstr;
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
|
|
|
|
2010-11-11 06:35:45 +00:00
|
|
|
if (name) {
|
2008-12-18 17:38:21 +00:00
|
|
|
UI_ThemeColor(TH_TEXT_HI);
|
2012-12-16 09:37:15 +00:00
|
|
|
BLF_draw_default_ascii(U.widget_unit + ED_region_overlapping_offset(ar), ar->winy - U.widget_unit, 0.0f, name, sizeof(tmpstr));
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* draw info beside axes in bottom left-corner:
|
2012-03-03 16:31:46 +00:00
|
|
|
* framenum, object name, bone name (if available), marker name (if available)
|
|
|
|
*/
|
Holiday coding log :)
Nice formatted version (pictures soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.66/Usability
Short list of main changes:
- Transparent region option (over main region), added code to blend in/out such panels.
- Min size window now 640 x 480
- Fixed DPI for ui - lots of cleanup and changes everywhere. Icon image need correct size still, layer-in-use icon needs remake.
- Macbook retina support, use command line --no-native-pixels to disable it
- Timeline Marker label was drawing wrong
- Trackpad and magic mouse: supports zoom (hold ctrl)
- Fix for splash position: removed ghost function and made window size update after creation immediate
- Fast undo buffer save now adds UI as well. Could be checked for regular file save even...
Quit.blend and temp file saving use this now.
- Dixed filename in window on reading quit.blend or temp saves, and they now add a warning in window title: "(Recovered)"
- New Userpref option "Keep Session" - this always saves quit.blend, and loads on start.
This allows keeping UI and data without actual saves, until you actually save.
When you load startup.blend and quit, it recognises the quit.blend as a startup (no file name in header)
- Added 3D view copy/paste buffers (selected objects). Shortcuts ctrl-c, ctrl-v (OSX, cmd-c, cmd-v).
Coded partial file saving for it. Could be used for other purposes. Todo: use OS clipboards.
- User preferences (themes, keymaps, user settings) now can be saved as a separate file.
Old option is called "Save Startup File" the new one "Save User Settings".
To visualise this difference, the 'save startup file' button has been removed from user preferences window. That option is available as CTRL+U and in File menu still.
- OSX: fixed bug that stopped giving mouse events outside window.
This also fixes "Continuous Grab" for OSX. (error since 2009)
2012-12-12 18:58:11 +00:00
|
|
|
static void draw_selected_name(ARegion *ar, Scene *scene, Object *ob)
|
2008-12-18 17:38:21 +00:00
|
|
|
{
|
|
|
|
char info[256], *markern;
|
2012-12-16 09:37:15 +00:00
|
|
|
short offset = 30 + ED_region_overlapping_offset(ar);
|
2008-12-18 17:38:21 +00:00
|
|
|
|
|
|
|
/* get name of marker on current frame (if available) */
|
2012-05-05 14:33:36 +00:00
|
|
|
markern = BKE_scene_find_marker_name(scene, CFRA);
|
2008-12-18 17:38:21 +00:00
|
|
|
|
|
|
|
/* check if there is an object */
|
2012-02-22 16:52:06 +00:00
|
|
|
if (ob) {
|
2008-12-18 17:38:21 +00:00
|
|
|
/* name(s) to display depends on type of object */
|
2012-03-25 23:54:33 +00:00
|
|
|
if (ob->type == OB_ARMATURE) {
|
|
|
|
bArmature *arm = ob->data;
|
|
|
|
char *name = NULL;
|
2008-12-18 17:38:21 +00:00
|
|
|
|
|
|
|
/* show name of active bone too (if possible) */
|
2012-02-22 16:52:06 +00:00
|
|
|
if (arm->edbo) {
|
2009-11-09 21:03:54 +00:00
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (arm->act_edbone)
|
2012-03-25 23:54:33 +00:00
|
|
|
name = ((EditBone *)arm->act_edbone)->name;
|
2009-11-09 21:03:54 +00:00
|
|
|
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
2012-02-22 16:52:06 +00:00
|
|
|
else if (ob->mode & OB_MODE_POSE) {
|
|
|
|
if (arm->act_bone) {
|
2009-11-09 21:03:54 +00:00
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (arm->act_bone->layer & arm->layer)
|
2012-03-25 23:54:33 +00:00
|
|
|
name = arm->act_bone->name;
|
2009-11-09 21:03:54 +00:00
|
|
|
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
|
|
|
}
|
2012-02-22 16:52:06 +00:00
|
|
|
if (name && markern)
|
2012-03-25 23:54:33 +00:00
|
|
|
BLI_snprintf(info, sizeof(info), "(%d) %s %s <%s>", CFRA, ob->id.name + 2, name, markern);
|
2012-02-22 16:52:06 +00:00
|
|
|
else if (name)
|
2012-03-25 23:54:33 +00:00
|
|
|
BLI_snprintf(info, sizeof(info), "(%d) %s %s", CFRA, ob->id.name + 2, name);
|
2008-12-18 17:38:21 +00:00
|
|
|
else
|
2012-03-25 23:54:33 +00:00
|
|
|
BLI_snprintf(info, sizeof(info), "(%d) %s", CFRA, ob->id.name + 2);
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
2012-02-22 16:52:06 +00:00
|
|
|
else if (ELEM3(ob->type, OB_MESH, OB_LATTICE, OB_CURVE)) {
|
2012-03-25 23:54:33 +00:00
|
|
|
Key *key = NULL;
|
2008-12-18 17:38:21 +00:00
|
|
|
KeyBlock *kb = NULL;
|
2012-01-11 12:33:51 +00:00
|
|
|
char shapes[MAX_NAME + 10];
|
2008-12-18 17:38:21 +00:00
|
|
|
|
|
|
|
/* try to display active shapekey too */
|
2012-01-11 12:33:51 +00:00
|
|
|
shapes[0] = '\0';
|
2012-09-19 10:12:07 +00:00
|
|
|
key = BKE_key_from_object(ob);
|
2012-02-22 16:52:06 +00:00
|
|
|
if (key) {
|
2012-03-25 23:54:33 +00:00
|
|
|
kb = BLI_findlink(&key->block, ob->shapenr - 1);
|
2012-02-22 16:52:06 +00:00
|
|
|
if (kb) {
|
2012-01-11 12:33:51 +00:00
|
|
|
BLI_snprintf(shapes, sizeof(shapes), ": %s ", kb->name);
|
2012-02-22 16:52:06 +00:00
|
|
|
if (ob->shapeflag == OB_SHAPE_LOCK) {
|
2009-12-26 20:23:13 +00:00
|
|
|
strcat(shapes, " (Pinned)");
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (markern)
|
2012-03-25 23:54:33 +00:00
|
|
|
BLI_snprintf(info, sizeof(info), "(%d) %s %s <%s>", CFRA, ob->id.name + 2, shapes, markern);
|
2008-12-18 17:38:21 +00:00
|
|
|
else
|
2012-03-25 23:54:33 +00:00
|
|
|
BLI_snprintf(info, sizeof(info), "(%d) %s %s", CFRA, ob->id.name + 2, shapes);
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
/* standard object */
|
|
|
|
if (markern)
|
2012-03-25 23:54:33 +00:00
|
|
|
BLI_snprintf(info, sizeof(info), "(%d) %s <%s>", CFRA, ob->id.name + 2, markern);
|
2008-12-18 17:38:21 +00:00
|
|
|
else
|
2012-03-25 23:54:33 +00:00
|
|
|
BLI_snprintf(info, sizeof(info), "(%d) %s", CFRA, ob->id.name + 2);
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
|
|
|
|
2010-12-03 12:30:59 +00:00
|
|
|
/* color depends on whether there is a keyframe */
|
2012-05-05 14:33:36 +00:00
|
|
|
if (id_frame_has_keyframe((ID *)ob, /*BKE_scene_frame_get(scene)*/ (float)(CFRA), ANIMFILTER_KEYS_LOCAL))
|
2008-12-21 10:33:24 +00:00
|
|
|
UI_ThemeColor(TH_VERTEX_SELECT);
|
|
|
|
else
|
2008-12-18 17:38:21 +00:00
|
|
|
UI_ThemeColor(TH_TEXT_HI);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
/* no object */
|
|
|
|
if (markern)
|
2012-01-11 12:33:51 +00:00
|
|
|
BLI_snprintf(info, sizeof(info), "(%d) <%s>", CFRA, markern);
|
2008-12-18 17:38:21 +00:00
|
|
|
else
|
2012-01-11 12:33:51 +00:00
|
|
|
BLI_snprintf(info, sizeof(info), "(%d)", CFRA);
|
2008-12-18 17:38:21 +00:00
|
|
|
|
2010-12-03 12:30:59 +00:00
|
|
|
/* color is always white */
|
2008-12-18 17:38:21 +00:00
|
|
|
UI_ThemeColor(TH_TEXT_HI);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (U.uiflag & USER_SHOW_ROTVIEWICON)
|
2012-12-16 09:37:15 +00:00
|
|
|
offset = U.widget_unit + (U.rvisize * 2) + ED_region_overlapping_offset(ar);
|
2009-05-05 23:10:32 +00:00
|
|
|
|
Holiday coding log :)
Nice formatted version (pictures soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.66/Usability
Short list of main changes:
- Transparent region option (over main region), added code to blend in/out such panels.
- Min size window now 640 x 480
- Fixed DPI for ui - lots of cleanup and changes everywhere. Icon image need correct size still, layer-in-use icon needs remake.
- Macbook retina support, use command line --no-native-pixels to disable it
- Timeline Marker label was drawing wrong
- Trackpad and magic mouse: supports zoom (hold ctrl)
- Fix for splash position: removed ghost function and made window size update after creation immediate
- Fast undo buffer save now adds UI as well. Could be checked for regular file save even...
Quit.blend and temp file saving use this now.
- Dixed filename in window on reading quit.blend or temp saves, and they now add a warning in window title: "(Recovered)"
- New Userpref option "Keep Session" - this always saves quit.blend, and loads on start.
This allows keeping UI and data without actual saves, until you actually save.
When you load startup.blend and quit, it recognises the quit.blend as a startup (no file name in header)
- Added 3D view copy/paste buffers (selected objects). Shortcuts ctrl-c, ctrl-v (OSX, cmd-c, cmd-v).
Coded partial file saving for it. Could be used for other purposes. Todo: use OS clipboards.
- User preferences (themes, keymaps, user settings) now can be saved as a separate file.
Old option is called "Save Startup File" the new one "Save User Settings".
To visualise this difference, the 'save startup file' button has been removed from user preferences window. That option is available as CTRL+U and in File menu still.
- OSX: fixed bug that stopped giving mouse events outside window.
This also fixes "Continuous Grab" for OSX. (error since 2009)
2012-12-12 18:58:11 +00:00
|
|
|
BLF_draw_default(offset, 0.5f * U.widget_unit, 0.0f, info, sizeof(info));
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
|
|
|
|
2012-01-19 16:04:44 +00:00
|
|
|
static void view3d_camera_border(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D *rv3d,
|
|
|
|
rctf *viewborder_r, short no_shift, short no_zoom)
|
2008-12-18 17:38:21 +00:00
|
|
|
{
|
2011-11-19 18:35:42 +00:00
|
|
|
CameraParams params;
|
|
|
|
rctf rect_view, rect_camera;
|
|
|
|
|
|
|
|
/* get viewport viewplane */
|
2012-05-05 00:58:22 +00:00
|
|
|
BKE_camera_params_init(¶ms);
|
|
|
|
BKE_camera_params_from_view3d(¶ms, v3d, rv3d);
|
2012-02-22 16:52:06 +00:00
|
|
|
if (no_zoom)
|
2012-03-25 23:54:33 +00:00
|
|
|
params.zoom = 1.0f;
|
2012-05-05 00:58:22 +00:00
|
|
|
BKE_camera_params_compute_viewplane(¶ms, ar->winx, ar->winy, 1.0f, 1.0f);
|
2012-03-25 23:54:33 +00:00
|
|
|
rect_view = params.viewplane;
|
2011-11-19 18:35:42 +00:00
|
|
|
|
|
|
|
/* get camera viewplane */
|
2012-05-05 00:58:22 +00:00
|
|
|
BKE_camera_params_init(¶ms);
|
|
|
|
BKE_camera_params_from_object(¶ms, v3d->camera);
|
2012-02-22 16:52:06 +00:00
|
|
|
if (no_shift) {
|
2012-03-25 23:54:33 +00:00
|
|
|
params.shiftx = 0.0f;
|
|
|
|
params.shifty = 0.0f;
|
2011-11-19 18:35:42 +00:00
|
|
|
}
|
2012-05-05 00:58:22 +00:00
|
|
|
BKE_camera_params_compute_viewplane(¶ms, scene->r.xsch, scene->r.ysch, scene->r.xasp, scene->r.yasp);
|
2012-03-25 23:54:33 +00:00
|
|
|
rect_camera = params.viewplane;
|
2011-11-19 18:35:42 +00:00
|
|
|
|
|
|
|
/* get camera border within viewport */
|
2012-09-15 11:48:20 +00:00
|
|
|
viewborder_r->xmin = ((rect_camera.xmin - rect_view.xmin) / BLI_rctf_size_x(&rect_view)) * ar->winx;
|
|
|
|
viewborder_r->xmax = ((rect_camera.xmax - rect_view.xmin) / BLI_rctf_size_x(&rect_view)) * ar->winx;
|
|
|
|
viewborder_r->ymin = ((rect_camera.ymin - rect_view.ymin) / BLI_rctf_size_y(&rect_view)) * ar->winy;
|
|
|
|
viewborder_r->ymax = ((rect_camera.ymax - rect_view.ymin) / BLI_rctf_size_y(&rect_view)) * ar->winy;
|
2011-11-19 18:35:42 +00:00
|
|
|
}
|
2011-11-04 14:36:06 +00:00
|
|
|
|
2011-11-19 18:35:42 +00:00
|
|
|
void ED_view3d_calc_camera_border_size(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D *rv3d, float size_r[2])
|
|
|
|
{
|
|
|
|
rctf viewborder;
|
2011-11-04 14:36:06 +00:00
|
|
|
|
2011-11-19 18:35:42 +00:00
|
|
|
view3d_camera_border(scene, ar, v3d, rv3d, &viewborder, TRUE, TRUE);
|
2012-09-15 11:48:20 +00:00
|
|
|
size_r[0] = BLI_rctf_size_x(&viewborder);
|
|
|
|
size_r[1] = BLI_rctf_size_y(&viewborder);
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
|
|
|
|
2012-01-19 16:04:44 +00:00
|
|
|
void ED_view3d_calc_camera_border(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D *rv3d,
|
|
|
|
rctf *viewborder_r, short no_shift)
|
2008-12-18 17:38:21 +00:00
|
|
|
{
|
2011-11-19 18:35:42 +00:00
|
|
|
view3d_camera_border(scene, ar, v3d, rv3d, viewborder_r, no_shift, FALSE);
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
|
|
|
|
2011-05-15 05:43:59 +00:00
|
|
|
static void drawviewborder_grid3(float x1, float x2, float y1, float y2, float fac)
|
2011-05-10 03:03:53 +00:00
|
|
|
{
|
|
|
|
float x3, y3, x4, y4;
|
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
x3 = x1 + fac * (x2 - x1);
|
|
|
|
y3 = y1 + fac * (y2 - y1);
|
|
|
|
x4 = x1 + (1.0f - fac) * (x2 - x1);
|
|
|
|
y4 = y1 + (1.0f - fac) * (y2 - y1);
|
2011-05-10 03:03:53 +00:00
|
|
|
|
|
|
|
glBegin(GL_LINES);
|
2011-05-15 05:43:59 +00:00
|
|
|
glVertex2f(x1, y3);
|
|
|
|
glVertex2f(x2, y3);
|
2011-05-10 03:03:53 +00:00
|
|
|
|
2011-05-15 05:43:59 +00:00
|
|
|
glVertex2f(x1, y4);
|
|
|
|
glVertex2f(x2, y4);
|
2011-05-10 03:03:53 +00:00
|
|
|
|
2011-05-15 05:43:59 +00:00
|
|
|
glVertex2f(x3, y1);
|
|
|
|
glVertex2f(x3, y2);
|
2011-05-10 03:03:53 +00:00
|
|
|
|
2011-05-15 05:43:59 +00:00
|
|
|
glVertex2f(x4, y1);
|
|
|
|
glVertex2f(x4, y2);
|
|
|
|
glEnd();
|
|
|
|
}
|
|
|
|
|
|
|
|
/* harmonious triangle */
|
|
|
|
static void drawviewborder_triangle(float x1, float x2, float y1, float y2, const char golden, const char dir)
|
|
|
|
{
|
|
|
|
float ofs;
|
2012-03-25 23:54:33 +00:00
|
|
|
float w = x2 - x1;
|
|
|
|
float h = y2 - y1;
|
2011-05-15 05:43:59 +00:00
|
|
|
|
|
|
|
glBegin(GL_LINES);
|
2012-02-22 16:52:06 +00:00
|
|
|
if (w > h) {
|
|
|
|
if (golden) {
|
2012-03-25 23:54:33 +00:00
|
|
|
ofs = w * (1.0f - (1.0f / 1.61803399f));
|
2011-05-15 05:43:59 +00:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
ofs = h * (h / w);
|
|
|
|
}
|
2012-02-22 16:52:06 +00:00
|
|
|
if (dir == 'B') SWAP(float, y1, y2);
|
2011-05-10 03:03:53 +00:00
|
|
|
|
2011-05-15 05:43:59 +00:00
|
|
|
glVertex2f(x1, y1);
|
2011-05-10 03:03:53 +00:00
|
|
|
glVertex2f(x2, y2);
|
|
|
|
|
|
|
|
glVertex2f(x2, y1);
|
2011-05-15 05:43:59 +00:00
|
|
|
glVertex2f(x1 + (w - ofs), y2);
|
2011-05-10 03:03:53 +00:00
|
|
|
|
|
|
|
glVertex2f(x1, y2);
|
2011-05-15 05:43:59 +00:00
|
|
|
glVertex2f(x1 + ofs, y1);
|
|
|
|
}
|
|
|
|
else {
|
2012-02-22 16:52:06 +00:00
|
|
|
if (golden) {
|
2012-03-25 23:54:33 +00:00
|
|
|
ofs = h * (1.0f - (1.0f / 1.61803399f));
|
2011-05-15 05:43:59 +00:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
ofs = w * (w / h);
|
|
|
|
}
|
2012-02-22 16:52:06 +00:00
|
|
|
if (dir == 'B') SWAP(float, x1, x2);
|
2011-05-10 03:03:53 +00:00
|
|
|
|
2011-05-15 05:43:59 +00:00
|
|
|
glVertex2f(x1, y1);
|
2011-05-10 03:03:53 +00:00
|
|
|
glVertex2f(x2, y2);
|
|
|
|
|
|
|
|
glVertex2f(x2, y1);
|
2011-05-15 05:43:59 +00:00
|
|
|
glVertex2f(x1, y1 + ofs);
|
|
|
|
|
|
|
|
glVertex2f(x1, y2);
|
|
|
|
glVertex2f(x2, y1 + (h - ofs));
|
2011-05-10 03:03:53 +00:00
|
|
|
}
|
|
|
|
glEnd();
|
|
|
|
}
|
|
|
|
|
2008-12-18 17:38:21 +00:00
|
|
|
static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d)
|
|
|
|
{
|
2012-10-25 18:26:07 +00:00
|
|
|
float hmargin, vmargin;
|
2008-12-18 17:38:21 +00:00
|
|
|
float x1, x2, y1, y2;
|
2010-07-26 21:35:24 +00:00
|
|
|
float x1i, x2i, y1i, y2i;
|
2008-12-18 17:38:21 +00:00
|
|
|
float x3, y3, x4, y4;
|
|
|
|
rctf viewborder;
|
2012-03-25 23:54:33 +00:00
|
|
|
Camera *ca = NULL;
|
|
|
|
RegionView3D *rv3d = (RegionView3D *)ar->regiondata;
|
2008-12-18 17:38:21 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
if (v3d->camera == NULL)
|
2008-12-18 17:38:21 +00:00
|
|
|
return;
|
2012-03-25 23:54:33 +00:00
|
|
|
if (v3d->camera->type == OB_CAMERA)
|
2008-12-18 17:38:21 +00:00
|
|
|
ca = v3d->camera->data;
|
|
|
|
|
2011-05-21 08:56:37 +00:00
|
|
|
ED_view3d_calc_camera_border(scene, ar, v3d, rv3d, &viewborder, FALSE);
|
2010-07-26 21:35:24 +00:00
|
|
|
/* the offsets */
|
2012-03-25 23:54:33 +00:00
|
|
|
x1 = viewborder.xmin;
|
|
|
|
y1 = viewborder.ymin;
|
|
|
|
x2 = viewborder.xmax;
|
|
|
|
y2 = viewborder.ymax;
|
2008-12-18 17:38:21 +00:00
|
|
|
|
2010-07-26 21:35:24 +00:00
|
|
|
/* apply offsets so the real 3D camera shows through */
|
2011-05-11 00:59:22 +00:00
|
|
|
|
|
|
|
/* note: quite un-scientific but without this bit extra
|
|
|
|
* 0.0001 on the lower left the 2D border sometimes
|
|
|
|
* obscures the 3D camera border */
|
2012-03-01 12:20:18 +00:00
|
|
|
/* note: with VIEW3D_CAMERA_BORDER_HACK defined this error isn't noticeable
|
2012-03-09 00:41:09 +00:00
|
|
|
* but keep it here in case we need to remove the workaround */
|
2012-03-25 23:54:33 +00:00
|
|
|
x1i = (int)(x1 - 1.0001f);
|
|
|
|
y1i = (int)(y1 - 1.0001f);
|
|
|
|
x2i = (int)(x2 + (1.0f - 0.0001f));
|
|
|
|
y2i = (int)(y2 + (1.0f - 0.0001f));
|
2010-07-26 21:35:24 +00:00
|
|
|
|
2008-12-18 17:38:21 +00:00
|
|
|
/* passepartout, specified in camera edit buttons */
|
2011-03-27 15:57:27 +00:00
|
|
|
if (ca && (ca->flag & CAM_SHOWPASSEPARTOUT) && ca->passepartalpha > 0.000001f) {
|
|
|
|
if (ca->passepartalpha == 1.0f) {
|
2008-12-18 17:38:21 +00:00
|
|
|
glColor3f(0, 0, 0);
|
2012-02-22 16:52:06 +00:00
|
|
|
}
|
|
|
|
else {
|
2012-03-25 23:54:33 +00:00
|
|
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
2008-12-18 17:38:21 +00:00
|
|
|
glEnable(GL_BLEND);
|
|
|
|
glColor4f(0, 0, 0, ca->passepartalpha);
|
|
|
|
}
|
2011-03-27 15:57:27 +00:00
|
|
|
if (x1i > 0.0f)
|
2010-07-26 21:35:24 +00:00
|
|
|
glRectf(0.0, (float)ar->winy, x1i, 0.0);
|
|
|
|
if (x2i < (float)ar->winx)
|
|
|
|
glRectf(x2i, (float)ar->winy, (float)ar->winx, 0.0);
|
|
|
|
if (y2i < (float)ar->winy)
|
|
|
|
glRectf(x1i, (float)ar->winy, x2i, y2i);
|
2011-03-27 15:57:27 +00:00
|
|
|
if (y2i > 0.0f)
|
2010-07-26 21:35:24 +00:00
|
|
|
glRectf(x1i, y1i, x2i, 0.0);
|
2008-12-18 17:38:21 +00:00
|
|
|
|
|
|
|
glDisable(GL_BLEND);
|
|
|
|
}
|
2010-07-26 21:35:24 +00:00
|
|
|
|
2008-12-18 17:38:21 +00:00
|
|
|
/* edge */
|
2012-10-21 05:46:41 +00:00
|
|
|
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
2010-07-26 21:35:24 +00:00
|
|
|
|
2008-12-18 17:38:21 +00:00
|
|
|
setlinestyle(0);
|
2012-01-18 11:10:02 +00:00
|
|
|
|
|
|
|
UI_ThemeColor(TH_BACK);
|
2012-01-18 10:41:38 +00:00
|
|
|
|
2010-07-26 21:35:24 +00:00
|
|
|
glRectf(x1i, y1i, x2i, y2i);
|
2011-07-21 01:30:26 +00:00
|
|
|
|
|
|
|
#ifdef VIEW3D_CAMERA_BORDER_HACK
|
2012-02-22 16:52:06 +00:00
|
|
|
if (view3d_camera_border_hack_test == TRUE) {
|
2012-06-06 18:00:08 +00:00
|
|
|
glColor3ubv(view3d_camera_border_hack_col);
|
2012-03-25 23:54:33 +00:00
|
|
|
glRectf(x1i + 1, y1i + 1, x2i - 1, y2i - 1);
|
|
|
|
view3d_camera_border_hack_test = FALSE;
|
2011-07-21 01:30:26 +00:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2008-12-18 17:38:21 +00:00
|
|
|
setlinestyle(3);
|
2012-01-18 11:10:02 +00:00
|
|
|
|
|
|
|
/* outer line not to confuse with object selecton */
|
|
|
|
if (v3d->flag2 & V3D_LOCK_CAMERA) {
|
|
|
|
UI_ThemeColor(TH_REDALERT);
|
|
|
|
glRectf(x1i - 1, y1i - 1, x2i + 1, y2i + 1);
|
|
|
|
}
|
|
|
|
|
2008-12-18 17:38:21 +00:00
|
|
|
UI_ThemeColor(TH_WIRE);
|
2010-07-26 21:35:24 +00:00
|
|
|
glRectf(x1i, y1i, x2i, y2i);
|
|
|
|
|
2008-12-18 17:38:21 +00:00
|
|
|
/* border */
|
2012-02-22 16:52:06 +00:00
|
|
|
if (scene->r.mode & R_BORDER) {
|
2008-12-18 17:38:21 +00:00
|
|
|
cpack(0);
|
2012-03-25 23:54:33 +00:00
|
|
|
x3 = x1 + scene->r.border.xmin * (x2 - x1);
|
|
|
|
y3 = y1 + scene->r.border.ymin * (y2 - y1);
|
|
|
|
x4 = x1 + scene->r.border.xmax * (x2 - x1);
|
|
|
|
y4 = y1 + scene->r.border.ymax * (y2 - y1);
|
2008-12-18 17:38:21 +00:00
|
|
|
|
|
|
|
cpack(0x4040FF);
|
|
|
|
glRectf(x3, y3, x4, y4);
|
|
|
|
}
|
2011-04-21 13:11:51 +00:00
|
|
|
|
2008-12-18 17:38:21 +00:00
|
|
|
/* safety border */
|
2012-02-22 16:52:06 +00:00
|
|
|
if (ca) {
|
2011-05-10 03:03:53 +00:00
|
|
|
if (ca->dtx & CAM_DTX_CENTER) {
|
|
|
|
UI_ThemeColorBlendShade(TH_WIRE, TH_BACK, 0.25, 0);
|
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
x3 = x1 + 0.5f * (x2 - x1);
|
|
|
|
y3 = y1 + 0.5f * (y2 - y1);
|
2011-05-10 03:03:53 +00:00
|
|
|
|
|
|
|
glBegin(GL_LINES);
|
|
|
|
glVertex2f(x1, y3);
|
|
|
|
glVertex2f(x2, y3);
|
|
|
|
|
|
|
|
glVertex2f(x3, y1);
|
|
|
|
glVertex2f(x3, y2);
|
|
|
|
glEnd();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (ca->dtx & CAM_DTX_CENTER_DIAG) {
|
|
|
|
UI_ThemeColorBlendShade(TH_WIRE, TH_BACK, 0.25, 0);
|
|
|
|
|
|
|
|
glBegin(GL_LINES);
|
|
|
|
glVertex2f(x1, y1);
|
|
|
|
glVertex2f(x2, y2);
|
|
|
|
|
|
|
|
glVertex2f(x1, y2);
|
|
|
|
glVertex2f(x2, y1);
|
|
|
|
glEnd();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (ca->dtx & CAM_DTX_THIRDS) {
|
|
|
|
UI_ThemeColorBlendShade(TH_WIRE, TH_BACK, 0.25, 0);
|
2012-03-25 23:54:33 +00:00
|
|
|
drawviewborder_grid3(x1, x2, y1, y2, 1.0f / 3.0f);
|
2011-05-10 03:03:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (ca->dtx & CAM_DTX_GOLDEN) {
|
|
|
|
UI_ThemeColorBlendShade(TH_WIRE, TH_BACK, 0.25, 0);
|
2012-03-25 23:54:33 +00:00
|
|
|
drawviewborder_grid3(x1, x2, y1, y2, 1.0f - (1.0f / 1.61803399f));
|
2011-05-15 05:43:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (ca->dtx & CAM_DTX_GOLDEN_TRI_A) {
|
|
|
|
UI_ThemeColorBlendShade(TH_WIRE, TH_BACK, 0.25, 0);
|
|
|
|
drawviewborder_triangle(x1, x2, y1, y2, 0, 'A');
|
|
|
|
}
|
|
|
|
|
|
|
|
if (ca->dtx & CAM_DTX_GOLDEN_TRI_B) {
|
|
|
|
UI_ThemeColorBlendShade(TH_WIRE, TH_BACK, 0.25, 0);
|
|
|
|
drawviewborder_triangle(x1, x2, y1, y2, 0, 'B');
|
2011-05-10 03:03:53 +00:00
|
|
|
}
|
|
|
|
|
2011-05-15 05:43:59 +00:00
|
|
|
if (ca->dtx & CAM_DTX_HARMONY_TRI_A) {
|
2011-05-10 03:03:53 +00:00
|
|
|
UI_ThemeColorBlendShade(TH_WIRE, TH_BACK, 0.25, 0);
|
2011-05-15 05:43:59 +00:00
|
|
|
drawviewborder_triangle(x1, x2, y1, y2, 1, 'A');
|
2011-05-10 03:03:53 +00:00
|
|
|
}
|
|
|
|
|
2011-05-15 05:43:59 +00:00
|
|
|
if (ca->dtx & CAM_DTX_HARMONY_TRI_B) {
|
2011-05-10 03:03:53 +00:00
|
|
|
UI_ThemeColorBlendShade(TH_WIRE, TH_BACK, 0.25, 0);
|
2011-05-15 05:43:59 +00:00
|
|
|
drawviewborder_triangle(x1, x2, y1, y2, 1, 'B');
|
2011-05-10 03:03:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (ca->flag & CAM_SHOWTITLESAFE) {
|
|
|
|
UI_ThemeColorBlendShade(TH_WIRE, TH_BACK, 0.25, 0);
|
|
|
|
|
2012-11-03 18:23:30 +00:00
|
|
|
hmargin = 0.1f * (x2 - x1);
|
|
|
|
vmargin = 0.05f * (y2 - y1);
|
2012-11-09 08:28:14 +00:00
|
|
|
uiDrawBox(GL_LINE_LOOP, x1 + hmargin, y1 + vmargin, x2 - hmargin, y2 - vmargin, 2.0f);
|
2012-10-25 13:31:45 +00:00
|
|
|
|
2012-11-03 18:23:30 +00:00
|
|
|
hmargin = 0.035f * (x2 - x1);
|
|
|
|
vmargin = 0.035f * (y2 - y1);
|
2012-11-18 01:22:31 +00:00
|
|
|
uiDrawBox(GL_LINE_LOOP, x1 + hmargin, y1 + vmargin, x2 - hmargin, y2 - vmargin, 2.0f);
|
2011-05-10 03:03:53 +00:00
|
|
|
}
|
2011-11-04 14:36:06 +00:00
|
|
|
if (ca && (ca->flag & CAM_SHOWSENSOR)) {
|
2011-11-18 23:15:11 +00:00
|
|
|
/* determine sensor fit, and get sensor x/y, for auto fit we
|
2012-03-03 16:31:46 +00:00
|
|
|
* assume and square sensor and only use sensor_x */
|
2012-03-25 23:54:33 +00:00
|
|
|
float sizex = scene->r.xsch * scene->r.xasp;
|
|
|
|
float sizey = scene->r.ysch * scene->r.yasp;
|
2012-05-05 00:58:22 +00:00
|
|
|
int sensor_fit = BKE_camera_sensor_fit(ca->sensor_fit, sizex, sizey);
|
2012-03-25 23:54:33 +00:00
|
|
|
float sensor_x = ca->sensor_x;
|
|
|
|
float sensor_y = (ca->sensor_fit == CAMERA_SENSOR_FIT_AUTO) ? ca->sensor_x : ca->sensor_y;
|
2011-11-18 23:15:11 +00:00
|
|
|
|
|
|
|
/* determine sensor plane */
|
|
|
|
rctf rect;
|
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (sensor_fit == CAMERA_SENSOR_FIT_HOR) {
|
2012-03-25 23:54:33 +00:00
|
|
|
float sensor_scale = (x2i - x1i) / sensor_x;
|
2011-11-18 23:15:11 +00:00
|
|
|
float sensor_height = sensor_scale * sensor_y;
|
|
|
|
|
2012-03-24 02:51:46 +00:00
|
|
|
rect.xmin = x1i;
|
|
|
|
rect.xmax = x2i;
|
2012-03-25 23:54:33 +00:00
|
|
|
rect.ymin = (y1i + y2i) * 0.5f - sensor_height * 0.5f;
|
2012-03-24 02:51:46 +00:00
|
|
|
rect.ymax = rect.ymin + sensor_height;
|
2011-11-18 23:15:11 +00:00
|
|
|
}
|
|
|
|
else {
|
2012-03-25 23:54:33 +00:00
|
|
|
float sensor_scale = (y2i - y1i) / sensor_y;
|
2011-11-18 23:15:11 +00:00
|
|
|
float sensor_width = sensor_scale * sensor_x;
|
2011-11-04 14:36:06 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
rect.xmin = (x1i + x2i) * 0.5f - sensor_width * 0.5f;
|
2012-03-24 02:51:46 +00:00
|
|
|
rect.xmax = rect.xmin + sensor_width;
|
|
|
|
rect.ymin = y1i;
|
|
|
|
rect.ymax = y2i;
|
2011-11-18 23:15:11 +00:00
|
|
|
}
|
2011-11-04 14:36:06 +00:00
|
|
|
|
2011-11-18 23:15:11 +00:00
|
|
|
/* draw */
|
2011-11-04 14:36:06 +00:00
|
|
|
UI_ThemeColorShade(TH_WIRE, 100);
|
2011-11-18 23:15:11 +00:00
|
|
|
uiDrawBox(GL_LINE_LOOP, rect.xmin, rect.ymin, rect.xmax, rect.ymax, 2.0f);
|
2011-11-04 14:36:06 +00:00
|
|
|
}
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
2010-07-26 21:35:24 +00:00
|
|
|
|
2008-12-18 17:38:21 +00:00
|
|
|
setlinestyle(0);
|
|
|
|
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
2010-07-26 21:35:24 +00:00
|
|
|
|
2010-01-08 14:45:26 +00:00
|
|
|
/* camera name - draw in highlighted text color */
|
|
|
|
if (ca && (ca->flag & CAM_SHOWNAME)) {
|
|
|
|
UI_ThemeColor(TH_TEXT_HI);
|
2012-03-25 23:54:33 +00:00
|
|
|
BLF_draw_default(x1i, y1i - 15, 0.0f, v3d->camera->id.name + 2, sizeof(v3d->camera->id.name) - 2);
|
2010-01-08 14:45:26 +00:00
|
|
|
UI_ThemeColor(TH_WIRE);
|
|
|
|
}
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
|
|
|
|
2009-01-01 19:18:03 +00:00
|
|
|
/* *********************** backdraw for selection *************** */
|
|
|
|
|
2010-07-23 14:46:31 +00:00
|
|
|
static void backdrawview3d(Scene *scene, ARegion *ar, View3D *v3d)
|
2009-01-01 19:18:03 +00:00
|
|
|
{
|
2012-03-25 23:54:33 +00:00
|
|
|
RegionView3D *rv3d = ar->regiondata;
|
2009-08-15 20:36:15 +00:00
|
|
|
struct Base *base = scene->basact;
|
2011-10-31 14:08:14 +00:00
|
|
|
int multisample_enabled;
|
2009-01-01 19:18:03 +00:00
|
|
|
|
2011-05-25 10:07:59 +00:00
|
|
|
BLI_assert(ar->regiontype == RGN_TYPE_WINDOW);
|
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
if (base && (base->object->mode & (OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT) ||
|
|
|
|
paint_facesel_test(base->object)))
|
2011-11-11 13:09:14 +00:00
|
|
|
{
|
|
|
|
/* do nothing */
|
|
|
|
}
|
2012-02-22 16:52:06 +00:00
|
|
|
else if ((base && (base->object->mode & OB_MODE_TEXTURE_PAINT)) &&
|
2012-03-25 23:54:33 +00:00
|
|
|
scene->toolsettings && (scene->toolsettings->imapaint.flag & IMAGEPAINT_PROJECT_DISABLE))
|
2011-11-11 13:09:14 +00:00
|
|
|
{
|
|
|
|
/* do nothing */
|
|
|
|
}
|
2012-02-22 16:52:06 +00:00
|
|
|
else if ((base && (base->object->mode & OB_MODE_PARTICLE_EDIT)) &&
|
2012-03-25 23:54:33 +00:00
|
|
|
v3d->drawtype > OB_WIRE && (v3d->flag & V3D_ZBUF_SELECT))
|
2011-11-11 13:09:14 +00:00
|
|
|
{
|
|
|
|
/* do nothing */
|
|
|
|
}
|
2012-03-25 23:54:33 +00:00
|
|
|
else if (scene->obedit && v3d->drawtype > OB_WIRE &&
|
2012-05-20 19:49:27 +00:00
|
|
|
(v3d->flag & V3D_ZBUF_SELECT))
|
|
|
|
{
|
2011-11-11 13:09:14 +00:00
|
|
|
/* do nothing */
|
|
|
|
}
|
2009-01-01 19:18:03 +00:00
|
|
|
else {
|
2009-12-17 14:38:30 +00:00
|
|
|
v3d->flag &= ~V3D_INVALID_BACKBUF;
|
2009-01-01 19:18:03 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
if (!(v3d->flag & V3D_INVALID_BACKBUF) ) return;
|
2009-01-01 19:18:03 +00:00
|
|
|
|
2012-07-08 20:36:00 +00:00
|
|
|
#if 0
|
|
|
|
if (test) {
|
|
|
|
if (qtest()) {
|
|
|
|
addafterqueue(ar->win, BACKBUFDRAW, 1);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
2009-01-01 19:18:03 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
if (v3d->drawtype > OB_WIRE) v3d->zbuf = TRUE;
|
2009-01-01 19:18:03 +00:00
|
|
|
|
2011-10-31 14:08:14 +00:00
|
|
|
/* dithering and AA break color coding, so disable */
|
2009-01-01 19:18:03 +00:00
|
|
|
glDisable(GL_DITHER);
|
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
multisample_enabled = glIsEnabled(GL_MULTISAMPLE_ARB);
|
2012-02-22 16:52:06 +00:00
|
|
|
if (multisample_enabled)
|
2011-10-31 14:08:14 +00:00
|
|
|
glDisable(GL_MULTISAMPLE_ARB);
|
|
|
|
|
Holiday coding log :)
Nice formatted version (pictures soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.66/Usability
Short list of main changes:
- Transparent region option (over main region), added code to blend in/out such panels.
- Min size window now 640 x 480
- Fixed DPI for ui - lots of cleanup and changes everywhere. Icon image need correct size still, layer-in-use icon needs remake.
- Macbook retina support, use command line --no-native-pixels to disable it
- Timeline Marker label was drawing wrong
- Trackpad and magic mouse: supports zoom (hold ctrl)
- Fix for splash position: removed ghost function and made window size update after creation immediate
- Fast undo buffer save now adds UI as well. Could be checked for regular file save even...
Quit.blend and temp file saving use this now.
- Dixed filename in window on reading quit.blend or temp saves, and they now add a warning in window title: "(Recovered)"
- New Userpref option "Keep Session" - this always saves quit.blend, and loads on start.
This allows keeping UI and data without actual saves, until you actually save.
When you load startup.blend and quit, it recognises the quit.blend as a startup (no file name in header)
- Added 3D view copy/paste buffers (selected objects). Shortcuts ctrl-c, ctrl-v (OSX, cmd-c, cmd-v).
Coded partial file saving for it. Could be used for other purposes. Todo: use OS clipboards.
- User preferences (themes, keymaps, user settings) now can be saved as a separate file.
Old option is called "Save Startup File" the new one "Save User Settings".
To visualise this difference, the 'save startup file' button has been removed from user preferences window. That option is available as CTRL+U and in File menu still.
- OSX: fixed bug that stopped giving mouse events outside window.
This also fixes "Continuous Grab" for OSX. (error since 2009)
2012-12-12 18:58:11 +00:00
|
|
|
glScissor(ar->winrct.xmin, ar->winrct.ymin, BLI_rcti_size_x(&ar->winrct), BLI_rcti_size_y(&ar->winrct));
|
2009-08-20 19:46:53 +00:00
|
|
|
|
2009-01-01 19:18:03 +00:00
|
|
|
glClearColor(0.0, 0.0, 0.0, 0.0);
|
2012-02-22 16:52:06 +00:00
|
|
|
if (v3d->zbuf) {
|
2009-01-01 19:18:03 +00:00
|
|
|
glEnable(GL_DEPTH_TEST);
|
|
|
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
glClear(GL_COLOR_BUFFER_BIT);
|
|
|
|
glDisable(GL_DEPTH_TEST);
|
|
|
|
}
|
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (rv3d->rflag & RV3D_CLIPPING)
|
2012-02-28 13:03:56 +00:00
|
|
|
ED_view3d_clipping_set(rv3d);
|
2009-01-01 19:18:03 +00:00
|
|
|
|
|
|
|
G.f |= G_BACKBUFSEL;
|
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (base && (base->lay & v3d->lay))
|
2.5
View3D has been split now in a local part (RegionView3D) and a
per-area part (old View3D). Currently local is:
- view transform
- camera zoom/offset
- gpencil (todo)
- custom clipping planes
Rest is in Area still, like active camera, draw type, layers,
localview, custom centers, around-settings, transform widget,
gridlines, and so on (mostly stuff as available in header).
To see it work; also added new feature for region split,
press SHIFT+ALT+CTRL+S for four-split.
The idea is to make a preset 4-split, configured to stick
to top/right/front views for three views.
Another cool idea to explore is to then box-clip all drawing
based on these 3 views.
Note about the code:
- currently view3d still stores some depricated settings, to
convert from older files. Not all settings are copied over
though, like custom clip planes or the 'lock view to object'.
- since some view3d ops are now on area level, the operators
for it should keep track of that.
Bugfix in transform: quat initialize in operator-invoke missed
one zero.
Als brought back GE to compile for missing Ipos and channels.
2009-01-19 16:54:41 +00:00
|
|
|
draw_object_backbufsel(scene, v3d, rv3d, base->object);
|
2009-01-01 19:18:03 +00:00
|
|
|
|
2009-12-17 14:38:30 +00:00
|
|
|
v3d->flag &= ~V3D_INVALID_BACKBUF;
|
2012-03-25 23:54:33 +00:00
|
|
|
ar->swap = 0; /* mark invalid backbuf for wm draw */
|
2009-01-01 19:18:03 +00:00
|
|
|
|
|
|
|
G.f &= ~G_BACKBUFSEL;
|
2012-03-25 23:54:33 +00:00
|
|
|
v3d->zbuf = FALSE;
|
2009-01-01 19:18:03 +00:00
|
|
|
glDisable(GL_DEPTH_TEST);
|
|
|
|
glEnable(GL_DITHER);
|
2012-02-22 16:52:06 +00:00
|
|
|
if (multisample_enabled)
|
2011-10-31 14:08:14 +00:00
|
|
|
glEnable(GL_MULTISAMPLE_ARB);
|
2009-01-01 19:18:03 +00:00
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (rv3d->rflag & RV3D_CLIPPING)
|
2012-02-28 13:03:56 +00:00
|
|
|
ED_view3d_clipping_disable();
|
2009-01-01 19:18:03 +00:00
|
|
|
|
|
|
|
/* it is important to end a view in a transform compatible with buttons */
|
2012-07-08 20:36:00 +00:00
|
|
|
// persp(PERSP_WIN); /* set ortho */
|
2009-01-01 19:18:03 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2009-01-15 15:01:39 +00:00
|
|
|
void view3d_validate_backbuf(ViewContext *vc)
|
2009-01-01 19:18:03 +00:00
|
|
|
{
|
2012-02-22 16:52:06 +00:00
|
|
|
if (vc->v3d->flag & V3D_INVALID_BACKBUF)
|
2009-01-01 19:18:03 +00:00
|
|
|
backdrawview3d(vc->scene, vc->ar, vc->v3d);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* samples a single pixel (copied from vpaint) */
|
|
|
|
unsigned int view3d_sample_backbuf(ViewContext *vc, int x, int y)
|
|
|
|
{
|
|
|
|
unsigned int col;
|
|
|
|
|
2012-09-06 23:41:03 +00:00
|
|
|
if (x >= vc->ar->winx || y >= vc->ar->winy) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
x += vc->ar->winrct.xmin;
|
|
|
|
y += vc->ar->winrct.ymin;
|
2009-01-01 19:18:03 +00:00
|
|
|
|
2009-01-15 15:01:39 +00:00
|
|
|
view3d_validate_backbuf(vc);
|
2009-01-01 19:18:03 +00:00
|
|
|
|
2012-09-06 23:41:03 +00:00
|
|
|
glReadPixels(x, y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &col);
|
|
|
|
glReadBuffer(GL_BACK);
|
2009-01-01 19:18:03 +00:00
|
|
|
|
2012-09-03 07:37:38 +00:00
|
|
|
if (ENDIAN_ORDER == B_ENDIAN) {
|
|
|
|
BLI_endian_switch_uint32(&col);
|
|
|
|
}
|
2009-01-01 19:18:03 +00:00
|
|
|
|
|
|
|
return WM_framebuffer_to_index(col);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* reads full rect, converts indices */
|
|
|
|
ImBuf *view3d_read_backbuf(ViewContext *vc, short xmin, short ymin, short xmax, short ymax)
|
|
|
|
{
|
|
|
|
unsigned int *dr, *rd;
|
|
|
|
struct ImBuf *ibuf, *ibuf1;
|
|
|
|
int a;
|
|
|
|
short xminc, yminc, xmaxc, ymaxc, xs, ys;
|
|
|
|
|
|
|
|
/* clip */
|
2012-03-25 23:54:33 +00:00
|
|
|
if (xmin < 0) xminc = 0; else xminc = xmin;
|
|
|
|
if (xmax >= vc->ar->winx) xmaxc = vc->ar->winx - 1; else xmaxc = xmax;
|
2012-02-22 16:52:06 +00:00
|
|
|
if (xminc > xmaxc) return NULL;
|
2009-01-01 19:18:03 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
if (ymin < 0) yminc = 0; else yminc = ymin;
|
|
|
|
if (ymax >= vc->ar->winy) ymaxc = vc->ar->winy - 1; else ymaxc = ymax;
|
2012-02-22 16:52:06 +00:00
|
|
|
if (yminc > ymaxc) return NULL;
|
2009-01-01 19:18:03 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
ibuf = IMB_allocImBuf((xmaxc - xminc + 1), (ymaxc - yminc + 1), 32, IB_rect);
|
2009-01-01 19:18:03 +00:00
|
|
|
|
2012-11-19 20:40:08 +00:00
|
|
|
view3d_validate_backbuf(vc);
|
|
|
|
|
2012-01-19 16:04:44 +00:00
|
|
|
glReadPixels(vc->ar->winrct.xmin + xminc,
|
|
|
|
vc->ar->winrct.ymin + yminc,
|
2012-03-25 23:54:33 +00:00
|
|
|
(xmaxc - xminc + 1),
|
|
|
|
(ymaxc - yminc + 1),
|
2012-01-19 16:04:44 +00:00
|
|
|
GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect);
|
|
|
|
|
2012-10-21 05:46:41 +00:00
|
|
|
glReadBuffer(GL_BACK);
|
2009-01-01 19:18:03 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
if (ENDIAN_ORDER == B_ENDIAN) IMB_convert_rgba_to_abgr(ibuf);
|
2009-01-01 19:18:03 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
a = (xmaxc - xminc + 1) * (ymaxc - yminc + 1);
|
|
|
|
dr = ibuf->rect;
|
2012-02-22 16:52:06 +00:00
|
|
|
while (a--) {
|
2012-03-25 23:54:33 +00:00
|
|
|
if (*dr) *dr = WM_framebuffer_to_index(*dr);
|
2009-01-01 19:18:03 +00:00
|
|
|
dr++;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* put clipped result back, if needed */
|
2012-03-25 23:54:33 +00:00
|
|
|
if (xminc == xmin && xmaxc == xmax && yminc == ymin && ymaxc == ymax)
|
2009-01-01 19:18:03 +00:00
|
|
|
return ibuf;
|
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
ibuf1 = IMB_allocImBuf( (xmax - xmin + 1), (ymax - ymin + 1), 32, IB_rect);
|
|
|
|
rd = ibuf->rect;
|
|
|
|
dr = ibuf1->rect;
|
|
|
|
|
|
|
|
for (ys = ymin; ys <= ymax; ys++) {
|
|
|
|
for (xs = xmin; xs <= xmax; xs++, dr++) {
|
|
|
|
if (xs >= xminc && xs <= xmaxc && ys >= yminc && ys <= ymaxc) {
|
|
|
|
*dr = *rd;
|
2009-01-01 19:18:03 +00:00
|
|
|
rd++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
IMB_freeImBuf(ibuf);
|
|
|
|
return ibuf1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* smart function to sample a rect spiralling outside, nice for backbuf selection */
|
2011-05-12 16:47:36 +00:00
|
|
|
unsigned int view3d_sample_backbuf_rect(ViewContext *vc, const int mval[2], int size,
|
2012-10-10 01:22:19 +00:00
|
|
|
unsigned int min, unsigned int max, float *r_dist, short strict,
|
2012-03-25 23:54:33 +00:00
|
|
|
void *handle, unsigned int (*indextest)(void *handle, unsigned int index))
|
2009-01-01 19:18:03 +00:00
|
|
|
{
|
|
|
|
struct ImBuf *buf;
|
|
|
|
unsigned int *bufmin, *bufmax, *tbuf;
|
|
|
|
int minx, miny;
|
|
|
|
int a, b, rc, nr, amount, dirvec[4][2];
|
2012-03-25 23:54:33 +00:00
|
|
|
int distance = 0;
|
2009-01-01 19:18:03 +00:00
|
|
|
unsigned int index = 0;
|
2012-10-21 05:46:41 +00:00
|
|
|
short indexok = 0;
|
2009-01-01 19:18:03 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
amount = (size - 1) / 2;
|
2009-01-01 19:18:03 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
minx = mval[0] - (amount + 1);
|
|
|
|
miny = mval[1] - (amount + 1);
|
|
|
|
buf = view3d_read_backbuf(vc, minx, miny, minx + size - 1, miny + size - 1);
|
2009-01-01 19:18:03 +00:00
|
|
|
if (!buf) return 0;
|
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
rc = 0;
|
2009-01-01 19:18:03 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
dirvec[0][0] = 1; dirvec[0][1] = 0;
|
|
|
|
dirvec[1][0] = 0; dirvec[1][1] = -size;
|
|
|
|
dirvec[2][0] = -1; dirvec[2][1] = 0;
|
|
|
|
dirvec[3][0] = 0; dirvec[3][1] = size;
|
2009-01-01 19:18:03 +00:00
|
|
|
|
|
|
|
bufmin = buf->rect;
|
|
|
|
tbuf = buf->rect;
|
2012-03-25 23:54:33 +00:00
|
|
|
bufmax = buf->rect + size * size;
|
|
|
|
tbuf += amount * size + amount;
|
2009-01-01 19:18:03 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
for (nr = 1; nr <= size; nr++) {
|
2009-01-01 19:18:03 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
for (a = 0; a < 2; a++) {
|
|
|
|
for (b = 0; b < nr; b++, distance++) {
|
2012-07-08 20:36:00 +00:00
|
|
|
if (*tbuf && *tbuf >= min && *tbuf < max) { /* we got a hit */
|
2012-02-22 16:52:06 +00:00
|
|
|
if (strict) {
|
2012-03-25 23:54:33 +00:00
|
|
|
indexok = indextest(handle, *tbuf - min + 1);
|
2012-02-22 16:52:06 +00:00
|
|
|
if (indexok) {
|
2012-10-10 01:22:19 +00:00
|
|
|
*r_dist = sqrtf((float)distance);
|
2012-03-25 23:54:33 +00:00
|
|
|
index = *tbuf - min + 1;
|
2009-01-01 19:18:03 +00:00
|
|
|
goto exit;
|
2012-07-08 20:36:00 +00:00
|
|
|
}
|
2009-01-01 19:18:03 +00:00
|
|
|
}
|
2012-03-24 06:38:07 +00:00
|
|
|
else {
|
2012-10-10 01:22:19 +00:00
|
|
|
*r_dist = sqrtf((float)distance); /* XXX, this distance is wrong - */
|
2012-07-08 20:36:00 +00:00
|
|
|
index = *tbuf - min + 1; /* messy yah, but indices start at 1 */
|
2009-01-01 19:18:03 +00:00
|
|
|
goto exit;
|
2012-07-08 20:36:00 +00:00
|
|
|
}
|
2009-01-01 19:18:03 +00:00
|
|
|
}
|
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
tbuf += (dirvec[rc][0] + dirvec[rc][1]);
|
2009-01-01 19:18:03 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
if (tbuf < bufmin || tbuf >= bufmax) {
|
2009-01-01 19:18:03 +00:00
|
|
|
goto exit;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
rc++;
|
|
|
|
rc &= 3;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
exit:
|
|
|
|
IMB_freeImBuf(buf);
|
|
|
|
return index;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* ************************************************************* */
|
|
|
|
|
2012-06-06 11:40:01 +00:00
|
|
|
static void view3d_draw_bgpic(Scene *scene, ARegion *ar, View3D *v3d,
|
2012-08-08 18:21:54 +00:00
|
|
|
const short do_foreground, const short do_camera_frame)
|
2008-12-18 17:38:21 +00:00
|
|
|
{
|
2012-03-25 23:54:33 +00:00
|
|
|
RegionView3D *rv3d = ar->regiondata;
|
2008-12-18 17:38:21 +00:00
|
|
|
BGpic *bgpic;
|
2012-08-08 18:21:54 +00:00
|
|
|
int fg_flag = do_foreground ? V3D_BGPIC_FOREGROUND : 0;
|
2010-01-19 22:44:43 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
for (bgpic = v3d->bgpicbase.first; bgpic; bgpic = bgpic->next) {
|
2010-01-19 22:44:43 +00:00
|
|
|
|
2012-04-10 14:59:06 +00:00
|
|
|
if ((bgpic->flag & V3D_BGPIC_FOREGROUND) != fg_flag)
|
|
|
|
continue;
|
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
if ((bgpic->view == 0) || /* zero for any */
|
|
|
|
(bgpic->view & (1 << rv3d->view)) || /* check agaist flags */
|
|
|
|
(rv3d->persp == RV3D_CAMOB && bgpic->view == (1 << RV3D_VIEW_CAMERA)))
|
|
|
|
{
|
2012-06-13 12:58:01 +00:00
|
|
|
float image_aspect[2];
|
2012-09-20 05:09:35 +00:00
|
|
|
float fac, asp, zoomx, zoomy;
|
|
|
|
float x1, y1, x2, y2;
|
|
|
|
|
|
|
|
ImBuf *ibuf = NULL, *freeibuf;
|
|
|
|
|
|
|
|
Image *ima;
|
|
|
|
MovieClip *clip;
|
2012-06-13 12:58:01 +00:00
|
|
|
|
2011-11-29 21:05:18 +00:00
|
|
|
/* disable individual images */
|
2012-03-25 23:54:33 +00:00
|
|
|
if ((bgpic->flag & V3D_BGPIC_DISABLED))
|
2011-11-29 21:05:18 +00:00
|
|
|
continue;
|
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
freeibuf = NULL;
|
|
|
|
if (bgpic->source == V3D_BGPIC_IMAGE) {
|
|
|
|
ima = bgpic->ima;
|
|
|
|
if (ima == NULL)
|
2011-11-07 12:55:18 +00:00
|
|
|
continue;
|
2012-05-05 16:03:57 +00:00
|
|
|
BKE_image_user_frame_calc(&bgpic->iuser, CFRA, 0);
|
2012-07-03 14:04:39 +00:00
|
|
|
if (ima->source == IMA_SRC_SEQUENCE && !(bgpic->iuser.flag & IMA_USER_FRAME_IN_RANGE)) {
|
|
|
|
ibuf = NULL; /* frame is out of range, dont show */
|
|
|
|
}
|
|
|
|
else {
|
2012-11-15 15:59:58 +00:00
|
|
|
ibuf = BKE_image_acquire_ibuf(ima, &bgpic->iuser, NULL);
|
|
|
|
freeibuf = ibuf;
|
2012-07-03 14:04:39 +00:00
|
|
|
}
|
2012-06-13 12:58:01 +00:00
|
|
|
|
|
|
|
image_aspect[0] = ima->aspx;
|
|
|
|
image_aspect[1] = ima->aspx;
|
2012-02-22 16:52:06 +00:00
|
|
|
}
|
2012-06-06 11:40:01 +00:00
|
|
|
else if (bgpic->source == V3D_BGPIC_MOVIE) {
|
2012-03-25 23:54:33 +00:00
|
|
|
clip = NULL;
|
2011-11-07 12:55:18 +00:00
|
|
|
|
2012-07-06 22:48:28 +00:00
|
|
|
/* TODO: skip drawing when out of frame range (as image sequences do above) */
|
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
if (bgpic->flag & V3D_BGPIC_CAMERACLIP) {
|
2012-02-22 16:52:06 +00:00
|
|
|
if (scene->camera)
|
2012-05-05 14:03:12 +00:00
|
|
|
clip = BKE_object_movieclip_get(scene, scene->camera, 1);
|
2012-02-22 16:52:06 +00:00
|
|
|
}
|
2012-03-25 23:54:33 +00:00
|
|
|
else clip = bgpic->clip;
|
2011-11-07 12:55:18 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
if (clip == NULL)
|
2011-11-07 12:55:18 +00:00
|
|
|
continue;
|
|
|
|
|
|
|
|
BKE_movieclip_user_set_frame(&bgpic->cuser, CFRA);
|
2012-03-25 23:54:33 +00:00
|
|
|
ibuf = BKE_movieclip_get_ibuf(clip, &bgpic->cuser);
|
2011-11-07 12:55:18 +00:00
|
|
|
|
2012-06-13 12:58:01 +00:00
|
|
|
image_aspect[0] = clip->aspx;
|
2012-08-09 16:56:42 +00:00
|
|
|
image_aspect[1] = clip->aspy;
|
2012-06-13 12:58:01 +00:00
|
|
|
|
2011-11-07 12:55:18 +00:00
|
|
|
/* working with ibuf from image and clip has got different workflow now.
|
2012-03-03 16:31:46 +00:00
|
|
|
* ibuf acquired from clip is referenced by cache system and should
|
|
|
|
* be dereferenced after usage. */
|
2012-03-25 23:54:33 +00:00
|
|
|
freeibuf = ibuf;
|
2011-11-07 12:55:18 +00:00
|
|
|
}
|
2012-06-20 18:46:18 +00:00
|
|
|
else {
|
|
|
|
/* perhaps when loading future files... */
|
|
|
|
BLI_assert(0);
|
|
|
|
copy_v2_fl(image_aspect, 1.0f);
|
|
|
|
}
|
2011-11-07 12:55:18 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
if (ibuf == NULL)
|
2010-01-19 22:44:43 +00:00
|
|
|
continue;
|
2011-11-07 12:55:18 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
if ((ibuf->rect == NULL && ibuf->rect_float == NULL) || ibuf->channels != 4) { /* invalid image format */
|
2012-02-22 16:52:06 +00:00
|
|
|
if (freeibuf)
|
2011-11-07 12:55:18 +00:00
|
|
|
IMB_freeImBuf(freeibuf);
|
|
|
|
|
2010-01-19 22:44:43 +00:00
|
|
|
continue;
|
2011-11-07 12:55:18 +00:00
|
|
|
}
|
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
if (ibuf->rect == NULL)
|
2010-01-19 22:44:43 +00:00
|
|
|
IMB_rect_from_float(ibuf);
|
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
if (rv3d->persp == RV3D_CAMOB) {
|
2010-01-19 22:44:43 +00:00
|
|
|
|
2012-06-06 11:40:01 +00:00
|
|
|
if (do_camera_frame) {
|
|
|
|
rctf vb;
|
|
|
|
ED_view3d_calc_camera_border(scene, ar, v3d, rv3d, &vb, FALSE);
|
|
|
|
x1 = vb.xmin;
|
|
|
|
y1 = vb.ymin;
|
|
|
|
x2 = vb.xmax;
|
|
|
|
y2 = vb.ymax;
|
|
|
|
}
|
|
|
|
else {
|
2012-06-06 14:38:47 +00:00
|
|
|
x1 = ar->winrct.xmin;
|
|
|
|
y1 = ar->winrct.ymin;
|
|
|
|
x2 = ar->winrct.xmax;
|
|
|
|
y2 = ar->winrct.ymax;
|
2012-06-06 11:40:01 +00:00
|
|
|
}
|
2012-06-13 12:58:01 +00:00
|
|
|
|
2012-06-13 13:23:48 +00:00
|
|
|
/* apply offset last - camera offset is different to offset in blender units */
|
|
|
|
/* so this has some sane way of working - this matches camera's shift _exactly_ */
|
|
|
|
{
|
2012-10-23 13:28:22 +00:00
|
|
|
const float max_dim = max_ff(x2 - x1, y2 - y1);
|
2012-06-13 13:23:48 +00:00
|
|
|
const float xof_scale = bgpic->xof * max_dim;
|
|
|
|
const float yof_scale = bgpic->yof * max_dim;
|
|
|
|
|
|
|
|
x1 += xof_scale;
|
|
|
|
y1 += yof_scale;
|
|
|
|
x2 += xof_scale;
|
|
|
|
y2 += yof_scale;
|
|
|
|
}
|
|
|
|
|
2012-06-13 12:58:01 +00:00
|
|
|
/* aspect correction */
|
2012-06-14 16:55:55 +00:00
|
|
|
if (bgpic->flag & V3D_BGPIC_CAMERA_ASPECT) {
|
2012-06-13 12:58:01 +00:00
|
|
|
/* apply aspect from clip */
|
|
|
|
const float w_src = ibuf->x * image_aspect[0];
|
|
|
|
const float h_src = ibuf->y * image_aspect[1];
|
|
|
|
|
|
|
|
/* destination aspect is already applied from the camera frame */
|
|
|
|
const float w_dst = x1 - x2;
|
|
|
|
const float h_dst = y1 - y2;
|
|
|
|
|
|
|
|
const float asp_src = w_src / h_src;
|
|
|
|
const float asp_dst = w_dst / h_dst;
|
|
|
|
|
|
|
|
if (fabsf(asp_src - asp_dst) >= FLT_EPSILON) {
|
|
|
|
if ((asp_src > asp_dst) == ((bgpic->flag & V3D_BGPIC_CAMERA_CROP) != 0)) {
|
|
|
|
/* fit X */
|
|
|
|
const float div = asp_src / asp_dst;
|
|
|
|
const float cent = (x1 + x2) / 2.0f;
|
|
|
|
x1 = ((x1 - cent) * div) + cent;
|
|
|
|
x2 = ((x2 - cent) * div) + cent;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
/* fit Y */
|
|
|
|
const float div = asp_dst / asp_src;
|
|
|
|
const float cent = (y1 + y2) / 2.0f;
|
|
|
|
y1 = ((y1 - cent) * div) + cent;
|
|
|
|
y2 = ((y2 - cent) * div) + cent;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2010-01-19 22:44:43 +00:00
|
|
|
}
|
|
|
|
else {
|
2012-09-20 05:09:35 +00:00
|
|
|
float tvec[3];
|
2010-01-19 22:44:43 +00:00
|
|
|
float sco[2];
|
2012-03-25 23:54:33 +00:00
|
|
|
const float mval_f[2] = {1.0f, 0.0f};
|
2010-01-19 22:44:43 +00:00
|
|
|
|
|
|
|
/* calc window coord */
|
|
|
|
initgrabz(rv3d, 0.0, 0.0, 0.0);
|
2012-09-20 05:09:35 +00:00
|
|
|
ED_view3d_win_to_delta(ar, mval_f, tvec);
|
2012-10-23 13:28:22 +00:00
|
|
|
fac = max_ff(fabsf(tvec[0]), max_ff(fabsf(tvec[1]), fabsf(tvec[2]))); /* largest abs axis */
|
2012-03-25 23:54:33 +00:00
|
|
|
fac = 1.0f / fac;
|
2010-01-19 22:44:43 +00:00
|
|
|
|
2012-09-20 05:09:35 +00:00
|
|
|
asp = (float)ibuf->y / (float)ibuf->x;
|
2010-01-19 22:44:43 +00:00
|
|
|
|
2012-09-20 05:09:35 +00:00
|
|
|
zero_v3(tvec);
|
|
|
|
ED_view3d_project_float_v2_m4(ar, tvec, sco, rv3d->persmat);
|
2010-01-19 22:44:43 +00:00
|
|
|
|
2012-09-20 05:09:35 +00:00
|
|
|
x1 = sco[0] + fac * (bgpic->xof - bgpic->size);
|
|
|
|
y1 = sco[1] + asp * fac * (bgpic->yof - bgpic->size);
|
|
|
|
x2 = sco[0] + fac * (bgpic->xof + bgpic->size);
|
|
|
|
y2 = sco[1] + asp * fac * (bgpic->yof + bgpic->size);
|
2010-01-19 22:44:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* complete clip? */
|
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (x2 < 0 || y2 < 0 || x1 > ar->winx || y1 > ar->winy) {
|
|
|
|
if (freeibuf)
|
2011-11-07 12:55:18 +00:00
|
|
|
IMB_freeImBuf(freeibuf);
|
|
|
|
|
|
|
|
continue;
|
|
|
|
}
|
2010-01-19 22:44:43 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
zoomx = (x2 - x1) / ibuf->x;
|
|
|
|
zoomy = (y2 - y1) / ibuf->y;
|
2010-01-19 22:44:43 +00:00
|
|
|
|
|
|
|
/* for some reason; zoomlevels down refuses to use GL_ALPHA_SCALE */
|
2012-02-22 16:52:06 +00:00
|
|
|
if (zoomx < 1.0f || zoomy < 1.0f) {
|
2012-10-23 13:28:22 +00:00
|
|
|
float tzoom = min_ff(zoomx, zoomy);
|
2012-03-25 23:54:33 +00:00
|
|
|
int mip = 0;
|
2010-01-19 22:44:43 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
if ((ibuf->userflags & IB_MIPMAP_INVALID) != 0) {
|
2011-05-08 20:21:31 +00:00
|
|
|
IMB_remakemipmap(ibuf, 0);
|
2012-03-25 23:54:33 +00:00
|
|
|
ibuf->userflags &= ~IB_MIPMAP_INVALID;
|
2011-05-08 20:21:31 +00:00
|
|
|
}
|
2012-03-25 23:54:33 +00:00
|
|
|
else if (ibuf->mipmap[0] == NULL)
|
2010-03-14 18:22:04 +00:00
|
|
|
IMB_makemipmap(ibuf, 0);
|
2010-01-19 22:44:43 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
while (tzoom < 1.0f && mip < 8 && ibuf->mipmap[mip]) {
|
|
|
|
tzoom *= 2.0f;
|
|
|
|
zoomx *= 2.0f;
|
|
|
|
zoomy *= 2.0f;
|
2010-01-19 22:44:43 +00:00
|
|
|
mip++;
|
|
|
|
}
|
2012-03-25 23:54:33 +00:00
|
|
|
if (mip > 0)
|
|
|
|
ibuf = ibuf->mipmap[mip - 1];
|
2010-01-19 22:44:43 +00:00
|
|
|
}
|
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (v3d->zbuf) glDisable(GL_DEPTH_TEST);
|
2010-01-19 22:44:43 +00:00
|
|
|
glDepthMask(0);
|
|
|
|
|
2010-02-01 15:32:55 +00:00
|
|
|
glEnable(GL_BLEND);
|
2010-01-19 22:44:43 +00:00
|
|
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
|
|
|
2010-02-01 15:32:55 +00:00
|
|
|
glMatrixMode(GL_PROJECTION);
|
|
|
|
glPushMatrix();
|
|
|
|
glMatrixMode(GL_MODELVIEW);
|
|
|
|
glPushMatrix();
|
2010-01-19 22:44:43 +00:00
|
|
|
ED_region_pixelspace(ar);
|
|
|
|
|
|
|
|
glPixelZoom(zoomx, zoomy);
|
2012-03-25 23:54:33 +00:00
|
|
|
glColor4f(1.0f, 1.0f, 1.0f, 1.0f - bgpic->blend);
|
2010-01-19 22:44:43 +00:00
|
|
|
glaDrawPixelsTex(x1, y1, ibuf->x, ibuf->y, GL_UNSIGNED_BYTE, ibuf->rect);
|
|
|
|
|
|
|
|
glPixelZoom(1.0, 1.0);
|
|
|
|
glPixelTransferf(GL_ALPHA_SCALE, 1.0f);
|
|
|
|
|
2010-02-01 15:32:55 +00:00
|
|
|
glMatrixMode(GL_PROJECTION);
|
|
|
|
glPopMatrix();
|
|
|
|
glMatrixMode(GL_MODELVIEW);
|
|
|
|
glPopMatrix();
|
2010-01-19 22:44:43 +00:00
|
|
|
|
|
|
|
glDisable(GL_BLEND);
|
|
|
|
|
|
|
|
glDepthMask(1);
|
2012-02-22 16:52:06 +00:00
|
|
|
if (v3d->zbuf) glEnable(GL_DEPTH_TEST);
|
2011-11-07 12:55:18 +00:00
|
|
|
|
2012-09-20 05:09:35 +00:00
|
|
|
if (freeibuf) {
|
2011-11-07 12:55:18 +00:00
|
|
|
IMB_freeImBuf(freeibuf);
|
2012-09-20 05:09:35 +00:00
|
|
|
}
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-06-06 11:40:01 +00:00
|
|
|
static void view3d_draw_bgpic_test(Scene *scene, ARegion *ar, View3D *v3d,
|
2012-08-08 18:21:54 +00:00
|
|
|
const short do_foreground, const short do_camera_frame)
|
2012-04-10 14:59:06 +00:00
|
|
|
{
|
|
|
|
RegionView3D *rv3d = ar->regiondata;
|
|
|
|
|
|
|
|
if ((v3d->flag & V3D_DISPBGPICS) == 0)
|
|
|
|
return;
|
|
|
|
|
2012-07-23 16:41:04 +00:00
|
|
|
/* disabled - mango request, since footage /w only render is quite useful
|
|
|
|
* and this option is easy to disable all background images at once */
|
|
|
|
#if 0
|
2012-04-10 14:59:06 +00:00
|
|
|
if (v3d->flag2 & V3D_RENDER_OVERRIDE)
|
|
|
|
return;
|
2012-07-23 16:41:04 +00:00
|
|
|
#endif
|
2012-04-10 14:59:06 +00:00
|
|
|
|
|
|
|
if ((rv3d->view == RV3D_VIEW_USER) || (rv3d->persp != RV3D_ORTHO)) {
|
|
|
|
if (rv3d->persp == RV3D_CAMOB) {
|
2012-08-08 18:21:54 +00:00
|
|
|
view3d_draw_bgpic(scene, ar, v3d, do_foreground, do_camera_frame);
|
2012-04-10 14:59:06 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
2012-08-08 18:21:54 +00:00
|
|
|
view3d_draw_bgpic(scene, ar, v3d, do_foreground, do_camera_frame);
|
2012-04-10 14:59:06 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-12-19 12:14:58 +00:00
|
|
|
/* ****************** View3d afterdraw *************** */
|
|
|
|
|
|
|
|
typedef struct View3DAfter {
|
|
|
|
struct View3DAfter *next, *prev;
|
|
|
|
struct Base *base;
|
2012-06-10 10:15:49 +00:00
|
|
|
short dflag;
|
2008-12-19 12:14:58 +00:00
|
|
|
} View3DAfter;
|
|
|
|
|
|
|
|
/* temp storage of Objects that need to be drawn as last */
|
2012-06-10 10:15:49 +00:00
|
|
|
void ED_view3d_after_add(ListBase *lb, Base *base, const short dflag)
|
2008-12-19 12:14:58 +00:00
|
|
|
{
|
2012-03-25 23:54:33 +00:00
|
|
|
View3DAfter *v3da = MEM_callocN(sizeof(View3DAfter), "View 3d after");
|
2012-05-16 08:42:50 +00:00
|
|
|
BLI_assert((base->flag & OB_FROMDUPLI) == 0);
|
2010-08-25 14:23:02 +00:00
|
|
|
BLI_addtail(lb, v3da);
|
2012-03-25 23:54:33 +00:00
|
|
|
v3da->base = base;
|
2012-06-10 10:15:49 +00:00
|
|
|
v3da->dflag = dflag;
|
2008-12-19 12:14:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* disables write in zbuffer and draws it over */
|
2008-12-19 14:14:43 +00:00
|
|
|
static void view3d_draw_transp(Scene *scene, ARegion *ar, View3D *v3d)
|
2008-12-19 12:14:58 +00:00
|
|
|
{
|
|
|
|
View3DAfter *v3da, *next;
|
|
|
|
|
|
|
|
glDepthMask(0);
|
2012-03-25 23:54:33 +00:00
|
|
|
v3d->transp = TRUE;
|
2008-12-19 12:14:58 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
for (v3da = v3d->afterdraw_transp.first; v3da; v3da = next) {
|
|
|
|
next = v3da->next;
|
2012-06-10 10:15:49 +00:00
|
|
|
draw_object(scene, ar, v3d, v3da->base, v3da->dflag);
|
2010-08-25 14:23:02 +00:00
|
|
|
BLI_remlink(&v3d->afterdraw_transp, v3da);
|
|
|
|
MEM_freeN(v3da);
|
2008-12-19 12:14:58 +00:00
|
|
|
}
|
2012-03-25 23:54:33 +00:00
|
|
|
v3d->transp = FALSE;
|
2008-12-19 12:14:58 +00:00
|
|
|
|
|
|
|
glDepthMask(1);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2010-08-25 14:23:02 +00:00
|
|
|
/* clears zbuffer and draws it over */
|
|
|
|
static void view3d_draw_xray(Scene *scene, ARegion *ar, View3D *v3d, int clear)
|
|
|
|
{
|
|
|
|
View3DAfter *v3da, *next;
|
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (clear && v3d->zbuf)
|
2010-08-25 14:23:02 +00:00
|
|
|
glClear(GL_DEPTH_BUFFER_BIT);
|
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
v3d->xray = TRUE;
|
|
|
|
for (v3da = v3d->afterdraw_xray.first; v3da; v3da = next) {
|
|
|
|
next = v3da->next;
|
2012-06-10 10:15:49 +00:00
|
|
|
draw_object(scene, ar, v3d, v3da->base, v3da->dflag);
|
2010-08-25 14:23:02 +00:00
|
|
|
BLI_remlink(&v3d->afterdraw_xray, v3da);
|
|
|
|
MEM_freeN(v3da);
|
|
|
|
}
|
2012-03-25 23:54:33 +00:00
|
|
|
v3d->xray = FALSE;
|
2010-08-25 14:23:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* clears zbuffer and draws it over */
|
|
|
|
static void view3d_draw_xraytransp(Scene *scene, ARegion *ar, View3D *v3d, int clear)
|
|
|
|
{
|
|
|
|
View3DAfter *v3da, *next;
|
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (clear && v3d->zbuf)
|
2010-08-25 14:23:02 +00:00
|
|
|
glClear(GL_DEPTH_BUFFER_BIT);
|
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
v3d->xray = TRUE;
|
|
|
|
v3d->transp = TRUE;
|
2010-08-25 14:23:02 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
for (v3da = v3d->afterdraw_xraytransp.first; v3da; v3da = next) {
|
|
|
|
next = v3da->next;
|
2012-06-10 10:15:49 +00:00
|
|
|
draw_object(scene, ar, v3d, v3da->base, v3da->dflag);
|
2010-08-25 14:23:02 +00:00
|
|
|
BLI_remlink(&v3d->afterdraw_xraytransp, v3da);
|
|
|
|
MEM_freeN(v3da);
|
|
|
|
}
|
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
v3d->transp = FALSE;
|
|
|
|
v3d->xray = FALSE;
|
2010-08-25 14:23:02 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2008-12-19 12:14:58 +00:00
|
|
|
/* *********************** */
|
|
|
|
|
|
|
|
/*
|
2012-03-03 16:31:46 +00:00
|
|
|
* In most cases call draw_dupli_objects,
|
|
|
|
* draw_dupli_objects_color was added because when drawing set dupli's
|
|
|
|
* we need to force the color
|
2008-12-19 12:14:58 +00:00
|
|
|
*/
|
2010-03-01 17:53:33 +00:00
|
|
|
|
|
|
|
#if 0
|
|
|
|
int dupli_ob_sort(void *arg1, void *arg2)
|
|
|
|
{
|
2012-03-25 23:54:33 +00:00
|
|
|
void *p1 = ((DupliObject *)arg1)->ob;
|
|
|
|
void *p2 = ((DupliObject *)arg2)->ob;
|
2010-03-01 17:53:33 +00:00
|
|
|
int val = 0;
|
2012-03-25 23:54:33 +00:00
|
|
|
if (p1 < p2) val = -1;
|
|
|
|
else if (p1 > p2) val = 1;
|
2010-03-01 17:53:33 +00:00
|
|
|
return val;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2010-03-04 15:58:27 +00:00
|
|
|
|
2010-03-05 08:53:16 +00:00
|
|
|
static DupliObject *dupli_step(DupliObject *dob)
|
2010-03-04 15:58:27 +00:00
|
|
|
{
|
2012-02-22 16:52:06 +00:00
|
|
|
while (dob && dob->no_draw)
|
2012-03-25 23:54:33 +00:00
|
|
|
dob = dob->next;
|
2010-03-05 08:53:16 +00:00
|
|
|
return dob;
|
2010-03-04 15:58:27 +00:00
|
|
|
}
|
|
|
|
|
2008-12-19 14:14:43 +00:00
|
|
|
static void draw_dupli_objects_color(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int color)
|
2010-03-04 15:58:27 +00:00
|
|
|
{
|
2012-03-25 23:54:33 +00:00
|
|
|
RegionView3D *rv3d = ar->regiondata;
|
2008-12-19 12:14:58 +00:00
|
|
|
ListBase *lb;
|
2012-03-25 23:54:33 +00:00
|
|
|
DupliObject *dob_prev = NULL, *dob, *dob_next = NULL;
|
2012-05-17 02:50:07 +00:00
|
|
|
Base tbase = {NULL};
|
2010-02-06 14:32:50 +00:00
|
|
|
BoundBox bb, *bb_tmp; /* use a copy because draw_object, calls clear_mesh_caches */
|
2012-03-25 23:54:33 +00:00
|
|
|
GLuint displist = 0;
|
|
|
|
short transflag, use_displist = -1; /* -1 is initialize */
|
2008-12-19 12:14:58 +00:00
|
|
|
char dt, dtx;
|
|
|
|
|
|
|
|
if (base->object->restrictflag & OB_RESTRICT_VIEW) return;
|
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
tbase.flag = OB_FROMDUPLI | base->flag;
|
2012-10-04 21:40:39 +00:00
|
|
|
lb = object_duplilist(scene, base->object, FALSE);
|
2012-07-08 20:36:00 +00:00
|
|
|
// BLI_sortlist(lb, dupli_ob_sort); /* might be nice to have if we have a dupli list with mixed objects. */
|
2010-03-04 15:58:27 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
dob = dupli_step(lb->first);
|
|
|
|
if (dob) dob_next = dupli_step(dob->next);
|
2010-03-05 08:53:16 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
for (; dob; dob_prev = dob, dob = dob_next, dob_next = dob_next ? dupli_step(dob_next->next) : NULL) {
|
|
|
|
tbase.object = dob->ob;
|
2010-03-04 15:58:27 +00:00
|
|
|
|
2012-11-25 16:12:07 +00:00
|
|
|
/* extra service: draw the duplicator in drawtype of parent, minimum taken
|
|
|
|
* to allow e.g. boundbox box objects in groups for LOD */
|
|
|
|
dt = tbase.object->dt;
|
|
|
|
tbase.object->dt = MIN2(tbase.object->dt, base->object->dt);
|
|
|
|
|
|
|
|
/* inherit draw extra, but not if a boundbox under the assumption that this
|
|
|
|
* is intended to speed up drawing, and drawing extra (especially wire) can
|
|
|
|
* slow it down too much */
|
|
|
|
dtx = tbase.object->dtx;
|
2012-11-26 11:03:14 +00:00
|
|
|
if (tbase.object->dt != OB_BOUNDBOX)
|
2012-11-25 16:12:07 +00:00
|
|
|
tbase.object->dtx = base->object->dtx;
|
2010-03-04 15:58:27 +00:00
|
|
|
|
|
|
|
/* negative scale flag has to propagate */
|
2012-03-25 23:54:33 +00:00
|
|
|
transflag = tbase.object->transflag;
|
2012-02-22 16:52:06 +00:00
|
|
|
if (base->object->transflag & OB_NEG_SCALE)
|
2010-03-04 15:58:27 +00:00
|
|
|
tbase.object->transflag ^= OB_NEG_SCALE;
|
|
|
|
|
|
|
|
UI_ThemeColorBlend(color, TH_BACK, 0.5);
|
|
|
|
|
|
|
|
/* generate displist, test for new object */
|
2012-02-22 16:52:06 +00:00
|
|
|
if (dob_prev && dob_prev->ob != dob->ob) {
|
2012-05-19 13:28:19 +00:00
|
|
|
if (use_displist == TRUE)
|
2008-12-19 12:14:58 +00:00
|
|
|
glDeleteLists(displist, 1);
|
2010-03-04 15:58:27 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
use_displist = -1;
|
2010-03-04 15:58:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* generate displist */
|
2012-02-22 16:52:06 +00:00
|
|
|
if (use_displist == -1) {
|
2010-03-04 15:58:27 +00:00
|
|
|
|
2012-05-25 09:51:53 +00:00
|
|
|
/* note, since this was added, its checked (dob->type == OB_DUPLIGROUP)
|
2010-03-04 15:58:27 +00:00
|
|
|
* however this is very slow, it was probably needed for the NLA
|
|
|
|
* offset feature (used in group-duplicate.blend but no longer works in 2.5)
|
|
|
|
* so for now it should be ok to - campbell */
|
|
|
|
|
2012-05-08 15:55:29 +00:00
|
|
|
if ( /* if this is the last no need to make a displist */
|
2012-03-25 23:54:33 +00:00
|
|
|
(dob_next == NULL || dob_next->ob != dob->ob) ||
|
|
|
|
/* lamp drawing messes with matrices, could be handled smarter... but this works */
|
|
|
|
(dob->ob->type == OB_LAMP) ||
|
|
|
|
(dob->type == OB_DUPLIGROUP && dob->animated) ||
|
2012-05-05 14:03:12 +00:00
|
|
|
!(bb_tmp = BKE_object_boundbox_get(dob->ob)))
|
2012-01-19 16:04:44 +00:00
|
|
|
{
|
2010-03-04 15:58:27 +00:00
|
|
|
// printf("draw_dupli_objects_color: skipping displist for %s\n", dob->ob->id.name+2);
|
2012-05-19 13:28:19 +00:00
|
|
|
use_displist = FALSE;
|
2008-12-19 12:14:58 +00:00
|
|
|
}
|
|
|
|
else {
|
2010-03-04 15:58:27 +00:00
|
|
|
// printf("draw_dupli_objects_color: using displist for %s\n", dob->ob->id.name+2);
|
2012-03-25 23:54:33 +00:00
|
|
|
bb = *bb_tmp; /* must make a copy */
|
2010-03-04 15:58:27 +00:00
|
|
|
|
|
|
|
/* disable boundbox check for list creation */
|
2012-05-05 14:03:12 +00:00
|
|
|
BKE_object_boundbox_flag(dob->ob, OB_BB_DISABLED, 1);
|
2010-03-04 15:58:27 +00:00
|
|
|
/* need this for next part of code */
|
2012-03-25 23:54:33 +00:00
|
|
|
unit_m4(dob->ob->obmat); /* obmat gets restored */
|
2010-03-04 15:58:27 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
displist = glGenLists(1);
|
2010-03-04 15:58:27 +00:00
|
|
|
glNewList(displist, GL_COMPILE);
|
2008-12-19 14:14:43 +00:00
|
|
|
draw_object(scene, ar, v3d, &tbase, DRAW_CONSTCOLOR);
|
2010-03-04 15:58:27 +00:00
|
|
|
glEndList();
|
2010-03-04 14:59:20 +00:00
|
|
|
|
2012-05-19 13:28:19 +00:00
|
|
|
use_displist = TRUE;
|
2012-05-05 14:03:12 +00:00
|
|
|
BKE_object_boundbox_flag(dob->ob, OB_BB_DISABLED, 0);
|
2010-03-04 15:58:27 +00:00
|
|
|
}
|
|
|
|
}
|
2012-02-22 16:52:06 +00:00
|
|
|
if (use_displist) {
|
2010-03-04 15:58:27 +00:00
|
|
|
glMultMatrixf(dob->mat);
|
2012-02-22 16:52:06 +00:00
|
|
|
if (ED_view3d_boundbox_clip(rv3d, dob->mat, &bb))
|
2010-03-04 15:58:27 +00:00
|
|
|
glCallList(displist);
|
|
|
|
glLoadMatrixf(rv3d->viewmat);
|
2008-12-19 12:14:58 +00:00
|
|
|
}
|
2010-03-04 15:58:27 +00:00
|
|
|
else {
|
|
|
|
copy_m4_m4(dob->ob->obmat, dob->mat);
|
|
|
|
draw_object(scene, ar, v3d, &tbase, DRAW_CONSTCOLOR);
|
|
|
|
}
|
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
tbase.object->dt = dt;
|
|
|
|
tbase.object->dtx = dtx;
|
|
|
|
tbase.object->transflag = transflag;
|
2008-12-19 12:14:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Transp afterdraw disabled, afterdraw only stores base pointers, and duplis can be same obj */
|
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
free_object_duplilist(lb); /* does restore */
|
2008-12-19 12:14:58 +00:00
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (use_displist)
|
2008-12-19 12:14:58 +00:00
|
|
|
glDeleteLists(displist, 1);
|
|
|
|
}
|
|
|
|
|
2008-12-19 14:14:43 +00:00
|
|
|
static void draw_dupli_objects(Scene *scene, ARegion *ar, View3D *v3d, Base *base)
|
2008-12-19 12:14:58 +00:00
|
|
|
{
|
|
|
|
/* define the color here so draw_dupli_objects_color can be called
|
2012-03-03 16:31:46 +00:00
|
|
|
* from the set loop */
|
2008-12-19 12:14:58 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
int color = (base->flag & SELECT) ? TH_SELECT : TH_WIRE;
|
2008-12-19 12:14:58 +00:00
|
|
|
/* debug */
|
2012-03-25 23:54:33 +00:00
|
|
|
if (base->object->dup_group && base->object->dup_group->id.us < 1)
|
|
|
|
color = TH_REDALERT;
|
2008-12-19 12:14:58 +00:00
|
|
|
|
2008-12-19 14:14:43 +00:00
|
|
|
draw_dupli_objects_color(scene, ar, v3d, base, color);
|
2008-12-19 12:14:58 +00:00
|
|
|
}
|
|
|
|
|
2010-10-21 07:38:09 +00:00
|
|
|
void view3d_update_depths_rect(ARegion *ar, ViewDepths *d, rcti *rect)
|
|
|
|
{
|
2012-10-21 05:46:41 +00:00
|
|
|
int x, y, w, h;
|
2010-11-03 06:31:53 +00:00
|
|
|
rcti r;
|
2010-10-21 07:38:09 +00:00
|
|
|
/* clamp rect by area */
|
2010-10-27 08:55:13 +00:00
|
|
|
|
2012-03-24 02:51:46 +00:00
|
|
|
r.xmin = 0;
|
2012-03-25 23:54:33 +00:00
|
|
|
r.xmax = ar->winx - 1;
|
2012-03-24 02:51:46 +00:00
|
|
|
r.ymin = 0;
|
2012-03-25 23:54:33 +00:00
|
|
|
r.ymax = ar->winy - 1;
|
2010-11-03 06:31:53 +00:00
|
|
|
|
2010-10-21 07:38:09 +00:00
|
|
|
/* Constrain rect to depth bounds */
|
2012-07-15 00:29:56 +00:00
|
|
|
BLI_rcti_isect(&r, rect, rect);
|
2010-10-21 07:38:09 +00:00
|
|
|
|
|
|
|
/* assign values to compare with the ViewDepths */
|
2012-03-25 23:54:33 +00:00
|
|
|
x = rect->xmin;
|
|
|
|
y = rect->ymin;
|
2010-10-21 07:38:09 +00:00
|
|
|
|
2012-09-15 11:48:20 +00:00
|
|
|
w = BLI_rcti_size_x(rect);
|
|
|
|
h = BLI_rcti_size_y(rect);
|
2010-10-21 07:38:09 +00:00
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (w <= 0 || h <= 0) {
|
|
|
|
if (d->depths)
|
2010-10-27 08:55:13 +00:00
|
|
|
MEM_freeN(d->depths);
|
2012-03-25 23:54:33 +00:00
|
|
|
d->depths = NULL;
|
2010-10-27 08:55:13 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
d->damaged = FALSE;
|
2010-10-27 08:55:13 +00:00
|
|
|
}
|
2012-03-25 23:54:33 +00:00
|
|
|
else if (d->w != w ||
|
|
|
|
d->h != h ||
|
|
|
|
d->x != x ||
|
|
|
|
d->y != y ||
|
|
|
|
d->depths == NULL
|
|
|
|
)
|
|
|
|
{
|
|
|
|
d->x = x;
|
|
|
|
d->y = y;
|
|
|
|
d->w = w;
|
|
|
|
d->h = h;
|
2010-10-21 07:38:09 +00:00
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (d->depths)
|
2010-10-21 07:38:09 +00:00
|
|
|
MEM_freeN(d->depths);
|
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
d->depths = MEM_mallocN(sizeof(float) * d->w * d->h, "View depths Subset");
|
2010-10-21 07:38:09 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
d->damaged = TRUE;
|
2010-10-21 07:38:09 +00:00
|
|
|
}
|
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (d->damaged) {
|
2012-03-25 23:54:33 +00:00
|
|
|
glReadPixels(ar->winrct.xmin + d->x, ar->winrct.ymin + d->y, d->w, d->h, GL_DEPTH_COMPONENT, GL_FLOAT, d->depths);
|
|
|
|
glGetDoublev(GL_DEPTH_RANGE, d->depth_range);
|
|
|
|
d->damaged = FALSE;
|
2010-10-21 07:38:09 +00:00
|
|
|
}
|
|
|
|
}
|
2008-12-19 12:14:58 +00:00
|
|
|
|
2010-10-21 07:38:09 +00:00
|
|
|
/* note, with nouveau drivers the glReadPixels() is very slow. [#24339] */
|
2011-05-21 08:56:37 +00:00
|
|
|
void ED_view3d_depth_update(ARegion *ar)
|
2008-12-18 17:38:21 +00:00
|
|
|
{
|
2012-03-25 23:54:33 +00:00
|
|
|
RegionView3D *rv3d = ar->regiondata;
|
2.5
View3D has been split now in a local part (RegionView3D) and a
per-area part (old View3D). Currently local is:
- view transform
- camera zoom/offset
- gpencil (todo)
- custom clipping planes
Rest is in Area still, like active camera, draw type, layers,
localview, custom centers, around-settings, transform widget,
gridlines, and so on (mostly stuff as available in header).
To see it work; also added new feature for region split,
press SHIFT+ALT+CTRL+S for four-split.
The idea is to make a preset 4-split, configured to stick
to top/right/front views for three views.
Another cool idea to explore is to then box-clip all drawing
based on these 3 views.
Note about the code:
- currently view3d still stores some depricated settings, to
convert from older files. Not all settings are copied over
though, like custom clip planes or the 'lock view to object'.
- since some view3d ops are now on area level, the operators
for it should keep track of that.
Bugfix in transform: quat initialize in operator-invoke missed
one zero.
Als brought back GE to compile for missing Ipos and channels.
2009-01-19 16:54:41 +00:00
|
|
|
|
2008-12-18 17:38:21 +00:00
|
|
|
/* Create storage for, and, if necessary, copy depth buffer */
|
2012-03-25 23:54:33 +00:00
|
|
|
if (!rv3d->depths) rv3d->depths = MEM_callocN(sizeof(ViewDepths), "ViewDepths");
|
2012-02-22 16:52:06 +00:00
|
|
|
if (rv3d->depths) {
|
2012-03-25 23:54:33 +00:00
|
|
|
ViewDepths *d = rv3d->depths;
|
2012-02-22 16:52:06 +00:00
|
|
|
if (d->w != ar->winx ||
|
2012-03-25 23:54:33 +00:00
|
|
|
d->h != ar->winy ||
|
|
|
|
!d->depths)
|
|
|
|
{
|
|
|
|
d->w = ar->winx;
|
|
|
|
d->h = ar->winy;
|
2012-02-22 16:52:06 +00:00
|
|
|
if (d->depths)
|
2008-12-18 17:38:21 +00:00
|
|
|
MEM_freeN(d->depths);
|
2012-03-25 23:54:33 +00:00
|
|
|
d->depths = MEM_mallocN(sizeof(float) * d->w * d->h, "View depths");
|
|
|
|
d->damaged = 1;
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (d->damaged) {
|
2012-03-25 23:54:33 +00:00
|
|
|
glReadPixels(ar->winrct.xmin, ar->winrct.ymin, d->w, d->h,
|
|
|
|
GL_DEPTH_COMPONENT, GL_FLOAT, d->depths);
|
2008-12-18 17:38:21 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
glGetDoublev(GL_DEPTH_RANGE, d->depth_range);
|
2008-12-18 17:38:21 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
d->damaged = 0;
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-10-21 07:38:09 +00:00
|
|
|
/* utility function to find the closest Z value, use for autodepth */
|
|
|
|
float view3d_depth_near(ViewDepths *d)
|
|
|
|
{
|
|
|
|
/* convert to float for comparisons */
|
2012-03-25 23:54:33 +00:00
|
|
|
const float near = (float)d->depth_range[0];
|
|
|
|
const float far_real = (float)d->depth_range[1];
|
|
|
|
float far = far_real;
|
2010-10-21 07:38:09 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
const float *depths = d->depths;
|
|
|
|
float depth = FLT_MAX;
|
|
|
|
int i = (int)d->w * (int)d->h; /* cast to avoid short overflow */
|
2010-10-21 07:38:09 +00:00
|
|
|
|
|
|
|
/* far is both the starting 'far' value
|
2012-10-21 05:46:41 +00:00
|
|
|
* and the closest value found. */
|
2012-02-22 16:52:06 +00:00
|
|
|
while (i--) {
|
2012-03-25 23:54:33 +00:00
|
|
|
depth = *depths++;
|
2012-02-22 16:52:06 +00:00
|
|
|
if ((depth < far) && (depth > near)) {
|
2012-03-25 23:54:33 +00:00
|
|
|
far = depth;
|
2010-10-21 07:38:09 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return far == far_real ? FLT_MAX : far;
|
|
|
|
}
|
|
|
|
|
2010-01-01 16:46:27 +00:00
|
|
|
void draw_depth_gpencil(Scene *scene, ARegion *ar, View3D *v3d)
|
|
|
|
{
|
2012-03-25 23:54:33 +00:00
|
|
|
short zbuf = v3d->zbuf;
|
|
|
|
RegionView3D *rv3d = ar->regiondata;
|
2010-01-01 16:46:27 +00:00
|
|
|
|
2012-10-27 10:42:28 +00:00
|
|
|
setwinmatrixview3d(ar, v3d, NULL);
|
2012-05-05 14:03:12 +00:00
|
|
|
setviewmatrixview3d(scene, v3d, rv3d); /* note: calls BKE_object_where_is_calc for camera... */
|
2010-01-01 16:46:27 +00:00
|
|
|
|
Math lib: matrix multiplication order fix for two functions that were
inconsistent with similar functions & math notation:
mul_m4_m4m4(R, B, A) => mult_m4_m4m4(R, A, B)
mul_m3_m3m4(R, B, A) => mult_m3_m3m4(R, A, B)
For branch maintainers, it should be relatively simple to fix things manually,
it's also possible run this script after merging to do automatic replacement:
http://www.pasteall.org/27459/python
2011-12-16 19:53:12 +00:00
|
|
|
mult_m4_m4m4(rv3d->persmat, rv3d->winmat, rv3d->viewmat);
|
2010-01-01 16:46:27 +00:00
|
|
|
invert_m4_m4(rv3d->persinv, rv3d->persmat);
|
|
|
|
invert_m4_m4(rv3d->viewinv, rv3d->viewmat);
|
|
|
|
|
|
|
|
glClear(GL_DEPTH_BUFFER_BIT);
|
|
|
|
|
2010-02-01 15:32:55 +00:00
|
|
|
glLoadMatrixf(rv3d->viewmat);
|
2010-01-01 16:46:27 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
v3d->zbuf = TRUE;
|
2010-01-01 16:46:27 +00:00
|
|
|
glEnable(GL_DEPTH_TEST);
|
|
|
|
|
2012-12-17 02:34:53 +00:00
|
|
|
if (v3d->flag2 & V3D_SHOW_GPENCIL) {
|
|
|
|
draw_gpencil_view3d(scene, v3d, ar, TRUE);
|
|
|
|
}
|
2010-01-03 01:55:20 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
v3d->zbuf = zbuf;
|
2010-01-03 01:55:20 +00:00
|
|
|
|
2010-01-01 16:46:27 +00:00
|
|
|
}
|
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
void draw_depth(Scene *scene, ARegion *ar, View3D *v3d, int (*func)(void *))
|
2008-12-19 12:14:58 +00:00
|
|
|
{
|
2012-03-25 23:54:33 +00:00
|
|
|
RegionView3D *rv3d = ar->regiondata;
|
2008-12-19 12:14:58 +00:00
|
|
|
Base *base;
|
2012-03-25 23:54:33 +00:00
|
|
|
short zbuf = v3d->zbuf;
|
|
|
|
short flag = v3d->flag;
|
|
|
|
float glalphaclip = U.glalphaclip;
|
|
|
|
int obcenter_dia = U.obcenter_dia;
|
2008-12-19 12:14:58 +00:00
|
|
|
/* temp set drawtype to solid */
|
|
|
|
|
|
|
|
/* Setting these temporarily is not nice */
|
|
|
|
v3d->flag &= ~V3D_SELECT_OUTLINE;
|
2010-01-03 01:55:20 +00:00
|
|
|
U.glalphaclip = 0.5; /* not that nice but means we wont zoom into billboards */
|
2012-03-25 23:54:33 +00:00
|
|
|
U.obcenter_dia = 0;
|
2008-12-19 12:14:58 +00:00
|
|
|
|
2012-10-27 10:42:28 +00:00
|
|
|
setwinmatrixview3d(ar, v3d, NULL);
|
2012-05-05 14:03:12 +00:00
|
|
|
setviewmatrixview3d(scene, v3d, rv3d); /* note: calls BKE_object_where_is_calc for camera... */
|
2008-12-19 12:14:58 +00:00
|
|
|
|
Math lib: matrix multiplication order fix for two functions that were
inconsistent with similar functions & math notation:
mul_m4_m4m4(R, B, A) => mult_m4_m4m4(R, A, B)
mul_m3_m3m4(R, B, A) => mult_m3_m3m4(R, A, B)
For branch maintainers, it should be relatively simple to fix things manually,
it's also possible run this script after merging to do automatic replacement:
http://www.pasteall.org/27459/python
2011-12-16 19:53:12 +00:00
|
|
|
mult_m4_m4m4(rv3d->persmat, rv3d->winmat, rv3d->viewmat);
|
2009-11-10 20:43:45 +00:00
|
|
|
invert_m4_m4(rv3d->persinv, rv3d->persmat);
|
|
|
|
invert_m4_m4(rv3d->viewinv, rv3d->viewmat);
|
2008-12-19 12:14:58 +00:00
|
|
|
|
|
|
|
glClear(GL_DEPTH_BUFFER_BIT);
|
|
|
|
|
2010-02-01 15:32:55 +00:00
|
|
|
glLoadMatrixf(rv3d->viewmat);
|
2012-07-08 20:36:00 +00:00
|
|
|
// persp(PERSP_STORE); /* store correct view for persp(PERSP_VIEW) calls */
|
2008-12-19 12:14:58 +00:00
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (rv3d->rflag & RV3D_CLIPPING) {
|
2012-02-28 13:03:56 +00:00
|
|
|
ED_view3d_clipping_set(rv3d);
|
2008-12-19 12:14:58 +00:00
|
|
|
}
|
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
v3d->zbuf = TRUE;
|
2008-12-19 12:14:58 +00:00
|
|
|
glEnable(GL_DEPTH_TEST);
|
|
|
|
|
|
|
|
/* draw set first */
|
2012-02-22 16:52:06 +00:00
|
|
|
if (scene->set) {
|
2010-12-17 15:37:59 +00:00
|
|
|
Scene *sce_iter;
|
2012-02-22 16:52:06 +00:00
|
|
|
for (SETLOOPER(scene->set, sce_iter, base)) {
|
|
|
|
if (v3d->lay & base->lay) {
|
2008-12-19 12:14:58 +00:00
|
|
|
if (func == NULL || func(base)) {
|
2008-12-19 14:14:43 +00:00
|
|
|
draw_object(scene, ar, v3d, base, 0);
|
2012-02-22 16:52:06 +00:00
|
|
|
if (base->object->transflag & OB_DUPLI) {
|
2008-12-19 14:14:43 +00:00
|
|
|
draw_dupli_objects_color(scene, ar, v3d, base, TH_WIRE);
|
2008-12-19 12:14:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
for (base = scene->base.first; base; base = base->next) {
|
2012-02-22 16:52:06 +00:00
|
|
|
if (v3d->lay & base->lay) {
|
2008-12-19 12:14:58 +00:00
|
|
|
if (func == NULL || func(base)) {
|
|
|
|
/* dupli drawing */
|
2012-02-22 16:52:06 +00:00
|
|
|
if (base->object->transflag & OB_DUPLI) {
|
2008-12-19 14:14:43 +00:00
|
|
|
draw_dupli_objects(scene, ar, v3d, base);
|
2008-12-19 12:14:58 +00:00
|
|
|
}
|
2008-12-19 14:14:43 +00:00
|
|
|
draw_object(scene, ar, v3d, base, 0);
|
2008-12-19 12:14:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-03-18 07:38:51 +00:00
|
|
|
/* this isn't that nice, draw xray objects as if they are normal */
|
2012-03-25 23:54:33 +00:00
|
|
|
if (v3d->afterdraw_transp.first ||
|
|
|
|
v3d->afterdraw_xray.first ||
|
|
|
|
v3d->afterdraw_xraytransp.first)
|
|
|
|
{
|
2008-12-19 12:14:58 +00:00
|
|
|
View3DAfter *v3da, *next;
|
2010-07-26 01:59:50 +00:00
|
|
|
int mask_orig;
|
2010-08-25 14:23:02 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
v3d->xray = TRUE;
|
2008-12-19 12:14:58 +00:00
|
|
|
|
2010-07-26 01:59:50 +00:00
|
|
|
/* transp materials can change the depth mask, see #21388 */
|
|
|
|
glGetIntegerv(GL_DEPTH_WRITEMASK, &mask_orig);
|
|
|
|
|
2010-08-25 14:23:02 +00:00
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (v3d->afterdraw_xray.first || v3d->afterdraw_xraytransp.first) {
|
2010-08-25 14:23:02 +00:00
|
|
|
glDepthFunc(GL_ALWAYS); /* always write into the depth bufer, overwriting front z values */
|
2012-03-25 23:54:33 +00:00
|
|
|
for (v3da = v3d->afterdraw_xray.first; v3da; v3da = next) {
|
|
|
|
next = v3da->next;
|
2008-12-19 14:14:43 +00:00
|
|
|
draw_object(scene, ar, v3d, v3da->base, 0);
|
2008-12-19 12:14:58 +00:00
|
|
|
}
|
2010-08-25 14:23:02 +00:00
|
|
|
glDepthFunc(GL_LEQUAL); /* Now write the depth buffer normally */
|
2008-12-19 12:14:58 +00:00
|
|
|
}
|
2010-08-25 14:23:02 +00:00
|
|
|
|
|
|
|
/* draw 3 passes, transp/xray/xraytransp */
|
2012-03-25 23:54:33 +00:00
|
|
|
v3d->xray = FALSE;
|
|
|
|
v3d->transp = TRUE;
|
|
|
|
for (v3da = v3d->afterdraw_transp.first; v3da; v3da = next) {
|
|
|
|
next = v3da->next;
|
2010-08-25 14:23:02 +00:00
|
|
|
draw_object(scene, ar, v3d, v3da->base, 0);
|
|
|
|
BLI_remlink(&v3d->afterdraw_transp, v3da);
|
|
|
|
MEM_freeN(v3da);
|
|
|
|
}
|
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
v3d->xray = TRUE;
|
|
|
|
v3d->transp = FALSE;
|
|
|
|
for (v3da = v3d->afterdraw_xray.first; v3da; v3da = next) {
|
|
|
|
next = v3da->next;
|
2010-08-25 14:23:02 +00:00
|
|
|
draw_object(scene, ar, v3d, v3da->base, 0);
|
|
|
|
BLI_remlink(&v3d->afterdraw_xray, v3da);
|
|
|
|
MEM_freeN(v3da);
|
|
|
|
}
|
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
v3d->xray = TRUE;
|
|
|
|
v3d->transp = TRUE;
|
|
|
|
for (v3da = v3d->afterdraw_xraytransp.first; v3da; v3da = next) {
|
|
|
|
next = v3da->next;
|
2010-08-25 14:23:02 +00:00
|
|
|
draw_object(scene, ar, v3d, v3da->base, 0);
|
|
|
|
BLI_remlink(&v3d->afterdraw_xraytransp, v3da);
|
2008-12-19 12:14:58 +00:00
|
|
|
MEM_freeN(v3da);
|
|
|
|
}
|
2010-08-25 14:23:02 +00:00
|
|
|
|
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
v3d->xray = FALSE;
|
|
|
|
v3d->transp = FALSE;
|
2010-07-26 01:59:50 +00:00
|
|
|
|
|
|
|
glDepthMask(mask_orig);
|
2008-12-19 12:14:58 +00:00
|
|
|
}
|
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (rv3d->rflag & RV3D_CLIPPING)
|
2012-02-28 13:03:56 +00:00
|
|
|
ED_view3d_clipping_disable();
|
2010-02-12 11:03:41 +00:00
|
|
|
|
2008-12-19 12:14:58 +00:00
|
|
|
v3d->zbuf = zbuf;
|
2012-02-22 16:52:06 +00:00
|
|
|
if (!v3d->zbuf) glDisable(GL_DEPTH_TEST);
|
2010-02-12 11:03:41 +00:00
|
|
|
|
2008-12-19 12:14:58 +00:00
|
|
|
U.glalphaclip = glalphaclip;
|
|
|
|
v3d->flag = flag;
|
2012-03-25 23:54:33 +00:00
|
|
|
U.obcenter_dia = obcenter_dia;
|
2008-12-19 12:14:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
typedef struct View3DShadow {
|
|
|
|
struct View3DShadow *next, *prev;
|
|
|
|
GPULamp *lamp;
|
|
|
|
} View3DShadow;
|
|
|
|
|
2012-01-19 16:04:44 +00:00
|
|
|
static void gpu_render_lamp_update(Scene *scene, View3D *v3d, Object *ob, Object *par,
|
2012-12-11 14:29:01 +00:00
|
|
|
float obmat[4][4], ListBase *shadows)
|
2008-12-19 12:14:58 +00:00
|
|
|
{
|
|
|
|
GPULamp *lamp;
|
2012-03-25 23:54:33 +00:00
|
|
|
Lamp *la = (Lamp *)ob->data;
|
2008-12-19 12:14:58 +00:00
|
|
|
View3DShadow *shadow;
|
|
|
|
|
|
|
|
lamp = GPU_lamp_from_blender(scene, ob, par);
|
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (lamp) {
|
2010-07-30 10:44:00 +00:00
|
|
|
GPU_lamp_update(lamp, ob->lay, (ob->restrictflag & OB_RESTRICT_RENDER), obmat);
|
2009-06-08 20:08:19 +00:00
|
|
|
GPU_lamp_update_colors(lamp, la->r, la->g, la->b, la->energy);
|
2008-12-19 12:14:58 +00:00
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if ((ob->lay & v3d->lay) && GPU_lamp_has_shadow_buffer(lamp)) {
|
2012-03-25 23:54:33 +00:00
|
|
|
shadow = MEM_callocN(sizeof(View3DShadow), "View3DShadow");
|
2008-12-19 12:14:58 +00:00
|
|
|
shadow->lamp = lamp;
|
|
|
|
BLI_addtail(shadows, shadow);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void gpu_update_lamps_shadows(Scene *scene, View3D *v3d)
|
|
|
|
{
|
|
|
|
ListBase shadows;
|
|
|
|
View3DShadow *shadow;
|
2010-12-17 15:37:59 +00:00
|
|
|
Scene *sce_iter;
|
2008-12-19 12:14:58 +00:00
|
|
|
Base *base;
|
|
|
|
Object *ob;
|
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
shadows.first = shadows.last = NULL;
|
2008-12-19 12:14:58 +00:00
|
|
|
|
|
|
|
/* update lamp transform and gather shadow lamps */
|
2012-02-22 16:52:06 +00:00
|
|
|
for (SETLOOPER(scene, sce_iter, base)) {
|
2012-03-25 23:54:33 +00:00
|
|
|
ob = base->object;
|
2008-12-19 12:14:58 +00:00
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (ob->type == OB_LAMP)
|
2008-12-19 12:14:58 +00:00
|
|
|
gpu_render_lamp_update(scene, v3d, ob, NULL, ob->obmat, &shadows);
|
|
|
|
|
|
|
|
if (ob->transflag & OB_DUPLI) {
|
|
|
|
DupliObject *dob;
|
2012-10-04 21:40:39 +00:00
|
|
|
ListBase *lb = object_duplilist(scene, ob, FALSE);
|
2008-12-19 12:14:58 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
for (dob = lb->first; dob; dob = dob->next)
|
|
|
|
if (dob->ob->type == OB_LAMP)
|
2008-12-19 12:14:58 +00:00
|
|
|
gpu_render_lamp_update(scene, v3d, dob->ob, ob, dob->mat, &shadows);
|
|
|
|
|
|
|
|
free_object_duplilist(lb);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* render shadows after updating all lamps, nested object_duplilist
|
2012-03-03 11:45:08 +00:00
|
|
|
* don't work correct since it's replacing object matrices */
|
2012-03-25 23:54:33 +00:00
|
|
|
for (shadow = shadows.first; shadow; shadow = shadow->next) {
|
2008-12-19 12:14:58 +00:00
|
|
|
/* this needs to be done better .. */
|
|
|
|
float viewmat[4][4], winmat[4][4];
|
2012-03-25 23:54:33 +00:00
|
|
|
int drawtype, lay, winsize, flag2 = v3d->flag2;
|
|
|
|
ARegion ar = {NULL};
|
|
|
|
RegionView3D rv3d = {{{0}}};
|
2008-12-19 12:14:58 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
drawtype = v3d->drawtype;
|
|
|
|
lay = v3d->lay;
|
2008-12-19 12:14:58 +00:00
|
|
|
|
|
|
|
v3d->drawtype = OB_SOLID;
|
|
|
|
v3d->lay &= GPU_lamp_shadow_layer(shadow->lamp);
|
|
|
|
v3d->flag2 &= ~V3D_SOLID_TEX;
|
2011-08-24 20:28:54 +00:00
|
|
|
v3d->flag2 |= V3D_RENDER_OVERRIDE | V3D_RENDER_SHADOW;
|
2008-12-19 12:14:58 +00:00
|
|
|
|
|
|
|
GPU_lamp_shadow_buffer_bind(shadow->lamp, viewmat, &winsize, winmat);
|
2010-04-06 01:34:55 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
ar.regiondata = &rv3d;
|
|
|
|
ar.regiontype = RGN_TYPE_WINDOW;
|
|
|
|
rv3d.persp = RV3D_CAMOB;
|
2010-04-06 01:34:55 +00:00
|
|
|
copy_m4_m4(rv3d.winmat, winmat);
|
|
|
|
copy_m4_m4(rv3d.viewmat, viewmat);
|
|
|
|
invert_m4_m4(rv3d.viewinv, rv3d.viewmat);
|
Math lib: matrix multiplication order fix for two functions that were
inconsistent with similar functions & math notation:
mul_m4_m4m4(R, B, A) => mult_m4_m4m4(R, A, B)
mul_m3_m3m4(R, B, A) => mult_m3_m3m4(R, A, B)
For branch maintainers, it should be relatively simple to fix things manually,
it's also possible run this script after merging to do automatic replacement:
http://www.pasteall.org/27459/python
2011-12-16 19:53:12 +00:00
|
|
|
mult_m4_m4m4(rv3d.persmat, rv3d.winmat, rv3d.viewmat);
|
2010-04-06 01:34:55 +00:00
|
|
|
invert_m4_m4(rv3d.persinv, rv3d.viewinv);
|
|
|
|
|
2012-10-23 12:25:08 +00:00
|
|
|
/* no need to call ED_view3d_draw_offscreen_init since shadow buffers were already updated */
|
Color Management, Stage 2: Switch color pipeline to use OpenColorIO
Replace old color pipeline which was supporting linear/sRGB color spaces
only with OpenColorIO-based pipeline.
This introduces two configurable color spaces:
- Input color space for images and movie clips. This space is used to convert
images/movies from color space in which file is saved to Blender's linear
space (for float images, byte images are not internally converted, only input
space is stored for such images and used later).
This setting could be found in image/clip data block settings.
- Display color space which defines space in which particular display is working.
This settings could be found in scene's Color Management panel.
When render result is being displayed on the screen, apart from converting image
to display space, some additional conversions could happen.
This conversions are:
- View, which defines tone curve applying before display transformation.
These are different ways to view the image on the same display device.
For example it could be used to emulate film view on sRGB display.
- Exposure affects on image exposure before tone map is applied.
- Gamma is post-display gamma correction, could be used to match particular
display gamma.
- RGB curves are user-defined curves which are applying before display
transformation, could be used for different purposes.
All this settings by default are only applying on render result and does not
affect on other images. If some particular image needs to be affected by this
transformation, "View as Render" setting of image data block should be set to
truth. Movie clips are always affected by all display transformations.
This commit also introduces configurable color space in which sequencer is
working. This setting could be found in scene's Color Management panel and
it should be used if such stuff as grading needs to be done in color space
different from sRGB (i.e. when Film view on sRGB display is use, using VD16
space as sequencer's internal space would make grading working in space
which is close to the space using for display).
Some technical notes:
- Image buffer's float buffer is now always in linear space, even if it was
created from 16bit byte images.
- Space of byte buffer is stored in image buffer's rect_colorspace property.
- Profile of image buffer was removed since it's not longer meaningful.
- OpenGL and GLSL is supposed to always work in sRGB space. It is possible
to support other spaces, but it's quite large project which isn't so
much important.
- Legacy Color Management option disabled is emulated by using None display.
It could have some regressions, but there's no clear way to avoid them.
- If OpenColorIO is disabled on build time, it should make blender behaving
in the same way as previous release with color management enabled.
More details could be found at this page (more details would be added soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.64/Color_Management
--
Thanks to Xavier Thomas, Lukas Toene for initial work on OpenColorIO
integration and to Brecht van Lommel for some further development and code/
usecase review!
2012-09-15 10:05:07 +00:00
|
|
|
ED_view3d_draw_offscreen(scene, v3d, &ar, winsize, winsize, viewmat, winmat, FALSE, FALSE);
|
2008-12-19 12:14:58 +00:00
|
|
|
GPU_lamp_shadow_buffer_unbind(shadow->lamp);
|
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
v3d->drawtype = drawtype;
|
|
|
|
v3d->lay = lay;
|
2010-07-04 17:22:24 +00:00
|
|
|
v3d->flag2 = flag2;
|
2008-12-19 12:14:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
BLI_freelistN(&shadows);
|
|
|
|
}
|
|
|
|
|
2009-01-07 14:46:50 +00:00
|
|
|
/* *********************** customdata **************** */
|
|
|
|
|
2011-03-13 02:44:25 +00:00
|
|
|
CustomDataMask ED_view3d_datamask(Scene *scene, View3D *v3d)
|
|
|
|
{
|
2012-03-25 23:54:33 +00:00
|
|
|
CustomDataMask mask = 0;
|
2011-10-23 13:00:41 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
if (ELEM(v3d->drawtype, OB_TEXTURE, OB_MATERIAL) ||
|
|
|
|
((v3d->drawtype == OB_SOLID) && (v3d->flag2 & V3D_SOLID_TEX)))
|
2012-01-19 16:04:44 +00:00
|
|
|
{
|
2011-03-13 02:44:25 +00:00
|
|
|
mask |= CD_MASK_MTFACE | CD_MASK_MCOL;
|
|
|
|
|
2012-05-05 14:33:36 +00:00
|
|
|
if (BKE_scene_use_new_shading_nodes(scene)) {
|
2012-02-22 16:52:06 +00:00
|
|
|
if (v3d->drawtype == OB_MATERIAL)
|
2011-11-08 13:07:16 +00:00
|
|
|
mask |= CD_MASK_ORCO;
|
|
|
|
}
|
|
|
|
else {
|
2012-02-22 16:52:06 +00:00
|
|
|
if (scene->gm.matmode == GAME_MAT_GLSL)
|
2011-11-08 13:07:16 +00:00
|
|
|
mask |= CD_MASK_ORCO;
|
|
|
|
}
|
2011-03-13 02:44:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return mask;
|
|
|
|
}
|
2012-01-09 02:50:09 +00:00
|
|
|
|
|
|
|
CustomDataMask ED_view3d_object_datamask(Scene *scene)
|
|
|
|
{
|
2012-03-25 23:54:33 +00:00
|
|
|
Object *ob = scene->basact ? scene->basact->object : NULL;
|
|
|
|
CustomDataMask mask = 0;
|
2012-01-09 02:50:09 +00:00
|
|
|
|
|
|
|
if (ob) {
|
|
|
|
/* check if we need tfaces & mcols due to face select or texture paint */
|
|
|
|
if (paint_facesel_test(ob) || (ob->mode & OB_MODE_TEXTURE_PAINT)) {
|
|
|
|
mask |= CD_MASK_MTFACE | CD_MASK_MCOL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* check if we need mcols due to vertex paint or weightpaint */
|
|
|
|
if (ob->mode & OB_MODE_VERTEX_PAINT) {
|
|
|
|
mask |= CD_MASK_MCOL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (ob->mode & OB_MODE_WEIGHT_PAINT) {
|
2012-03-22 08:41:50 +00:00
|
|
|
mask |= CD_MASK_PREVIEW_MCOL;
|
2012-01-09 02:50:09 +00:00
|
|
|
}
|
2012-05-22 15:29:27 +00:00
|
|
|
|
|
|
|
if (ob->mode & OB_MODE_EDIT)
|
|
|
|
mask |= CD_MASK_MVERT_SKIN;
|
2012-01-09 02:50:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return mask;
|
|
|
|
}
|
|
|
|
|
2009-01-07 14:46:50 +00:00
|
|
|
/* goes over all modes and view3d settings */
|
2012-01-09 02:50:09 +00:00
|
|
|
CustomDataMask ED_view3d_screen_datamask(bScreen *screen)
|
2009-01-07 14:46:50 +00:00
|
|
|
{
|
2012-03-25 23:54:33 +00:00
|
|
|
Scene *scene = screen->scene;
|
2009-01-07 14:46:50 +00:00
|
|
|
CustomDataMask mask = CD_MASK_BAREMESH;
|
|
|
|
ScrArea *sa;
|
|
|
|
|
|
|
|
/* check if we need tfaces & mcols due to view mode */
|
2012-02-22 16:52:06 +00:00
|
|
|
for (sa = screen->areabase.first; sa; sa = sa->next) {
|
|
|
|
if (sa->spacetype == SPACE_VIEW3D) {
|
2011-03-13 02:44:25 +00:00
|
|
|
mask |= ED_view3d_datamask(scene, (View3D *)sa->spacedata.first);
|
2009-01-07 14:46:50 +00:00
|
|
|
}
|
|
|
|
}
|
2012-01-09 02:50:09 +00:00
|
|
|
|
|
|
|
mask |= ED_view3d_object_datamask(scene);
|
2009-08-15 18:58:01 +00:00
|
|
|
|
2009-01-07 14:46:50 +00:00
|
|
|
return mask;
|
|
|
|
}
|
|
|
|
|
2012-12-11 14:29:01 +00:00
|
|
|
void ED_view3d_update_viewmat(Scene *scene, View3D *v3d, ARegion *ar, float viewmat[4][4], float winmat[4][4])
|
2008-12-18 17:38:21 +00:00
|
|
|
{
|
2012-03-05 13:02:45 +00:00
|
|
|
RegionView3D *rv3d = ar->regiondata;
|
2009-10-28 18:03:04 +00:00
|
|
|
|
|
|
|
/* setup window matrices */
|
2012-02-22 16:52:06 +00:00
|
|
|
if (winmat)
|
2009-11-10 20:43:45 +00:00
|
|
|
copy_m4_m4(rv3d->winmat, winmat);
|
2009-10-28 18:03:04 +00:00
|
|
|
else
|
2012-10-27 10:42:28 +00:00
|
|
|
setwinmatrixview3d(ar, v3d, NULL);
|
2012-03-05 13:02:45 +00:00
|
|
|
|
2009-10-28 18:03:04 +00:00
|
|
|
/* setup view matrix */
|
2012-02-22 16:52:06 +00:00
|
|
|
if (viewmat)
|
2009-11-10 20:43:45 +00:00
|
|
|
copy_m4_m4(rv3d->viewmat, viewmat);
|
2009-10-28 18:03:04 +00:00
|
|
|
else
|
2012-05-05 14:03:12 +00:00
|
|
|
setviewmatrixview3d(scene, v3d, rv3d); /* note: calls BKE_object_where_is_calc for camera... */
|
2012-03-05 13:02:45 +00:00
|
|
|
|
2009-10-28 18:03:04 +00:00
|
|
|
/* update utilitity matrices */
|
Math lib: matrix multiplication order fix for two functions that were
inconsistent with similar functions & math notation:
mul_m4_m4m4(R, B, A) => mult_m4_m4m4(R, A, B)
mul_m3_m3m4(R, B, A) => mult_m3_m3m4(R, A, B)
For branch maintainers, it should be relatively simple to fix things manually,
it's also possible run this script after merging to do automatic replacement:
http://www.pasteall.org/27459/python
2011-12-16 19:53:12 +00:00
|
|
|
mult_m4_m4m4(rv3d->persmat, rv3d->winmat, rv3d->viewmat);
|
2009-11-10 20:43:45 +00:00
|
|
|
invert_m4_m4(rv3d->persinv, rv3d->persmat);
|
|
|
|
invert_m4_m4(rv3d->viewinv, rv3d->viewmat);
|
2010-09-28 04:25:16 +00:00
|
|
|
|
2008-12-18 17:38:21 +00:00
|
|
|
/* calculate pixelsize factor once, is used for lamps and obcenters */
|
|
|
|
{
|
2010-09-28 04:25:16 +00:00
|
|
|
/* note: '1.0f / len_v3(v1)' replaced 'len_v3(rv3d->viewmat[0])'
|
2011-01-21 02:32:58 +00:00
|
|
|
* because of float point precision problems at large values [#23908] */
|
2010-11-03 06:31:53 +00:00
|
|
|
float v1[3], v2[3];
|
2012-10-25 22:47:54 +00:00
|
|
|
float len_px, len_sc;
|
2010-11-03 06:31:53 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
v1[0] = rv3d->persmat[0][0];
|
|
|
|
v1[1] = rv3d->persmat[1][0];
|
|
|
|
v1[2] = rv3d->persmat[2][0];
|
2010-11-03 06:31:53 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
v2[0] = rv3d->persmat[0][1];
|
|
|
|
v2[1] = rv3d->persmat[1][1];
|
|
|
|
v2[2] = rv3d->persmat[2][1];
|
2012-03-05 13:02:45 +00:00
|
|
|
|
2012-10-25 22:47:54 +00:00
|
|
|
len_px = 2.0f / sqrtf(min_ff(len_squared_v3(v1), len_squared_v3(v2)));
|
|
|
|
len_sc = (float)MAX2(ar->winx, ar->winy);
|
2010-09-28 04:25:16 +00:00
|
|
|
|
2012-10-25 22:47:54 +00:00
|
|
|
rv3d->pixsize = len_px / len_sc;
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
2012-03-05 13:02:45 +00:00
|
|
|
}
|
|
|
|
|
2012-12-11 14:29:01 +00:00
|
|
|
static void view3d_main_area_setup_view(Scene *scene, View3D *v3d, ARegion *ar, float viewmat[4][4], float winmat[4][4])
|
2012-03-05 13:02:45 +00:00
|
|
|
{
|
|
|
|
RegionView3D *rv3d = ar->regiondata;
|
|
|
|
|
|
|
|
ED_view3d_update_viewmat(scene, v3d, ar, viewmat, winmat);
|
2010-09-19 06:41:44 +00:00
|
|
|
|
2009-10-28 18:03:04 +00:00
|
|
|
/* set for opengl */
|
|
|
|
glMatrixMode(GL_PROJECTION);
|
2010-02-01 15:32:55 +00:00
|
|
|
glLoadMatrixf(rv3d->winmat);
|
2009-10-28 18:03:04 +00:00
|
|
|
glMatrixMode(GL_MODELVIEW);
|
2010-02-01 15:32:55 +00:00
|
|
|
glLoadMatrixf(rv3d->viewmat);
|
2009-10-28 18:03:04 +00:00
|
|
|
}
|
|
|
|
|
2012-10-23 12:25:08 +00:00
|
|
|
void ED_view3d_draw_offscreen_init(Scene *scene, View3D *v3d)
|
|
|
|
{
|
|
|
|
/* shadow buffers, before we setup matrices */
|
|
|
|
if (draw_glsl_material(scene, NULL, v3d, v3d->drawtype))
|
|
|
|
gpu_update_lamps_shadows(scene, v3d);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* ED_view3d_draw_offscreen_init should be called before this to initialize
|
|
|
|
* stuff like shadow buffers
|
|
|
|
*/
|
2012-01-19 16:04:44 +00:00
|
|
|
void ED_view3d_draw_offscreen(Scene *scene, View3D *v3d, ARegion *ar,
|
2012-12-11 14:29:01 +00:00
|
|
|
int winx, int winy, float viewmat[4][4], float winmat[4][4],
|
Color Management, Stage 2: Switch color pipeline to use OpenColorIO
Replace old color pipeline which was supporting linear/sRGB color spaces
only with OpenColorIO-based pipeline.
This introduces two configurable color spaces:
- Input color space for images and movie clips. This space is used to convert
images/movies from color space in which file is saved to Blender's linear
space (for float images, byte images are not internally converted, only input
space is stored for such images and used later).
This setting could be found in image/clip data block settings.
- Display color space which defines space in which particular display is working.
This settings could be found in scene's Color Management panel.
When render result is being displayed on the screen, apart from converting image
to display space, some additional conversions could happen.
This conversions are:
- View, which defines tone curve applying before display transformation.
These are different ways to view the image on the same display device.
For example it could be used to emulate film view on sRGB display.
- Exposure affects on image exposure before tone map is applied.
- Gamma is post-display gamma correction, could be used to match particular
display gamma.
- RGB curves are user-defined curves which are applying before display
transformation, could be used for different purposes.
All this settings by default are only applying on render result and does not
affect on other images. If some particular image needs to be affected by this
transformation, "View as Render" setting of image data block should be set to
truth. Movie clips are always affected by all display transformations.
This commit also introduces configurable color space in which sequencer is
working. This setting could be found in scene's Color Management panel and
it should be used if such stuff as grading needs to be done in color space
different from sRGB (i.e. when Film view on sRGB display is use, using VD16
space as sequencer's internal space would make grading working in space
which is close to the space using for display).
Some technical notes:
- Image buffer's float buffer is now always in linear space, even if it was
created from 16bit byte images.
- Space of byte buffer is stored in image buffer's rect_colorspace property.
- Profile of image buffer was removed since it's not longer meaningful.
- OpenGL and GLSL is supposed to always work in sRGB space. It is possible
to support other spaces, but it's quite large project which isn't so
much important.
- Legacy Color Management option disabled is emulated by using None display.
It could have some regressions, but there's no clear way to avoid them.
- If OpenColorIO is disabled on build time, it should make blender behaving
in the same way as previous release with color management enabled.
More details could be found at this page (more details would be added soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.64/Color_Management
--
Thanks to Xavier Thomas, Lukas Toene for initial work on OpenColorIO
integration and to Brecht van Lommel for some further development and code/
usecase review!
2012-09-15 10:05:07 +00:00
|
|
|
int do_bgpic, int colormanage_background)
|
2009-10-28 18:03:04 +00:00
|
|
|
{
|
2012-03-25 23:54:33 +00:00
|
|
|
RegionView3D *rv3d = ar->regiondata;
|
2009-10-28 18:03:04 +00:00
|
|
|
Base *base;
|
2010-07-29 10:09:20 +00:00
|
|
|
float backcol[3];
|
2009-10-28 18:03:04 +00:00
|
|
|
int bwinx, bwiny;
|
2010-08-25 08:31:52 +00:00
|
|
|
rcti brect;
|
2009-10-28 18:03:04 +00:00
|
|
|
|
2009-12-08 19:27:30 +00:00
|
|
|
glPushMatrix();
|
2009-10-28 18:03:04 +00:00
|
|
|
|
|
|
|
/* set temporary new size */
|
2012-03-25 23:54:33 +00:00
|
|
|
bwinx = ar->winx;
|
|
|
|
bwiny = ar->winy;
|
|
|
|
brect = ar->winrct;
|
2010-08-25 08:31:52 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
ar->winx = winx;
|
|
|
|
ar->winy = winy;
|
2012-03-24 02:51:46 +00:00
|
|
|
ar->winrct.xmin = 0;
|
|
|
|
ar->winrct.ymin = 0;
|
|
|
|
ar->winrct.xmax = winx;
|
|
|
|
ar->winrct.ymax = winy;
|
2012-05-18 14:05:59 +00:00
|
|
|
|
|
|
|
/* set theme */
|
|
|
|
UI_SetTheme(SPACE_VIEW3D, RGN_TYPE_WINDOW);
|
2010-07-04 17:22:24 +00:00
|
|
|
|
2009-10-28 18:03:04 +00:00
|
|
|
/* set flags */
|
|
|
|
G.f |= G_RENDER_OGL;
|
2010-05-20 16:08:06 +00:00
|
|
|
|
|
|
|
/* free images which can have changed on frame-change
|
|
|
|
* warning! can be slow so only free animated images - campbell */
|
|
|
|
GPU_free_images_anim();
|
2009-10-28 18:03:04 +00:00
|
|
|
|
2012-06-06 11:40:01 +00:00
|
|
|
/* set background color, fallback on the view background color
|
|
|
|
* (if active clip is set but frame is failed to load fallback to horizon color as background) */
|
|
|
|
if (scene->world) {
|
Color Management, Stage 2: Switch color pipeline to use OpenColorIO
Replace old color pipeline which was supporting linear/sRGB color spaces
only with OpenColorIO-based pipeline.
This introduces two configurable color spaces:
- Input color space for images and movie clips. This space is used to convert
images/movies from color space in which file is saved to Blender's linear
space (for float images, byte images are not internally converted, only input
space is stored for such images and used later).
This setting could be found in image/clip data block settings.
- Display color space which defines space in which particular display is working.
This settings could be found in scene's Color Management panel.
When render result is being displayed on the screen, apart from converting image
to display space, some additional conversions could happen.
This conversions are:
- View, which defines tone curve applying before display transformation.
These are different ways to view the image on the same display device.
For example it could be used to emulate film view on sRGB display.
- Exposure affects on image exposure before tone map is applied.
- Gamma is post-display gamma correction, could be used to match particular
display gamma.
- RGB curves are user-defined curves which are applying before display
transformation, could be used for different purposes.
All this settings by default are only applying on render result and does not
affect on other images. If some particular image needs to be affected by this
transformation, "View as Render" setting of image data block should be set to
truth. Movie clips are always affected by all display transformations.
This commit also introduces configurable color space in which sequencer is
working. This setting could be found in scene's Color Management panel and
it should be used if such stuff as grading needs to be done in color space
different from sRGB (i.e. when Film view on sRGB display is use, using VD16
space as sequencer's internal space would make grading working in space
which is close to the space using for display).
Some technical notes:
- Image buffer's float buffer is now always in linear space, even if it was
created from 16bit byte images.
- Space of byte buffer is stored in image buffer's rect_colorspace property.
- Profile of image buffer was removed since it's not longer meaningful.
- OpenGL and GLSL is supposed to always work in sRGB space. It is possible
to support other spaces, but it's quite large project which isn't so
much important.
- Legacy Color Management option disabled is emulated by using None display.
It could have some regressions, but there's no clear way to avoid them.
- If OpenColorIO is disabled on build time, it should make blender behaving
in the same way as previous release with color management enabled.
More details could be found at this page (more details would be added soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.64/Color_Management
--
Thanks to Xavier Thomas, Lukas Toene for initial work on OpenColorIO
integration and to Brecht van Lommel for some further development and code/
usecase review!
2012-09-15 10:05:07 +00:00
|
|
|
/* NOTE: currently OpenGL is supposed to always work in sRGB space and do not
|
|
|
|
* apply any tonemaps since it's really tricky to support for all features (GLSL, textures, etc)
|
|
|
|
* but due to compatibility issues background is being affected display transform, so we can
|
2012-09-28 06:45:20 +00:00
|
|
|
* emulate behavior of disabled color management
|
Color Management, Stage 2: Switch color pipeline to use OpenColorIO
Replace old color pipeline which was supporting linear/sRGB color spaces
only with OpenColorIO-based pipeline.
This introduces two configurable color spaces:
- Input color space for images and movie clips. This space is used to convert
images/movies from color space in which file is saved to Blender's linear
space (for float images, byte images are not internally converted, only input
space is stored for such images and used later).
This setting could be found in image/clip data block settings.
- Display color space which defines space in which particular display is working.
This settings could be found in scene's Color Management panel.
When render result is being displayed on the screen, apart from converting image
to display space, some additional conversions could happen.
This conversions are:
- View, which defines tone curve applying before display transformation.
These are different ways to view the image on the same display device.
For example it could be used to emulate film view on sRGB display.
- Exposure affects on image exposure before tone map is applied.
- Gamma is post-display gamma correction, could be used to match particular
display gamma.
- RGB curves are user-defined curves which are applying before display
transformation, could be used for different purposes.
All this settings by default are only applying on render result and does not
affect on other images. If some particular image needs to be affected by this
transformation, "View as Render" setting of image data block should be set to
truth. Movie clips are always affected by all display transformations.
This commit also introduces configurable color space in which sequencer is
working. This setting could be found in scene's Color Management panel and
it should be used if such stuff as grading needs to be done in color space
different from sRGB (i.e. when Film view on sRGB display is use, using VD16
space as sequencer's internal space would make grading working in space
which is close to the space using for display).
Some technical notes:
- Image buffer's float buffer is now always in linear space, even if it was
created from 16bit byte images.
- Space of byte buffer is stored in image buffer's rect_colorspace property.
- Profile of image buffer was removed since it's not longer meaningful.
- OpenGL and GLSL is supposed to always work in sRGB space. It is possible
to support other spaces, but it's quite large project which isn't so
much important.
- Legacy Color Management option disabled is emulated by using None display.
It could have some regressions, but there's no clear way to avoid them.
- If OpenColorIO is disabled on build time, it should make blender behaving
in the same way as previous release with color management enabled.
More details could be found at this page (more details would be added soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.64/Color_Management
--
Thanks to Xavier Thomas, Lukas Toene for initial work on OpenColorIO
integration and to Brecht van Lommel for some further development and code/
usecase review!
2012-09-15 10:05:07 +00:00
|
|
|
* but this function is also used for sequencer's scene strips which shouldn't be affected by
|
|
|
|
* tonemaps now and should be purely sRGB, that's why we've got this colormanage_background
|
|
|
|
* we can drop this flag in cost of some compatibility loss -- background wouldn't be
|
|
|
|
* color managed in 3d viewport
|
|
|
|
* same goes to opengl rendering, where color profile should be applied as very final step
|
|
|
|
*/
|
|
|
|
|
|
|
|
if (colormanage_background) {
|
|
|
|
IMB_colormanagement_pixel_to_display_space_v3(backcol, &scene->world->horr, &scene->view_settings,
|
|
|
|
&scene->display_settings);
|
|
|
|
}
|
|
|
|
else {
|
2012-06-06 11:40:01 +00:00
|
|
|
linearrgb_to_srgb_v3_v3(backcol, &scene->world->horr);
|
Color Management, Stage 2: Switch color pipeline to use OpenColorIO
Replace old color pipeline which was supporting linear/sRGB color spaces
only with OpenColorIO-based pipeline.
This introduces two configurable color spaces:
- Input color space for images and movie clips. This space is used to convert
images/movies from color space in which file is saved to Blender's linear
space (for float images, byte images are not internally converted, only input
space is stored for such images and used later).
This setting could be found in image/clip data block settings.
- Display color space which defines space in which particular display is working.
This settings could be found in scene's Color Management panel.
When render result is being displayed on the screen, apart from converting image
to display space, some additional conversions could happen.
This conversions are:
- View, which defines tone curve applying before display transformation.
These are different ways to view the image on the same display device.
For example it could be used to emulate film view on sRGB display.
- Exposure affects on image exposure before tone map is applied.
- Gamma is post-display gamma correction, could be used to match particular
display gamma.
- RGB curves are user-defined curves which are applying before display
transformation, could be used for different purposes.
All this settings by default are only applying on render result and does not
affect on other images. If some particular image needs to be affected by this
transformation, "View as Render" setting of image data block should be set to
truth. Movie clips are always affected by all display transformations.
This commit also introduces configurable color space in which sequencer is
working. This setting could be found in scene's Color Management panel and
it should be used if such stuff as grading needs to be done in color space
different from sRGB (i.e. when Film view on sRGB display is use, using VD16
space as sequencer's internal space would make grading working in space
which is close to the space using for display).
Some technical notes:
- Image buffer's float buffer is now always in linear space, even if it was
created from 16bit byte images.
- Space of byte buffer is stored in image buffer's rect_colorspace property.
- Profile of image buffer was removed since it's not longer meaningful.
- OpenGL and GLSL is supposed to always work in sRGB space. It is possible
to support other spaces, but it's quite large project which isn't so
much important.
- Legacy Color Management option disabled is emulated by using None display.
It could have some regressions, but there's no clear way to avoid them.
- If OpenColorIO is disabled on build time, it should make blender behaving
in the same way as previous release with color management enabled.
More details could be found at this page (more details would be added soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.64/Color_Management
--
Thanks to Xavier Thomas, Lukas Toene for initial work on OpenColorIO
integration and to Brecht van Lommel for some further development and code/
usecase review!
2012-09-15 10:05:07 +00:00
|
|
|
}
|
|
|
|
|
2012-06-06 11:40:01 +00:00
|
|
|
glClearColor(backcol[0], backcol[1], backcol[2], 0.0);
|
2010-01-06 00:02:37 +00:00
|
|
|
}
|
2012-06-06 11:40:01 +00:00
|
|
|
else {
|
|
|
|
UI_ThemeClearColor(TH_BACK);
|
2010-01-06 00:02:37 +00:00
|
|
|
}
|
|
|
|
|
2012-03-07 17:45:40 +00:00
|
|
|
|
2012-06-06 11:40:01 +00:00
|
|
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
2012-03-07 17:45:40 +00:00
|
|
|
|
2009-10-28 18:03:04 +00:00
|
|
|
/* setup view matrices */
|
|
|
|
view3d_main_area_setup_view(scene, v3d, ar, viewmat, winmat);
|
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (rv3d->rflag & RV3D_CLIPPING)
|
2011-08-28 21:13:03 +00:00
|
|
|
view3d_draw_clipping(rv3d);
|
|
|
|
|
2009-10-28 18:03:04 +00:00
|
|
|
/* set zbuffer */
|
2012-02-22 16:52:06 +00:00
|
|
|
if (v3d->drawtype > OB_WIRE) {
|
2012-03-25 23:54:33 +00:00
|
|
|
v3d->zbuf = TRUE;
|
2009-10-28 18:03:04 +00:00
|
|
|
glEnable(GL_DEPTH_TEST);
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
2009-10-28 18:03:04 +00:00
|
|
|
else
|
2012-03-25 23:54:33 +00:00
|
|
|
v3d->zbuf = FALSE;
|
2009-10-28 18:03:04 +00:00
|
|
|
|
2012-06-06 11:40:01 +00:00
|
|
|
/* important to do before clipping */
|
|
|
|
if (do_bgpic) {
|
|
|
|
view3d_draw_bgpic_test(scene, ar, v3d, FALSE, FALSE);
|
|
|
|
}
|
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (rv3d->rflag & RV3D_CLIPPING)
|
2012-02-28 13:03:56 +00:00
|
|
|
ED_view3d_clipping_set(rv3d);
|
2011-08-28 21:13:03 +00:00
|
|
|
|
2009-10-28 18:03:04 +00:00
|
|
|
/* draw set first */
|
2012-02-22 16:52:06 +00:00
|
|
|
if (scene->set) {
|
2010-12-17 15:37:59 +00:00
|
|
|
Scene *sce_iter;
|
2012-02-22 16:52:06 +00:00
|
|
|
for (SETLOOPER(scene->set, sce_iter, base)) {
|
|
|
|
if (v3d->lay & base->lay) {
|
2009-10-28 18:03:04 +00:00
|
|
|
UI_ThemeColorBlend(TH_WIRE, TH_BACK, 0.6f);
|
2012-03-25 23:54:33 +00:00
|
|
|
draw_object(scene, ar, v3d, base, DRAW_CONSTCOLOR | DRAW_SCENESET);
|
2009-10-28 18:03:04 +00:00
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (base->object->transflag & OB_DUPLI)
|
2009-10-28 18:03:04 +00:00
|
|
|
draw_dupli_objects_color(scene, ar, v3d, base, TH_WIRE);
|
|
|
|
}
|
|
|
|
}
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
|
|
|
|
2009-10-28 18:03:04 +00:00
|
|
|
/* then draw not selected and the duplis, but skip editmode object */
|
2012-03-25 23:54:33 +00:00
|
|
|
for (base = scene->base.first; base; base = base->next) {
|
2012-02-22 16:52:06 +00:00
|
|
|
if (v3d->lay & base->lay) {
|
2009-10-28 18:03:04 +00:00
|
|
|
/* dupli drawing */
|
2012-02-22 16:52:06 +00:00
|
|
|
if (base->object->transflag & OB_DUPLI)
|
2009-10-28 18:03:04 +00:00
|
|
|
draw_dupli_objects(scene, ar, v3d, base);
|
|
|
|
|
|
|
|
draw_object(scene, ar, v3d, base, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-04-01 14:14:37 +00:00
|
|
|
/* must be before xray draw which clears the depth buffer */
|
2012-12-17 02:34:53 +00:00
|
|
|
if (v3d->flag2 & V3D_SHOW_GPENCIL) {
|
|
|
|
if (v3d->zbuf) glDisable(GL_DEPTH_TEST);
|
|
|
|
draw_gpencil_view3d(scene, v3d, ar, TRUE);
|
|
|
|
if (v3d->zbuf) glEnable(GL_DEPTH_TEST);
|
|
|
|
}
|
2011-04-01 14:14:37 +00:00
|
|
|
|
2009-10-28 18:03:04 +00:00
|
|
|
/* transp and X-ray afterdraw stuff */
|
2012-03-25 23:54:33 +00:00
|
|
|
if (v3d->afterdraw_transp.first) view3d_draw_transp(scene, ar, v3d);
|
2012-05-08 15:55:29 +00:00
|
|
|
if (v3d->afterdraw_xray.first) view3d_draw_xray(scene, ar, v3d, 1); /* clears zbuffer if it is used! */
|
2012-03-25 23:54:33 +00:00
|
|
|
if (v3d->afterdraw_xraytransp.first) view3d_draw_xraytransp(scene, ar, v3d, 1);
|
2009-10-28 18:03:04 +00:00
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (rv3d->rflag & RV3D_CLIPPING)
|
2012-02-28 13:03:56 +00:00
|
|
|
ED_view3d_clipping_disable();
|
2011-08-28 21:13:03 +00:00
|
|
|
|
2012-06-06 11:40:01 +00:00
|
|
|
/* important to do after clipping */
|
|
|
|
if (do_bgpic) {
|
|
|
|
view3d_draw_bgpic_test(scene, ar, v3d, TRUE, FALSE);
|
|
|
|
}
|
|
|
|
|
2009-10-28 18:03:04 +00:00
|
|
|
/* cleanup */
|
2012-02-22 16:52:06 +00:00
|
|
|
if (v3d->zbuf) {
|
2012-03-25 23:54:33 +00:00
|
|
|
v3d->zbuf = FALSE;
|
2009-10-28 18:03:04 +00:00
|
|
|
glDisable(GL_DEPTH_TEST);
|
|
|
|
}
|
|
|
|
|
2009-11-09 08:03:43 +00:00
|
|
|
/* draw grease-pencil stuff */
|
|
|
|
ED_region_pixelspace(ar);
|
|
|
|
|
2012-12-17 02:34:53 +00:00
|
|
|
|
|
|
|
if (v3d->flag2 & V3D_SHOW_GPENCIL) {
|
|
|
|
/* draw grease-pencil stuff - needed to get paint-buffer shown too (since it's 2D) */
|
|
|
|
draw_gpencil_view3d(scene, v3d, ar, FALSE);
|
|
|
|
}
|
2009-11-09 08:03:43 +00:00
|
|
|
|
2010-05-20 16:08:06 +00:00
|
|
|
/* freeing the images again here could be done after the operator runs, leaving for now */
|
|
|
|
GPU_free_images_anim();
|
2009-10-28 18:03:04 +00:00
|
|
|
|
|
|
|
/* restore size */
|
2012-03-25 23:54:33 +00:00
|
|
|
ar->winx = bwinx;
|
|
|
|
ar->winy = bwiny;
|
2010-08-25 08:31:52 +00:00
|
|
|
ar->winrct = brect;
|
2009-10-28 18:03:04 +00:00
|
|
|
|
2009-12-08 19:27:30 +00:00
|
|
|
glPopMatrix();
|
2010-03-08 21:33:51 +00:00
|
|
|
|
2012-07-08 20:36:00 +00:00
|
|
|
/* XXX, without this the sequencer flickers with opengl draw enabled, need to find out why - campbell */
|
2012-01-19 16:04:44 +00:00
|
|
|
glColor4ub(255, 255, 255, 255);
|
2010-06-04 12:23:38 +00:00
|
|
|
|
|
|
|
G.f &= ~G_RENDER_OGL;
|
2009-10-28 18:03:04 +00:00
|
|
|
}
|
|
|
|
|
2010-03-08 20:08:04 +00:00
|
|
|
/* utility func for ED_view3d_draw_offscreen */
|
2012-01-19 16:04:44 +00:00
|
|
|
ImBuf *ED_view3d_draw_offscreen_imbuf(Scene *scene, View3D *v3d, ARegion *ar,
|
Color Management, Stage 2: Switch color pipeline to use OpenColorIO
Replace old color pipeline which was supporting linear/sRGB color spaces
only with OpenColorIO-based pipeline.
This introduces two configurable color spaces:
- Input color space for images and movie clips. This space is used to convert
images/movies from color space in which file is saved to Blender's linear
space (for float images, byte images are not internally converted, only input
space is stored for such images and used later).
This setting could be found in image/clip data block settings.
- Display color space which defines space in which particular display is working.
This settings could be found in scene's Color Management panel.
When render result is being displayed on the screen, apart from converting image
to display space, some additional conversions could happen.
This conversions are:
- View, which defines tone curve applying before display transformation.
These are different ways to view the image on the same display device.
For example it could be used to emulate film view on sRGB display.
- Exposure affects on image exposure before tone map is applied.
- Gamma is post-display gamma correction, could be used to match particular
display gamma.
- RGB curves are user-defined curves which are applying before display
transformation, could be used for different purposes.
All this settings by default are only applying on render result and does not
affect on other images. If some particular image needs to be affected by this
transformation, "View as Render" setting of image data block should be set to
truth. Movie clips are always affected by all display transformations.
This commit also introduces configurable color space in which sequencer is
working. This setting could be found in scene's Color Management panel and
it should be used if such stuff as grading needs to be done in color space
different from sRGB (i.e. when Film view on sRGB display is use, using VD16
space as sequencer's internal space would make grading working in space
which is close to the space using for display).
Some technical notes:
- Image buffer's float buffer is now always in linear space, even if it was
created from 16bit byte images.
- Space of byte buffer is stored in image buffer's rect_colorspace property.
- Profile of image buffer was removed since it's not longer meaningful.
- OpenGL and GLSL is supposed to always work in sRGB space. It is possible
to support other spaces, but it's quite large project which isn't so
much important.
- Legacy Color Management option disabled is emulated by using None display.
It could have some regressions, but there's no clear way to avoid them.
- If OpenColorIO is disabled on build time, it should make blender behaving
in the same way as previous release with color management enabled.
More details could be found at this page (more details would be added soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.64/Color_Management
--
Thanks to Xavier Thomas, Lukas Toene for initial work on OpenColorIO
integration and to Brecht van Lommel for some further development and code/
usecase review!
2012-09-15 10:05:07 +00:00
|
|
|
int sizex, int sizey, unsigned int flag, int draw_background,
|
|
|
|
int colormanage_background, char err_out[256])
|
2010-03-08 20:08:04 +00:00
|
|
|
{
|
2012-03-25 23:54:33 +00:00
|
|
|
RegionView3D *rv3d = ar->regiondata;
|
2010-03-08 20:08:04 +00:00
|
|
|
ImBuf *ibuf;
|
|
|
|
GPUOffScreen *ofs;
|
2010-11-20 19:20:27 +00:00
|
|
|
|
|
|
|
/* state changes make normal drawing go weird otherwise */
|
|
|
|
glPushAttrib(GL_LIGHTING_BIT);
|
2010-03-08 20:08:04 +00:00
|
|
|
|
|
|
|
/* bind */
|
2012-03-25 23:54:33 +00:00
|
|
|
ofs = GPU_offscreen_create(sizex, sizey, err_out);
|
2012-02-22 16:52:06 +00:00
|
|
|
if (ofs == NULL)
|
2010-03-08 20:08:04 +00:00
|
|
|
return NULL;
|
|
|
|
|
2012-10-23 12:25:08 +00:00
|
|
|
ED_view3d_draw_offscreen_init(scene, v3d);
|
|
|
|
|
2010-03-08 20:08:04 +00:00
|
|
|
GPU_offscreen_bind(ofs);
|
|
|
|
|
|
|
|
/* render 3d view */
|
2012-03-25 23:54:33 +00:00
|
|
|
if (rv3d->persp == RV3D_CAMOB && v3d->camera) {
|
2011-11-18 15:52:00 +00:00
|
|
|
CameraParams params;
|
2010-03-08 20:08:04 +00:00
|
|
|
|
2012-05-05 00:58:22 +00:00
|
|
|
BKE_camera_params_init(¶ms);
|
|
|
|
BKE_camera_params_from_object(¶ms, v3d->camera);
|
|
|
|
BKE_camera_params_compute_viewplane(¶ms, sizex, sizey, scene->r.xasp, scene->r.yasp);
|
|
|
|
BKE_camera_params_compute_matrix(¶ms);
|
2010-03-08 20:08:04 +00:00
|
|
|
|
Color Management, Stage 2: Switch color pipeline to use OpenColorIO
Replace old color pipeline which was supporting linear/sRGB color spaces
only with OpenColorIO-based pipeline.
This introduces two configurable color spaces:
- Input color space for images and movie clips. This space is used to convert
images/movies from color space in which file is saved to Blender's linear
space (for float images, byte images are not internally converted, only input
space is stored for such images and used later).
This setting could be found in image/clip data block settings.
- Display color space which defines space in which particular display is working.
This settings could be found in scene's Color Management panel.
When render result is being displayed on the screen, apart from converting image
to display space, some additional conversions could happen.
This conversions are:
- View, which defines tone curve applying before display transformation.
These are different ways to view the image on the same display device.
For example it could be used to emulate film view on sRGB display.
- Exposure affects on image exposure before tone map is applied.
- Gamma is post-display gamma correction, could be used to match particular
display gamma.
- RGB curves are user-defined curves which are applying before display
transformation, could be used for different purposes.
All this settings by default are only applying on render result and does not
affect on other images. If some particular image needs to be affected by this
transformation, "View as Render" setting of image data block should be set to
truth. Movie clips are always affected by all display transformations.
This commit also introduces configurable color space in which sequencer is
working. This setting could be found in scene's Color Management panel and
it should be used if such stuff as grading needs to be done in color space
different from sRGB (i.e. when Film view on sRGB display is use, using VD16
space as sequencer's internal space would make grading working in space
which is close to the space using for display).
Some technical notes:
- Image buffer's float buffer is now always in linear space, even if it was
created from 16bit byte images.
- Space of byte buffer is stored in image buffer's rect_colorspace property.
- Profile of image buffer was removed since it's not longer meaningful.
- OpenGL and GLSL is supposed to always work in sRGB space. It is possible
to support other spaces, but it's quite large project which isn't so
much important.
- Legacy Color Management option disabled is emulated by using None display.
It could have some regressions, but there's no clear way to avoid them.
- If OpenColorIO is disabled on build time, it should make blender behaving
in the same way as previous release with color management enabled.
More details could be found at this page (more details would be added soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.64/Color_Management
--
Thanks to Xavier Thomas, Lukas Toene for initial work on OpenColorIO
integration and to Brecht van Lommel for some further development and code/
usecase review!
2012-09-15 10:05:07 +00:00
|
|
|
ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, params.winmat, draw_background, colormanage_background);
|
2010-03-08 20:08:04 +00:00
|
|
|
}
|
|
|
|
else {
|
Color Management, Stage 2: Switch color pipeline to use OpenColorIO
Replace old color pipeline which was supporting linear/sRGB color spaces
only with OpenColorIO-based pipeline.
This introduces two configurable color spaces:
- Input color space for images and movie clips. This space is used to convert
images/movies from color space in which file is saved to Blender's linear
space (for float images, byte images are not internally converted, only input
space is stored for such images and used later).
This setting could be found in image/clip data block settings.
- Display color space which defines space in which particular display is working.
This settings could be found in scene's Color Management panel.
When render result is being displayed on the screen, apart from converting image
to display space, some additional conversions could happen.
This conversions are:
- View, which defines tone curve applying before display transformation.
These are different ways to view the image on the same display device.
For example it could be used to emulate film view on sRGB display.
- Exposure affects on image exposure before tone map is applied.
- Gamma is post-display gamma correction, could be used to match particular
display gamma.
- RGB curves are user-defined curves which are applying before display
transformation, could be used for different purposes.
All this settings by default are only applying on render result and does not
affect on other images. If some particular image needs to be affected by this
transformation, "View as Render" setting of image data block should be set to
truth. Movie clips are always affected by all display transformations.
This commit also introduces configurable color space in which sequencer is
working. This setting could be found in scene's Color Management panel and
it should be used if such stuff as grading needs to be done in color space
different from sRGB (i.e. when Film view on sRGB display is use, using VD16
space as sequencer's internal space would make grading working in space
which is close to the space using for display).
Some technical notes:
- Image buffer's float buffer is now always in linear space, even if it was
created from 16bit byte images.
- Space of byte buffer is stored in image buffer's rect_colorspace property.
- Profile of image buffer was removed since it's not longer meaningful.
- OpenGL and GLSL is supposed to always work in sRGB space. It is possible
to support other spaces, but it's quite large project which isn't so
much important.
- Legacy Color Management option disabled is emulated by using None display.
It could have some regressions, but there's no clear way to avoid them.
- If OpenColorIO is disabled on build time, it should make blender behaving
in the same way as previous release with color management enabled.
More details could be found at this page (more details would be added soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.64/Color_Management
--
Thanks to Xavier Thomas, Lukas Toene for initial work on OpenColorIO
integration and to Brecht van Lommel for some further development and code/
usecase review!
2012-09-15 10:05:07 +00:00
|
|
|
ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, NULL, draw_background, colormanage_background);
|
2010-03-08 20:08:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* read in pixels & stamp */
|
2012-03-25 23:54:33 +00:00
|
|
|
ibuf = IMB_allocImBuf(sizex, sizey, 32, flag);
|
2010-03-08 20:08:04 +00:00
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (ibuf->rect_float)
|
2011-10-28 16:57:06 +00:00
|
|
|
GPU_offscreen_read_pixels(ofs, GL_FLOAT, ibuf->rect_float);
|
2012-02-22 16:52:06 +00:00
|
|
|
else if (ibuf->rect)
|
2011-10-28 16:57:06 +00:00
|
|
|
GPU_offscreen_read_pixels(ofs, GL_UNSIGNED_BYTE, ibuf->rect);
|
2010-03-08 20:08:04 +00:00
|
|
|
|
|
|
|
/* unbind */
|
|
|
|
GPU_offscreen_unbind(ofs);
|
|
|
|
GPU_offscreen_free(ofs);
|
|
|
|
|
2010-11-20 19:20:27 +00:00
|
|
|
glPopAttrib();
|
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (ibuf->rect_float && ibuf->rect)
|
2010-08-26 23:30:15 +00:00
|
|
|
IMB_rect_from_float(ibuf);
|
|
|
|
|
2010-03-08 20:08:04 +00:00
|
|
|
return ibuf;
|
|
|
|
}
|
|
|
|
|
2010-03-08 21:33:51 +00:00
|
|
|
/* creates own 3d views, used by the sequencer */
|
2012-01-19 16:04:44 +00:00
|
|
|
ImBuf *ED_view3d_draw_offscreen_imbuf_simple(Scene *scene, Object *camera, int width, int height,
|
2012-12-12 12:42:12 +00:00
|
|
|
unsigned int flag, int drawtype, int use_solid_tex, int draw_background,
|
Color Management, Stage 2: Switch color pipeline to use OpenColorIO
Replace old color pipeline which was supporting linear/sRGB color spaces
only with OpenColorIO-based pipeline.
This introduces two configurable color spaces:
- Input color space for images and movie clips. This space is used to convert
images/movies from color space in which file is saved to Blender's linear
space (for float images, byte images are not internally converted, only input
space is stored for such images and used later).
This setting could be found in image/clip data block settings.
- Display color space which defines space in which particular display is working.
This settings could be found in scene's Color Management panel.
When render result is being displayed on the screen, apart from converting image
to display space, some additional conversions could happen.
This conversions are:
- View, which defines tone curve applying before display transformation.
These are different ways to view the image on the same display device.
For example it could be used to emulate film view on sRGB display.
- Exposure affects on image exposure before tone map is applied.
- Gamma is post-display gamma correction, could be used to match particular
display gamma.
- RGB curves are user-defined curves which are applying before display
transformation, could be used for different purposes.
All this settings by default are only applying on render result and does not
affect on other images. If some particular image needs to be affected by this
transformation, "View as Render" setting of image data block should be set to
truth. Movie clips are always affected by all display transformations.
This commit also introduces configurable color space in which sequencer is
working. This setting could be found in scene's Color Management panel and
it should be used if such stuff as grading needs to be done in color space
different from sRGB (i.e. when Film view on sRGB display is use, using VD16
space as sequencer's internal space would make grading working in space
which is close to the space using for display).
Some technical notes:
- Image buffer's float buffer is now always in linear space, even if it was
created from 16bit byte images.
- Space of byte buffer is stored in image buffer's rect_colorspace property.
- Profile of image buffer was removed since it's not longer meaningful.
- OpenGL and GLSL is supposed to always work in sRGB space. It is possible
to support other spaces, but it's quite large project which isn't so
much important.
- Legacy Color Management option disabled is emulated by using None display.
It could have some regressions, but there's no clear way to avoid them.
- If OpenColorIO is disabled on build time, it should make blender behaving
in the same way as previous release with color management enabled.
More details could be found at this page (more details would be added soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.64/Color_Management
--
Thanks to Xavier Thomas, Lukas Toene for initial work on OpenColorIO
integration and to Brecht van Lommel for some further development and code/
usecase review!
2012-09-15 10:05:07 +00:00
|
|
|
int colormanage_background, char err_out[256])
|
2010-03-08 21:33:51 +00:00
|
|
|
{
|
2012-03-25 23:54:33 +00:00
|
|
|
View3D v3d = {NULL};
|
|
|
|
ARegion ar = {NULL};
|
|
|
|
RegionView3D rv3d = {{{0}}};
|
2010-03-08 21:33:51 +00:00
|
|
|
|
|
|
|
/* connect data */
|
2012-03-25 23:54:33 +00:00
|
|
|
v3d.regionbase.first = v3d.regionbase.last = &ar;
|
|
|
|
ar.regiondata = &rv3d;
|
|
|
|
ar.regiontype = RGN_TYPE_WINDOW;
|
2010-03-08 21:33:51 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
v3d.camera = camera;
|
|
|
|
v3d.lay = scene->lay;
|
2010-03-16 17:37:34 +00:00
|
|
|
v3d.drawtype = drawtype;
|
2010-03-16 17:49:31 +00:00
|
|
|
v3d.flag2 = V3D_RENDER_OVERRIDE;
|
2010-03-08 21:33:51 +00:00
|
|
|
|
2012-12-12 12:42:12 +00:00
|
|
|
if (use_solid_tex)
|
|
|
|
v3d.flag2 |= V3D_SOLID_TEX;
|
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
rv3d.persp = RV3D_CAMOB;
|
2010-03-08 21:33:51 +00:00
|
|
|
|
|
|
|
copy_m4_m4(rv3d.viewinv, v3d.camera->obmat);
|
|
|
|
normalize_m4(rv3d.viewinv);
|
|
|
|
invert_m4_m4(rv3d.viewmat, rv3d.viewinv);
|
|
|
|
|
|
|
|
{
|
2011-11-18 15:52:00 +00:00
|
|
|
CameraParams params;
|
|
|
|
|
2012-05-05 00:58:22 +00:00
|
|
|
BKE_camera_params_init(¶ms);
|
|
|
|
BKE_camera_params_from_object(¶ms, v3d.camera);
|
|
|
|
BKE_camera_params_compute_viewplane(¶ms, width, height, scene->r.xasp, scene->r.yasp);
|
|
|
|
BKE_camera_params_compute_matrix(¶ms);
|
2011-11-18 15:52:00 +00:00
|
|
|
|
|
|
|
copy_m4_m4(rv3d.winmat, params.winmat);
|
2012-03-25 23:54:33 +00:00
|
|
|
v3d.near = params.clipsta;
|
|
|
|
v3d.far = params.clipend;
|
|
|
|
v3d.lens = params.lens;
|
2010-03-08 21:33:51 +00:00
|
|
|
}
|
|
|
|
|
Math lib: matrix multiplication order fix for two functions that were
inconsistent with similar functions & math notation:
mul_m4_m4m4(R, B, A) => mult_m4_m4m4(R, A, B)
mul_m3_m3m4(R, B, A) => mult_m3_m3m4(R, A, B)
For branch maintainers, it should be relatively simple to fix things manually,
it's also possible run this script after merging to do automatic replacement:
http://www.pasteall.org/27459/python
2011-12-16 19:53:12 +00:00
|
|
|
mult_m4_m4m4(rv3d.persmat, rv3d.winmat, rv3d.viewmat);
|
2010-03-08 21:33:51 +00:00
|
|
|
invert_m4_m4(rv3d.persinv, rv3d.viewinv);
|
|
|
|
|
Color Management, Stage 2: Switch color pipeline to use OpenColorIO
Replace old color pipeline which was supporting linear/sRGB color spaces
only with OpenColorIO-based pipeline.
This introduces two configurable color spaces:
- Input color space for images and movie clips. This space is used to convert
images/movies from color space in which file is saved to Blender's linear
space (for float images, byte images are not internally converted, only input
space is stored for such images and used later).
This setting could be found in image/clip data block settings.
- Display color space which defines space in which particular display is working.
This settings could be found in scene's Color Management panel.
When render result is being displayed on the screen, apart from converting image
to display space, some additional conversions could happen.
This conversions are:
- View, which defines tone curve applying before display transformation.
These are different ways to view the image on the same display device.
For example it could be used to emulate film view on sRGB display.
- Exposure affects on image exposure before tone map is applied.
- Gamma is post-display gamma correction, could be used to match particular
display gamma.
- RGB curves are user-defined curves which are applying before display
transformation, could be used for different purposes.
All this settings by default are only applying on render result and does not
affect on other images. If some particular image needs to be affected by this
transformation, "View as Render" setting of image data block should be set to
truth. Movie clips are always affected by all display transformations.
This commit also introduces configurable color space in which sequencer is
working. This setting could be found in scene's Color Management panel and
it should be used if such stuff as grading needs to be done in color space
different from sRGB (i.e. when Film view on sRGB display is use, using VD16
space as sequencer's internal space would make grading working in space
which is close to the space using for display).
Some technical notes:
- Image buffer's float buffer is now always in linear space, even if it was
created from 16bit byte images.
- Space of byte buffer is stored in image buffer's rect_colorspace property.
- Profile of image buffer was removed since it's not longer meaningful.
- OpenGL and GLSL is supposed to always work in sRGB space. It is possible
to support other spaces, but it's quite large project which isn't so
much important.
- Legacy Color Management option disabled is emulated by using None display.
It could have some regressions, but there's no clear way to avoid them.
- If OpenColorIO is disabled on build time, it should make blender behaving
in the same way as previous release with color management enabled.
More details could be found at this page (more details would be added soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.64/Color_Management
--
Thanks to Xavier Thomas, Lukas Toene for initial work on OpenColorIO
integration and to Brecht van Lommel for some further development and code/
usecase review!
2012-09-15 10:05:07 +00:00
|
|
|
return ED_view3d_draw_offscreen_imbuf(scene, &v3d, &ar, width, height, flag,
|
|
|
|
draw_background, colormanage_background, err_out);
|
2010-03-08 21:33:51 +00:00
|
|
|
|
|
|
|
// seq_view3d_cb(scene, cfra, render_size, seqrectx, seqrecty);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-02-12 00:44:26 +00:00
|
|
|
/* NOTE: the info that this uses is updated in ED_refresh_viewport_fps(),
|
|
|
|
* which currently gets called during SCREEN_OT_animation_step.
|
|
|
|
*/
|
|
|
|
static void draw_viewport_fps(Scene *scene, ARegion *ar)
|
|
|
|
{
|
2012-03-25 23:54:33 +00:00
|
|
|
ScreenFrameRateInfo *fpsi = scene->fps_info;
|
2010-02-12 00:44:26 +00:00
|
|
|
float fps;
|
|
|
|
char printable[16];
|
|
|
|
int i, tot;
|
|
|
|
|
|
|
|
if (!fpsi || !fpsi->lredrawtime || !fpsi->redrawtime)
|
|
|
|
return;
|
|
|
|
|
|
|
|
printable[0] = '\0';
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
/* this is too simple, better do an average */
|
2012-03-25 23:54:33 +00:00
|
|
|
fps = (float)(1.0 / (fpsi->lredrawtime - fpsi->redrawtime))
|
2010-02-12 00:44:26 +00:00
|
|
|
#else
|
2012-03-25 23:54:33 +00:00
|
|
|
fpsi->redrawtimes_fps[fpsi->redrawtime_index] = (float)(1.0 / (fpsi->lredrawtime - fpsi->redrawtime));
|
2010-02-12 00:44:26 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
for (i = 0, tot = 0, fps = 0.0f; i < REDRAW_FRAME_AVERAGE; i++) {
|
2010-02-12 00:44:26 +00:00
|
|
|
if (fpsi->redrawtimes_fps[i]) {
|
|
|
|
fps += fpsi->redrawtimes_fps[i];
|
|
|
|
tot++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (tot) {
|
|
|
|
fpsi->redrawtime_index = (fpsi->redrawtime_index + 1) % REDRAW_FRAME_AVERAGE;
|
|
|
|
|
|
|
|
//fpsi->redrawtime_index++;
|
|
|
|
//if (fpsi->redrawtime >= REDRAW_FRAME_AVERAGE)
|
|
|
|
// fpsi->redrawtime = 0;
|
|
|
|
|
|
|
|
fps = fps / tot;
|
|
|
|
}
|
|
|
|
#endif
|
2010-04-15 16:44:38 +00:00
|
|
|
|
2012-05-20 19:49:27 +00:00
|
|
|
/* is this more then half a frame behind? */
|
|
|
|
if (fps + 0.5f < (float)(FPS)) {
|
2010-02-12 00:44:26 +00:00
|
|
|
UI_ThemeColor(TH_REDALERT);
|
2011-03-27 15:57:27 +00:00
|
|
|
BLI_snprintf(printable, sizeof(printable), "fps: %.2f", fps);
|
2012-10-21 05:46:41 +00:00
|
|
|
}
|
2010-02-12 00:44:26 +00:00
|
|
|
else {
|
|
|
|
UI_ThemeColor(TH_TEXT_HI);
|
2012-03-25 23:54:33 +00:00
|
|
|
BLI_snprintf(printable, sizeof(printable), "fps: %i", (int)(fps + 0.5f));
|
2010-02-12 00:44:26 +00:00
|
|
|
}
|
|
|
|
|
Holiday coding log :)
Nice formatted version (pictures soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.66/Usability
Short list of main changes:
- Transparent region option (over main region), added code to blend in/out such panels.
- Min size window now 640 x 480
- Fixed DPI for ui - lots of cleanup and changes everywhere. Icon image need correct size still, layer-in-use icon needs remake.
- Macbook retina support, use command line --no-native-pixels to disable it
- Timeline Marker label was drawing wrong
- Trackpad and magic mouse: supports zoom (hold ctrl)
- Fix for splash position: removed ghost function and made window size update after creation immediate
- Fast undo buffer save now adds UI as well. Could be checked for regular file save even...
Quit.blend and temp file saving use this now.
- Dixed filename in window on reading quit.blend or temp saves, and they now add a warning in window title: "(Recovered)"
- New Userpref option "Keep Session" - this always saves quit.blend, and loads on start.
This allows keeping UI and data without actual saves, until you actually save.
When you load startup.blend and quit, it recognises the quit.blend as a startup (no file name in header)
- Added 3D view copy/paste buffers (selected objects). Shortcuts ctrl-c, ctrl-v (OSX, cmd-c, cmd-v).
Coded partial file saving for it. Could be used for other purposes. Todo: use OS clipboards.
- User preferences (themes, keymaps, user settings) now can be saved as a separate file.
Old option is called "Save Startup File" the new one "Save User Settings".
To visualise this difference, the 'save startup file' button has been removed from user preferences window. That option is available as CTRL+U and in File menu still.
- OSX: fixed bug that stopped giving mouse events outside window.
This also fixes "Continuous Grab" for OSX. (error since 2009)
2012-12-12 18:58:11 +00:00
|
|
|
BLF_draw_default_ascii(U.widget_unit, ar->winy - U.widget_unit, 0.0f, printable, sizeof(printable));
|
2010-02-12 00:44:26 +00:00
|
|
|
}
|
|
|
|
|
2012-06-06 23:27:43 +00:00
|
|
|
static void view3d_main_area_draw_objects(const bContext *C, ARegion *ar, const char **grid_unit);
|
|
|
|
|
2012-06-25 12:13:21 +00:00
|
|
|
static int view3d_main_area_do_render_draw(const bContext *C)
|
|
|
|
{
|
|
|
|
Scene *scene = CTX_data_scene(C);
|
|
|
|
RenderEngineType *type = RE_engines_find(scene->r.engine);
|
|
|
|
|
|
|
|
return (type && type->view_update && type->view_draw);
|
|
|
|
}
|
|
|
|
|
2012-06-06 23:27:43 +00:00
|
|
|
static int view3d_main_area_draw_engine(const bContext *C, ARegion *ar, int draw_border)
|
2011-11-02 18:20:53 +00:00
|
|
|
{
|
2012-03-25 23:54:33 +00:00
|
|
|
Scene *scene = CTX_data_scene(C);
|
2011-11-02 18:20:53 +00:00
|
|
|
View3D *v3d = CTX_wm_view3d(C);
|
2012-03-25 23:54:33 +00:00
|
|
|
RegionView3D *rv3d = CTX_wm_region_view3d(C);
|
2011-11-02 18:20:53 +00:00
|
|
|
RenderEngineType *type;
|
2012-06-06 23:27:43 +00:00
|
|
|
GLint scissor[4];
|
2011-11-02 18:20:53 +00:00
|
|
|
|
2012-03-28 09:07:10 +00:00
|
|
|
/* create render engine */
|
2012-02-22 16:52:06 +00:00
|
|
|
if (!rv3d->render_engine) {
|
2012-09-04 13:29:07 +00:00
|
|
|
RenderEngine *engine;
|
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
type = RE_engines_find(scene->r.engine);
|
2011-11-02 18:20:53 +00:00
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (!(type->view_update && type->view_draw))
|
2011-11-02 18:20:53 +00:00
|
|
|
return 0;
|
|
|
|
|
2012-09-04 13:29:07 +00:00
|
|
|
engine = RE_engine_create(type);
|
|
|
|
|
2012-11-05 08:05:14 +00:00
|
|
|
engine->tile_x = scene->r.tilex;
|
|
|
|
engine->tile_y = scene->r.tiley;
|
2012-10-08 11:48:51 +00:00
|
|
|
|
2012-09-04 13:29:07 +00:00
|
|
|
type->view_update(engine, C);
|
|
|
|
|
|
|
|
rv3d->render_engine = engine;
|
2011-11-02 18:20:53 +00:00
|
|
|
}
|
|
|
|
|
2012-03-28 09:07:10 +00:00
|
|
|
/* setup view matrices */
|
2011-11-02 18:20:53 +00:00
|
|
|
view3d_main_area_setup_view(scene, v3d, ar, NULL, NULL);
|
|
|
|
|
2012-03-28 09:07:10 +00:00
|
|
|
/* background draw */
|
2012-06-06 23:27:43 +00:00
|
|
|
ED_region_pixelspace(ar);
|
|
|
|
|
|
|
|
if (draw_border) {
|
|
|
|
/* for border draw, we only need to clear a subset of the 3d view */
|
|
|
|
rctf viewborder;
|
|
|
|
rcti cliprct;
|
|
|
|
|
2012-10-16 11:57:46 +00:00
|
|
|
if (rv3d->persp == RV3D_CAMOB) {
|
|
|
|
ED_view3d_calc_camera_border(scene, ar, v3d, rv3d, &viewborder, FALSE);
|
2012-06-06 23:27:43 +00:00
|
|
|
|
2012-10-16 11:57:46 +00:00
|
|
|
cliprct.xmin = viewborder.xmin + scene->r.border.xmin * BLI_rctf_size_x(&viewborder);
|
|
|
|
cliprct.ymin = viewborder.ymin + scene->r.border.ymin * BLI_rctf_size_y(&viewborder);
|
|
|
|
cliprct.xmax = viewborder.xmin + scene->r.border.xmax * BLI_rctf_size_x(&viewborder);
|
|
|
|
cliprct.ymax = viewborder.ymin + scene->r.border.ymax * BLI_rctf_size_y(&viewborder);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
cliprct.xmin = v3d->render_border.xmin * ar->winx;
|
|
|
|
cliprct.xmax = v3d->render_border.xmax * ar->winx;
|
|
|
|
cliprct.ymin = v3d->render_border.ymin * ar->winy;
|
|
|
|
cliprct.ymax = v3d->render_border.ymax * ar->winy;
|
|
|
|
}
|
2012-06-06 23:27:43 +00:00
|
|
|
|
|
|
|
cliprct.xmin += ar->winrct.xmin;
|
|
|
|
cliprct.xmax += ar->winrct.xmin;
|
|
|
|
cliprct.ymin += ar->winrct.ymin;
|
|
|
|
cliprct.ymax += ar->winrct.ymin;
|
|
|
|
|
2012-06-15 15:01:32 +00:00
|
|
|
cliprct.xmin = CLAMPIS(cliprct.xmin, ar->winrct.xmin, ar->winrct.xmax);
|
|
|
|
cliprct.ymin = CLAMPIS(cliprct.ymin, ar->winrct.ymin, ar->winrct.ymax);
|
|
|
|
cliprct.xmax = CLAMPIS(cliprct.xmax, ar->winrct.xmin, ar->winrct.xmax);
|
|
|
|
cliprct.ymax = CLAMPIS(cliprct.ymax, ar->winrct.ymin, ar->winrct.ymax);
|
|
|
|
|
2012-06-16 09:18:00 +00:00
|
|
|
if (cliprct.xmax > cliprct.xmin && cliprct.ymax > cliprct.ymin) {
|
2012-06-15 15:01:32 +00:00
|
|
|
glGetIntegerv(GL_SCISSOR_BOX, scissor);
|
2012-09-15 11:48:20 +00:00
|
|
|
glScissor(cliprct.xmin, cliprct.ymin, BLI_rcti_size_x(&cliprct), BLI_rcti_size_y(&cliprct));
|
2012-06-15 15:01:32 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
return 0;
|
2012-06-06 23:27:43 +00:00
|
|
|
}
|
|
|
|
|
2011-11-02 18:20:53 +00:00
|
|
|
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
|
2012-03-25 23:54:33 +00:00
|
|
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
2011-11-02 18:20:53 +00:00
|
|
|
|
2012-03-28 09:07:10 +00:00
|
|
|
if (v3d->flag & V3D_DISPBGPICS)
|
2012-06-06 11:40:01 +00:00
|
|
|
view3d_draw_bgpic(scene, ar, v3d, FALSE, TRUE);
|
2012-03-28 09:07:10 +00:00
|
|
|
else
|
|
|
|
fdrawcheckerboard(0, 0, ar->winx, ar->winy);
|
|
|
|
|
2012-06-06 23:27:43 +00:00
|
|
|
/* render result draw */
|
2012-03-25 23:54:33 +00:00
|
|
|
type = rv3d->render_engine->type;
|
2011-11-02 18:20:53 +00:00
|
|
|
type->view_draw(rv3d->render_engine, C);
|
|
|
|
|
2012-04-10 14:59:06 +00:00
|
|
|
if (v3d->flag & V3D_DISPBGPICS)
|
2012-06-06 11:40:01 +00:00
|
|
|
view3d_draw_bgpic(scene, ar, v3d, TRUE, TRUE);
|
2012-04-10 14:59:06 +00:00
|
|
|
|
2012-06-15 15:01:32 +00:00
|
|
|
if (draw_border) {
|
|
|
|
/* restore scissor as it was before */
|
|
|
|
glScissor(scissor[0], scissor[1], scissor[2], scissor[3]);
|
|
|
|
}
|
|
|
|
|
2011-11-02 18:20:53 +00:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void view3d_main_area_draw_engine_info(RegionView3D *rv3d, ARegion *ar)
|
|
|
|
{
|
2012-02-22 16:52:06 +00:00
|
|
|
if (!rv3d->render_engine || !rv3d->render_engine->text)
|
2011-11-02 18:20:53 +00:00
|
|
|
return;
|
|
|
|
|
2011-11-30 06:03:10 +00:00
|
|
|
ED_region_info_draw(ar, rv3d->render_engine->text, 1, 0.25);
|
2011-11-02 18:20:53 +00:00
|
|
|
}
|
|
|
|
|
2010-12-30 14:47:40 +00:00
|
|
|
/* warning: this function has duplicate drawing in ED_view3d_draw_offscreen() */
|
2011-10-23 13:00:41 +00:00
|
|
|
static void view3d_main_area_draw_objects(const bContext *C, ARegion *ar, const char **grid_unit)
|
2009-10-28 18:03:04 +00:00
|
|
|
{
|
2012-03-25 23:54:33 +00:00
|
|
|
Scene *scene = CTX_data_scene(C);
|
2009-10-28 18:03:04 +00:00
|
|
|
View3D *v3d = CTX_wm_view3d(C);
|
2012-03-25 23:54:33 +00:00
|
|
|
RegionView3D *rv3d = CTX_wm_region_view3d(C);
|
2009-10-28 18:03:04 +00:00
|
|
|
Base *base;
|
2010-07-29 10:09:20 +00:00
|
|
|
float backcol[3];
|
2010-10-02 19:45:53 +00:00
|
|
|
unsigned int lay_used;
|
2010-02-03 20:45:35 +00:00
|
|
|
|
2009-10-28 18:03:04 +00:00
|
|
|
/* shadow buffers, before we setup matrices */
|
2012-02-22 16:52:06 +00:00
|
|
|
if (draw_glsl_material(scene, NULL, v3d, v3d->drawtype))
|
2009-10-28 18:03:04 +00:00
|
|
|
gpu_update_lamps_shadows(scene, v3d);
|
2010-03-09 06:20:08 +00:00
|
|
|
|
|
|
|
/* reset default OpenGL lights if needed (i.e. after preferences have been altered) */
|
|
|
|
if (rv3d->rflag & RV3D_GPULIGHT_UPDATE) {
|
|
|
|
rv3d->rflag &= ~RV3D_GPULIGHT_UPDATE;
|
|
|
|
GPU_default_lights();
|
|
|
|
}
|
2009-10-28 18:03:04 +00:00
|
|
|
|
|
|
|
/* clear background */
|
2012-02-22 16:52:06 +00:00
|
|
|
if ((v3d->flag2 & V3D_RENDER_OVERRIDE) && scene->world) {
|
Color Management, Stage 2: Switch color pipeline to use OpenColorIO
Replace old color pipeline which was supporting linear/sRGB color spaces
only with OpenColorIO-based pipeline.
This introduces two configurable color spaces:
- Input color space for images and movie clips. This space is used to convert
images/movies from color space in which file is saved to Blender's linear
space (for float images, byte images are not internally converted, only input
space is stored for such images and used later).
This setting could be found in image/clip data block settings.
- Display color space which defines space in which particular display is working.
This settings could be found in scene's Color Management panel.
When render result is being displayed on the screen, apart from converting image
to display space, some additional conversions could happen.
This conversions are:
- View, which defines tone curve applying before display transformation.
These are different ways to view the image on the same display device.
For example it could be used to emulate film view on sRGB display.
- Exposure affects on image exposure before tone map is applied.
- Gamma is post-display gamma correction, could be used to match particular
display gamma.
- RGB curves are user-defined curves which are applying before display
transformation, could be used for different purposes.
All this settings by default are only applying on render result and does not
affect on other images. If some particular image needs to be affected by this
transformation, "View as Render" setting of image data block should be set to
truth. Movie clips are always affected by all display transformations.
This commit also introduces configurable color space in which sequencer is
working. This setting could be found in scene's Color Management panel and
it should be used if such stuff as grading needs to be done in color space
different from sRGB (i.e. when Film view on sRGB display is use, using VD16
space as sequencer's internal space would make grading working in space
which is close to the space using for display).
Some technical notes:
- Image buffer's float buffer is now always in linear space, even if it was
created from 16bit byte images.
- Space of byte buffer is stored in image buffer's rect_colorspace property.
- Profile of image buffer was removed since it's not longer meaningful.
- OpenGL and GLSL is supposed to always work in sRGB space. It is possible
to support other spaces, but it's quite large project which isn't so
much important.
- Legacy Color Management option disabled is emulated by using None display.
It could have some regressions, but there's no clear way to avoid them.
- If OpenColorIO is disabled on build time, it should make blender behaving
in the same way as previous release with color management enabled.
More details could be found at this page (more details would be added soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.64/Color_Management
--
Thanks to Xavier Thomas, Lukas Toene for initial work on OpenColorIO
integration and to Brecht van Lommel for some further development and code/
usecase review!
2012-09-15 10:05:07 +00:00
|
|
|
IMB_colormanagement_pixel_to_display_space_v3(backcol, &scene->world->horr, &scene->view_settings,
|
|
|
|
&scene->display_settings);
|
|
|
|
|
2010-07-29 10:09:20 +00:00
|
|
|
glClearColor(backcol[0], backcol[1], backcol[2], 0.0);
|
|
|
|
}
|
2010-07-19 19:57:28 +00:00
|
|
|
else
|
|
|
|
UI_ThemeClearColor(TH_BACK);
|
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
2009-10-28 18:03:04 +00:00
|
|
|
|
|
|
|
/* setup view matrices */
|
|
|
|
view3d_main_area_setup_view(scene, v3d, ar, NULL, NULL);
|
|
|
|
|
2010-02-03 20:45:35 +00:00
|
|
|
ED_region_draw_cb_draw(C, ar, REGION_DRAW_PRE_VIEW);
|
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (rv3d->rflag & RV3D_CLIPPING)
|
2.5
View3D has been split now in a local part (RegionView3D) and a
per-area part (old View3D). Currently local is:
- view transform
- camera zoom/offset
- gpencil (todo)
- custom clipping planes
Rest is in Area still, like active camera, draw type, layers,
localview, custom centers, around-settings, transform widget,
gridlines, and so on (mostly stuff as available in header).
To see it work; also added new feature for region split,
press SHIFT+ALT+CTRL+S for four-split.
The idea is to make a preset 4-split, configured to stick
to top/right/front views for three views.
Another cool idea to explore is to then box-clip all drawing
based on these 3 views.
Note about the code:
- currently view3d still stores some depricated settings, to
convert from older files. Not all settings are copied over
though, like custom clip planes or the 'lock view to object'.
- since some view3d ops are now on area level, the operators
for it should keep track of that.
Bugfix in transform: quat initialize in operator-invoke missed
one zero.
Als brought back GE to compile for missing Ipos and channels.
2009-01-19 16:54:41 +00:00
|
|
|
view3d_draw_clipping(rv3d);
|
2008-12-18 17:38:21 +00:00
|
|
|
|
|
|
|
/* set zbuffer after we draw clipping region */
|
2012-02-22 16:52:06 +00:00
|
|
|
if (v3d->drawtype > OB_WIRE) {
|
2012-03-25 23:54:33 +00:00
|
|
|
v3d->zbuf = TRUE;
|
2008-12-18 17:38:21 +00:00
|
|
|
glEnable(GL_DEPTH_TEST);
|
|
|
|
}
|
2009-10-07 22:05:30 +00:00
|
|
|
else
|
2012-03-25 23:54:33 +00:00
|
|
|
v3d->zbuf = FALSE;
|
2010-01-08 09:30:36 +00:00
|
|
|
|
|
|
|
/* enables anti-aliasing for 3D view drawing */
|
2012-11-24 00:59:10 +00:00
|
|
|
if (U.ogl_multisamples != USER_MULTISAMPLE_NONE) {
|
|
|
|
// if (!(U.gameflags & USER_DISABLE_AA))
|
|
|
|
glEnable(GL_MULTISAMPLE_ARB);
|
|
|
|
}
|
2012-11-10 11:55:45 +00:00
|
|
|
|
2012-03-03 16:31:46 +00:00
|
|
|
|
2012-07-08 20:36:00 +00:00
|
|
|
/* needs to be done always, gridview is adjusted in drawgrid() now */
|
2012-03-25 23:54:33 +00:00
|
|
|
rv3d->gridview = v3d->grid;
|
2010-03-16 17:49:31 +00:00
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if ((rv3d->view == RV3D_VIEW_USER) || (rv3d->persp != RV3D_ORTHO)) {
|
2012-03-25 23:54:33 +00:00
|
|
|
if ((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) {
|
2011-10-23 13:00:41 +00:00
|
|
|
drawfloor(scene, v3d, grid_unit);
|
2010-11-15 08:53:35 +00:00
|
|
|
}
|
2012-03-25 23:54:33 +00:00
|
|
|
if (rv3d->persp == RV3D_CAMOB) {
|
2012-02-22 16:52:06 +00:00
|
|
|
if (scene->world) {
|
|
|
|
if (scene->world->mode & WO_STARS) {
|
2010-11-15 08:53:35 +00:00
|
|
|
RE_make_stars(NULL, scene, star_stuff_init_func, star_stuff_vertex_func,
|
2012-03-25 23:54:33 +00:00
|
|
|
star_stuff_term_func);
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
2010-11-15 08:53:35 +00:00
|
|
|
}
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
2010-11-15 08:53:35 +00:00
|
|
|
}
|
|
|
|
else {
|
2012-03-25 23:54:33 +00:00
|
|
|
if ((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) {
|
2010-03-16 17:49:31 +00:00
|
|
|
ED_region_pixelspace(ar);
|
2011-10-23 13:00:41 +00:00
|
|
|
drawgrid(&scene->unit, ar, v3d, grid_unit);
|
2010-03-16 17:49:31 +00:00
|
|
|
/* XXX make function? replaces persp(1) */
|
|
|
|
glMatrixMode(GL_PROJECTION);
|
|
|
|
glLoadMatrixf(rv3d->winmat);
|
|
|
|
glMatrixMode(GL_MODELVIEW);
|
|
|
|
glLoadMatrixf(rv3d->viewmat);
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
|
|
|
}
|
2012-04-10 14:59:06 +00:00
|
|
|
|
2012-06-06 11:40:01 +00:00
|
|
|
view3d_draw_bgpic_test(scene, ar, v3d, FALSE, TRUE);
|
2012-04-10 14:59:06 +00:00
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (rv3d->rflag & RV3D_CLIPPING)
|
2012-02-28 13:03:56 +00:00
|
|
|
ED_view3d_clipping_set(rv3d);
|
2010-03-04 15:58:27 +00:00
|
|
|
|
2008-12-18 17:38:21 +00:00
|
|
|
/* draw set first */
|
2012-02-22 16:52:06 +00:00
|
|
|
if (scene->set) {
|
2010-12-17 15:37:59 +00:00
|
|
|
Scene *sce_iter;
|
2012-02-22 16:52:06 +00:00
|
|
|
for (SETLOOPER(scene->set, sce_iter, base)) {
|
2008-12-18 17:38:21 +00:00
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (v3d->lay & base->lay) {
|
2008-12-18 17:38:21 +00:00
|
|
|
|
|
|
|
UI_ThemeColorBlend(TH_WIRE, TH_BACK, 0.6f);
|
2012-03-25 23:54:33 +00:00
|
|
|
draw_object(scene, ar, v3d, base, DRAW_CONSTCOLOR | DRAW_SCENESET);
|
2008-12-18 17:38:21 +00:00
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (base->object->transflag & OB_DUPLI) {
|
2008-12-19 14:14:43 +00:00
|
|
|
draw_dupli_objects_color(scene, ar, v3d, base, TH_WIRE);
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Transp and X-ray afterdraw stuff for sets is done later */
|
|
|
|
}
|
2010-03-04 15:58:27 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
lay_used = 0;
|
2010-10-02 09:28:41 +00:00
|
|
|
|
2008-12-18 17:38:21 +00:00
|
|
|
/* then draw not selected and the duplis, but skip editmode object */
|
2012-03-25 23:54:33 +00:00
|
|
|
for (base = scene->base.first; base; base = base->next) {
|
|
|
|
lay_used |= base->lay & ((1 << 20) - 1);
|
2010-10-02 09:28:41 +00:00
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (v3d->lay & base->lay) {
|
2008-12-18 17:38:21 +00:00
|
|
|
|
|
|
|
/* dupli drawing */
|
2012-02-22 16:52:06 +00:00
|
|
|
if (base->object->transflag & OB_DUPLI) {
|
2008-12-19 14:14:43 +00:00
|
|
|
draw_dupli_objects(scene, ar, v3d, base);
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
2012-03-25 23:54:33 +00:00
|
|
|
if ((base->flag & SELECT) == 0) {
|
|
|
|
if (base->object != scene->obedit)
|
2008-12-19 14:14:43 +00:00
|
|
|
draw_object(scene, ar, v3d, base, 0);
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2009-01-13 19:57:36 +00:00
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (v3d->lay_used != lay_used) { /* happens when loading old files or loading with UI load */
|
2010-10-02 09:28:41 +00:00
|
|
|
/* find header and force tag redraw */
|
2012-03-25 23:54:33 +00:00
|
|
|
ScrArea *sa = CTX_wm_area(C);
|
|
|
|
ARegion *ar_header = BKE_area_find_region_type(sa, RGN_TYPE_HEADER);
|
2011-05-20 05:27:31 +00:00
|
|
|
ED_region_tag_redraw(ar_header); /* can be NULL */
|
2012-03-25 23:54:33 +00:00
|
|
|
v3d->lay_used = lay_used;
|
2010-10-02 09:28:41 +00:00
|
|
|
}
|
|
|
|
|
2008-12-18 17:38:21 +00:00
|
|
|
/* draw selected and editmode */
|
2012-03-25 23:54:33 +00:00
|
|
|
for (base = scene->base.first; base; base = base->next) {
|
2012-02-22 16:52:06 +00:00
|
|
|
if (v3d->lay & base->lay) {
|
2012-03-25 23:54:33 +00:00
|
|
|
if (base->object == scene->obedit || (base->flag & SELECT) )
|
2008-12-19 14:14:43 +00:00
|
|
|
draw_object(scene, ar, v3d, base, 0);
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
|
|
|
}
|
2010-11-26 12:38:42 +00:00
|
|
|
|
2008-12-18 17:38:21 +00:00
|
|
|
// REEB_draw();
|
2011-04-01 14:14:37 +00:00
|
|
|
|
2012-12-17 02:34:53 +00:00
|
|
|
if (v3d->flag2 & V3D_SHOW_GPENCIL) {
|
2011-04-01 14:14:37 +00:00
|
|
|
/* must be before xray draw which clears the depth buffer */
|
2012-02-22 16:52:06 +00:00
|
|
|
if (v3d->zbuf) glDisable(GL_DEPTH_TEST);
|
2012-12-17 02:34:53 +00:00
|
|
|
draw_gpencil_view3d(scene, v3d, ar, TRUE);
|
2012-02-22 16:52:06 +00:00
|
|
|
if (v3d->zbuf) glEnable(GL_DEPTH_TEST);
|
2011-04-01 14:14:37 +00:00
|
|
|
}
|
|
|
|
|
2008-12-18 17:38:21 +00:00
|
|
|
/* Transp and X-ray afterdraw stuff */
|
2012-03-25 23:54:33 +00:00
|
|
|
if (v3d->afterdraw_transp.first) view3d_draw_transp(scene, ar, v3d);
|
2012-07-08 20:36:00 +00:00
|
|
|
if (v3d->afterdraw_xray.first) view3d_draw_xray(scene, ar, v3d, 1); /* clears zbuffer if it is used! */
|
2012-03-25 23:54:33 +00:00
|
|
|
if (v3d->afterdraw_xraytransp.first) view3d_draw_xraytransp(scene, ar, v3d, 1);
|
2008-12-18 17:38:21 +00:00
|
|
|
|
2010-02-09 09:56:04 +00:00
|
|
|
ED_region_draw_cb_draw(C, ar, REGION_DRAW_POST_VIEW);
|
2010-11-26 12:38:42 +00:00
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (rv3d->rflag & RV3D_CLIPPING)
|
2012-02-28 13:03:56 +00:00
|
|
|
ED_view3d_clipping_disable();
|
2008-12-18 17:38:21 +00:00
|
|
|
|
2012-06-06 11:40:01 +00:00
|
|
|
/* important to do after clipping */
|
|
|
|
view3d_draw_bgpic_test(scene, ar, v3d, TRUE, TRUE);
|
|
|
|
|
2009-07-08 15:01:28 +00:00
|
|
|
BIF_draw_manipulator(C);
|
2012-03-03 16:31:46 +00:00
|
|
|
|
2010-01-08 09:30:36 +00:00
|
|
|
/* Disable back anti-aliasing */
|
2012-11-24 00:59:10 +00:00
|
|
|
if (U.ogl_multisamples != USER_MULTISAMPLE_NONE) {
|
|
|
|
// if (!(U.gameflags & USER_DISABLE_AA))
|
|
|
|
glDisable(GL_MULTISAMPLE_ARB);
|
|
|
|
}
|
2010-01-08 09:30:36 +00:00
|
|
|
|
2012-11-10 11:55:45 +00:00
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (v3d->zbuf) {
|
2012-03-25 23:54:33 +00:00
|
|
|
v3d->zbuf = FALSE;
|
2008-12-18 17:38:21 +00:00
|
|
|
glDisable(GL_DEPTH_TEST);
|
|
|
|
}
|
2010-03-16 17:49:31 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
if ((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) {
|
2010-03-16 17:49:31 +00:00
|
|
|
BDR_drawSketch(C);
|
|
|
|
}
|
|
|
|
|
2011-07-30 05:23:10 +00:00
|
|
|
if ((U.ndof_flag & NDOF_SHOW_GUIDE) && (rv3d->viewlock != RV3D_LOCKED) && (rv3d->persp != RV3D_CAMOB))
|
2012-07-08 20:36:00 +00:00
|
|
|
/* TODO: draw something else (but not this) during fly mode */
|
2011-07-26 02:35:46 +00:00
|
|
|
draw_rotation_guide(rv3d);
|
|
|
|
|
2011-10-23 13:00:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void view3d_main_area_draw_info(const bContext *C, ARegion *ar, const char *grid_unit)
|
|
|
|
{
|
2012-05-25 12:56:29 +00:00
|
|
|
wmWindowManager *wm = CTX_wm_manager(C);
|
2012-03-25 23:54:33 +00:00
|
|
|
Scene *scene = CTX_data_scene(C);
|
2011-10-23 13:00:41 +00:00
|
|
|
View3D *v3d = CTX_wm_view3d(C);
|
2012-03-25 23:54:33 +00:00
|
|
|
RegionView3D *rv3d = CTX_wm_region_view3d(C);
|
2011-10-23 13:00:41 +00:00
|
|
|
|
2012-10-16 11:57:46 +00:00
|
|
|
if (rv3d->persp == RV3D_CAMOB) {
|
2010-10-02 19:31:23 +00:00
|
|
|
drawviewborder(scene, ar, v3d);
|
2012-10-16 11:57:46 +00:00
|
|
|
}
|
|
|
|
else if (v3d->flag2 & V3D_RENDER_BORDER) {
|
|
|
|
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
|
|
|
setlinestyle(3);
|
|
|
|
cpack(0x4040FF);
|
|
|
|
|
|
|
|
glRectf(v3d->render_border.xmin * ar->winx, v3d->render_border.ymin * ar->winy,
|
|
|
|
v3d->render_border.xmax * ar->winx, v3d->render_border.ymax * ar->winy);
|
|
|
|
|
|
|
|
setlinestyle(0);
|
|
|
|
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
|
|
|
}
|
2010-03-16 17:49:31 +00:00
|
|
|
|
2012-03-25 23:54:33 +00:00
|
|
|
if ((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) {
|
2012-10-25 03:10:35 +00:00
|
|
|
Object *ob;
|
|
|
|
|
2012-12-17 02:34:53 +00:00
|
|
|
if (v3d->flag2 & V3D_SHOW_GPENCIL) {
|
|
|
|
/* draw grease-pencil stuff - needed to get paint-buffer shown too (since it's 2D) */
|
|
|
|
draw_gpencil_view3d(scene, v3d, ar, FALSE);
|
|
|
|
}
|
2008-12-18 17:38:21 +00:00
|
|
|
|
2010-03-16 17:49:31 +00:00
|
|
|
drawcursor(scene, ar, v3d);
|
2012-10-25 03:10:35 +00:00
|
|
|
|
|
|
|
if (U.uiflag & USER_SHOW_ROTVIEWICON)
|
Holiday coding log :)
Nice formatted version (pictures soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.66/Usability
Short list of main changes:
- Transparent region option (over main region), added code to blend in/out such panels.
- Min size window now 640 x 480
- Fixed DPI for ui - lots of cleanup and changes everywhere. Icon image need correct size still, layer-in-use icon needs remake.
- Macbook retina support, use command line --no-native-pixels to disable it
- Timeline Marker label was drawing wrong
- Trackpad and magic mouse: supports zoom (hold ctrl)
- Fix for splash position: removed ghost function and made window size update after creation immediate
- Fast undo buffer save now adds UI as well. Could be checked for regular file save even...
Quit.blend and temp file saving use this now.
- Dixed filename in window on reading quit.blend or temp saves, and they now add a warning in window title: "(Recovered)"
- New Userpref option "Keep Session" - this always saves quit.blend, and loads on start.
This allows keeping UI and data without actual saves, until you actually save.
When you load startup.blend and quit, it recognises the quit.blend as a startup (no file name in header)
- Added 3D view copy/paste buffers (selected objects). Shortcuts ctrl-c, ctrl-v (OSX, cmd-c, cmd-v).
Coded partial file saving for it. Could be used for other purposes. Todo: use OS clipboards.
- User preferences (themes, keymaps, user settings) now can be saved as a separate file.
Old option is called "Save Startup File" the new one "Save User Settings".
To visualise this difference, the 'save startup file' button has been removed from user preferences window. That option is available as CTRL+U and in File menu still.
- OSX: fixed bug that stopped giving mouse events outside window.
This also fixes "Continuous Grab" for OSX. (error since 2009)
2012-12-12 18:58:11 +00:00
|
|
|
draw_view_axis(ar, rv3d);
|
2012-10-25 03:10:35 +00:00
|
|
|
else
|
Holiday coding log :)
Nice formatted version (pictures soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.66/Usability
Short list of main changes:
- Transparent region option (over main region), added code to blend in/out such panels.
- Min size window now 640 x 480
- Fixed DPI for ui - lots of cleanup and changes everywhere. Icon image need correct size still, layer-in-use icon needs remake.
- Macbook retina support, use command line --no-native-pixels to disable it
- Timeline Marker label was drawing wrong
- Trackpad and magic mouse: supports zoom (hold ctrl)
- Fix for splash position: removed ghost function and made window size update after creation immediate
- Fast undo buffer save now adds UI as well. Could be checked for regular file save even...
Quit.blend and temp file saving use this now.
- Dixed filename in window on reading quit.blend or temp saves, and they now add a warning in window title: "(Recovered)"
- New Userpref option "Keep Session" - this always saves quit.blend, and loads on start.
This allows keeping UI and data without actual saves, until you actually save.
When you load startup.blend and quit, it recognises the quit.blend as a startup (no file name in header)
- Added 3D view copy/paste buffers (selected objects). Shortcuts ctrl-c, ctrl-v (OSX, cmd-c, cmd-v).
Coded partial file saving for it. Could be used for other purposes. Todo: use OS clipboards.
- User preferences (themes, keymaps, user settings) now can be saved as a separate file.
Old option is called "Save Startup File" the new one "Save User Settings".
To visualise this difference, the 'save startup file' button has been removed from user preferences window. That option is available as CTRL+U and in File menu still.
- OSX: fixed bug that stopped giving mouse events outside window.
This also fixes "Continuous Grab" for OSX. (error since 2009)
2012-12-12 18:58:11 +00:00
|
|
|
draw_view_icon(ar, rv3d);
|
2012-10-25 03:10:35 +00:00
|
|
|
|
|
|
|
ob = OBACT;
|
|
|
|
if (U.uiflag & USER_DRAWVIEWINFO)
|
Holiday coding log :)
Nice formatted version (pictures soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.66/Usability
Short list of main changes:
- Transparent region option (over main region), added code to blend in/out such panels.
- Min size window now 640 x 480
- Fixed DPI for ui - lots of cleanup and changes everywhere. Icon image need correct size still, layer-in-use icon needs remake.
- Macbook retina support, use command line --no-native-pixels to disable it
- Timeline Marker label was drawing wrong
- Trackpad and magic mouse: supports zoom (hold ctrl)
- Fix for splash position: removed ghost function and made window size update after creation immediate
- Fast undo buffer save now adds UI as well. Could be checked for regular file save even...
Quit.blend and temp file saving use this now.
- Dixed filename in window on reading quit.blend or temp saves, and they now add a warning in window title: "(Recovered)"
- New Userpref option "Keep Session" - this always saves quit.blend, and loads on start.
This allows keeping UI and data without actual saves, until you actually save.
When you load startup.blend and quit, it recognises the quit.blend as a startup (no file name in header)
- Added 3D view copy/paste buffers (selected objects). Shortcuts ctrl-c, ctrl-v (OSX, cmd-c, cmd-v).
Coded partial file saving for it. Could be used for other purposes. Todo: use OS clipboards.
- User preferences (themes, keymaps, user settings) now can be saved as a separate file.
Old option is called "Save Startup File" the new one "Save User Settings".
To visualise this difference, the 'save startup file' button has been removed from user preferences window. That option is available as CTRL+U and in File menu still.
- OSX: fixed bug that stopped giving mouse events outside window.
This also fixes "Continuous Grab" for OSX. (error since 2009)
2012-12-12 18:58:11 +00:00
|
|
|
draw_selected_name(ar, scene, ob);
|
2010-03-16 17:49:31 +00:00
|
|
|
}
|
2011-11-14 19:45:21 +00:00
|
|
|
|
2012-02-22 16:52:06 +00:00
|
|
|
if (rv3d->render_engine) {
|
2011-11-02 18:20:53 +00:00
|
|
|
view3d_main_area_draw_engine_info(rv3d, ar);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2012-10-25 03:10:35 +00:00
|
|
|
if ((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) {
|
|
|
|
if ((U.uiflag & USER_SHOW_FPS) && ED_screen_animation_playing(wm)) {
|
|
|
|
draw_viewport_fps(scene, ar);
|
|
|
|
}
|
|
|
|
else if (U.uiflag & USER_SHOW_VIEWPORTNAME) {
|
|
|
|
draw_viewport_name(ar, v3d);
|
|
|
|
}
|
2012-01-18 10:41:38 +00:00
|
|
|
|
2012-10-25 03:10:35 +00:00
|
|
|
if (grid_unit) { /* draw below the viewport name */
|
|
|
|
char numstr[32] = "";
|
2010-11-23 14:14:06 +00:00
|
|
|
|
2012-10-25 03:10:35 +00:00
|
|
|
UI_ThemeColor(TH_TEXT_HI);
|
|
|
|
if (v3d->grid != 1.0f) {
|
|
|
|
BLI_snprintf(numstr, sizeof(numstr), "%s x %.4g", grid_unit, v3d->grid);
|
|
|
|
}
|
2010-11-23 14:14:06 +00:00
|
|
|
|
2012-12-16 09:37:15 +00:00
|
|
|
BLF_draw_default_ascii(ED_region_overlapping_offset(ar) + U.widget_unit,
|
2012-12-13 05:43:01 +00:00
|
|
|
ar->winy - (USER_SHOW_VIEWPORTNAME ? 2 * U.widget_unit : U.widget_unit), 0.0f,
|
2012-10-25 03:10:35 +00:00
|
|
|
numstr[0] ? numstr : grid_unit, sizeof(numstr));
|
|
|
|
}
|
2009-08-12 14:11:53 +00:00
|
|
|
}
|
2011-10-23 13:00:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void view3d_main_area_draw(const bContext *C, ARegion *ar)
|
|
|
|
{
|
2012-06-06 23:27:43 +00:00
|
|
|
Scene *scene = CTX_data_scene(C);
|
2011-10-23 13:00:41 +00:00
|
|
|
View3D *v3d = CTX_wm_view3d(C);
|
2012-06-06 23:27:43 +00:00
|
|
|
RegionView3D *rv3d = CTX_wm_region_view3d(C);
|
2012-03-25 23:54:33 +00:00
|
|
|
const char *grid_unit = NULL;
|
2012-10-16 11:57:46 +00:00
|
|
|
int draw_border = FALSE;
|
|
|
|
|
|
|
|
if (rv3d->persp == RV3D_CAMOB)
|
|
|
|
draw_border = scene->r.mode & R_BORDER;
|
|
|
|
else
|
|
|
|
draw_border = v3d->flag2 & V3D_RENDER_BORDER;
|
2011-10-23 13:00:41 +00:00
|
|
|
|
2012-06-06 23:27:43 +00:00
|
|
|
/* draw viewport using opengl */
|
2012-06-25 12:13:21 +00:00
|
|
|
if (v3d->drawtype != OB_RENDER || !view3d_main_area_do_render_draw(C) || draw_border) {
|
2011-11-02 18:20:53 +00:00
|
|
|
view3d_main_area_draw_objects(C, ar, &grid_unit);
|
2012-11-16 07:56:47 +00:00
|
|
|
#ifdef DEBUG_DRAW
|
|
|
|
bl_debug_draw();
|
|
|
|
#endif
|
2011-11-02 18:20:53 +00:00
|
|
|
ED_region_pixelspace(ar);
|
|
|
|
}
|
2012-06-06 23:27:43 +00:00
|
|
|
|
|
|
|
/* draw viewport using external renderer */
|
|
|
|
if (v3d->drawtype == OB_RENDER)
|
|
|
|
view3d_main_area_draw_engine(C, ar, draw_border);
|
2008-12-18 17:38:21 +00:00
|
|
|
|
2011-10-23 13:00:41 +00:00
|
|
|
view3d_main_area_draw_info(C, ar, grid_unit);
|
2008-12-18 17:38:21 +00:00
|
|
|
|
2009-12-17 14:38:30 +00:00
|
|
|
v3d->flag |= V3D_INVALID_BACKBUF;
|
2008-12-18 17:38:21 +00:00
|
|
|
}
|
2011-08-12 18:13:55 +00:00
|
|
|
|
2012-11-16 07:56:47 +00:00
|
|
|
#ifdef DEBUG_DRAW
|
|
|
|
/* debug drawing */
|
|
|
|
#define _DEBUG_DRAW_QUAD_TOT 1024
|
2012-11-25 13:52:13 +00:00
|
|
|
#define _DEBUG_DRAW_EDGE_TOT 1024
|
2012-11-16 07:56:47 +00:00
|
|
|
static float _bl_debug_draw_quads[_DEBUG_DRAW_QUAD_TOT][4][3];
|
|
|
|
static int _bl_debug_draw_quads_tot = 0;
|
2012-11-25 13:52:13 +00:00
|
|
|
static float _bl_debug_draw_edges[_DEBUG_DRAW_QUAD_TOT][2][3];
|
|
|
|
static int _bl_debug_draw_edges_tot = 0;
|
2012-11-16 07:56:47 +00:00
|
|
|
|
|
|
|
void bl_debug_draw_quad_clear(void)
|
|
|
|
{
|
|
|
|
_bl_debug_draw_quads_tot = 0;
|
2012-11-25 13:52:13 +00:00
|
|
|
_bl_debug_draw_edges_tot = 0;
|
2012-11-16 07:56:47 +00:00
|
|
|
}
|
|
|
|
void bl_debug_draw_quad_add(const float v0[3], const float v1[3], const float v2[3], const float v3[3])
|
|
|
|
{
|
|
|
|
if (_bl_debug_draw_quads_tot >= _DEBUG_DRAW_QUAD_TOT) {
|
|
|
|
printf("%s: max quad count hit %d!", __func__, _bl_debug_draw_quads_tot);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
float *pt = &_bl_debug_draw_quads[_bl_debug_draw_quads_tot][0][0];
|
|
|
|
copy_v3_v3(pt, v0); pt += 3;
|
|
|
|
copy_v3_v3(pt, v1); pt += 3;
|
|
|
|
copy_v3_v3(pt, v2); pt += 3;
|
|
|
|
copy_v3_v3(pt, v3); pt += 3;
|
|
|
|
_bl_debug_draw_quads_tot++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void bl_debug_draw_edge_add(const float v0[3], const float v1[3])
|
|
|
|
{
|
2012-11-25 13:52:13 +00:00
|
|
|
if (_bl_debug_draw_quads_tot >= _DEBUG_DRAW_EDGE_TOT) {
|
|
|
|
printf("%s: max edge count hit %d!", __func__, _bl_debug_draw_edges_tot);
|
2012-11-16 07:56:47 +00:00
|
|
|
}
|
|
|
|
else {
|
2012-11-25 13:52:13 +00:00
|
|
|
float *pt = &_bl_debug_draw_edges[_bl_debug_draw_edges_tot][0][0];
|
2012-11-16 07:56:47 +00:00
|
|
|
copy_v3_v3(pt, v0); pt += 3;
|
|
|
|
copy_v3_v3(pt, v1); pt += 3;
|
2012-11-25 13:52:13 +00:00
|
|
|
_bl_debug_draw_edges_tot++;
|
2012-11-16 07:56:47 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
static void bl_debug_draw(void)
|
|
|
|
{
|
|
|
|
if (_bl_debug_draw_quads_tot) {
|
|
|
|
int i;
|
|
|
|
cpack(0x00FF0000);
|
|
|
|
glBegin(GL_LINE_LOOP);
|
2012-11-18 01:22:31 +00:00
|
|
|
for (i = 0; i < _bl_debug_draw_quads_tot; i ++) {
|
2012-11-16 07:56:47 +00:00
|
|
|
glVertex3fv(_bl_debug_draw_quads[i][0]);
|
|
|
|
glVertex3fv(_bl_debug_draw_quads[i][1]);
|
|
|
|
glVertex3fv(_bl_debug_draw_quads[i][2]);
|
|
|
|
glVertex3fv(_bl_debug_draw_quads[i][3]);
|
|
|
|
}
|
|
|
|
glEnd();
|
|
|
|
}
|
2012-11-25 13:52:13 +00:00
|
|
|
if (_bl_debug_draw_edges_tot) {
|
|
|
|
int i;
|
|
|
|
cpack(0x00FFFF00);
|
|
|
|
glBegin(GL_LINES);
|
|
|
|
for (i = 0; i < _bl_debug_draw_edges_tot; i ++) {
|
|
|
|
glVertex3fv(_bl_debug_draw_edges[i][0]);
|
|
|
|
glVertex3fv(_bl_debug_draw_edges[i][1]);
|
|
|
|
}
|
|
|
|
glEnd();
|
|
|
|
glPointSize(4.0);
|
|
|
|
glBegin(GL_POINTS);
|
|
|
|
for (i = 0; i < _bl_debug_draw_edges_tot; i ++) {
|
|
|
|
glVertex3fv(_bl_debug_draw_edges[i][0]);
|
|
|
|
glVertex3fv(_bl_debug_draw_edges[i][1]);
|
|
|
|
}
|
|
|
|
glEnd();
|
|
|
|
}
|
2012-11-16 07:56:47 +00:00
|
|
|
}
|
|
|
|
#endif
|