This commit is contained in:
Daniel Genrich 2008-09-07 19:47:15 +00:00
commit 44f9276b67
21 changed files with 2521 additions and 2286 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 67 KiB

@ -61,8 +61,20 @@ def get_object_images(ob):
me.activeUVLayer = orig_uvlayer me.activeUVLayer = orig_uvlayer
# Now get material images
for mat in me.materials:
if mat:
for mtex in mat.getTextures():
if mtex:
tex = mtex.tex
i = tex.getImage()
if i: unique_images[i.name] = i
return unique_images.values() return unique_images.values()
# Todo, support other object types, materials # Todo, support other object types, materials
return [] return []
@ -118,7 +130,7 @@ def main():
def activate(ob, scn): def activate(ob, scn):
bpy.data.scenes.active = scn bpy.data.scenes.active = scn
scn.objects.selected = [] scn.objects.selected = []
scn.Layers = ob.Layers scn.Layers = ob.Layers & (1<<20)-1
ob.sel = 1 ob.sel = 1
def name_cmp(name_search, name_found): def name_cmp(name_search, name_found):

@ -367,19 +367,12 @@ void constraint_mat_convertspace (Object *ob, bPoseChannel *pchan, float mat[][4
case CONSTRAINT_SPACE_WORLD: /* ---------- FROM WORLDSPACE ---------- */ case CONSTRAINT_SPACE_WORLD: /* ---------- FROM WORLDSPACE ---------- */
{ {
/* world to pose */ /* world to pose */
if (to==CONSTRAINT_SPACE_POSE || to==CONSTRAINT_SPACE_LOCAL || to==CONSTRAINT_SPACE_PARLOCAL) {
Mat4Invert(imat, ob->obmat); Mat4Invert(imat, ob->obmat);
Mat4CpyMat4(tempmat, mat); Mat4CpyMat4(tempmat, mat);
Mat4MulMat4(mat, tempmat, imat); Mat4MulMat4(mat, tempmat, imat);
}
/* pose to local */ /* use pose-space as stepping stone for other spaces... */
if (to == CONSTRAINT_SPACE_LOCAL) { if (ELEM(to, CONSTRAINT_SPACE_LOCAL, CONSTRAINT_SPACE_PARLOCAL)) {
/* call self with slightly different values */
constraint_mat_convertspace(ob, pchan, mat, CONSTRAINT_SPACE_POSE, to);
}
/* pose to local + parent */
else if (to == CONSTRAINT_SPACE_PARLOCAL) {
/* call self with slightly different values */ /* call self with slightly different values */
constraint_mat_convertspace(ob, pchan, mat, CONSTRAINT_SPACE_POSE, to); constraint_mat_convertspace(ob, pchan, mat, CONSTRAINT_SPACE_POSE, to);
} }
@ -445,9 +438,7 @@ void constraint_mat_convertspace (Object *ob, bPoseChannel *pchan, float mat[][4
break; break;
case CONSTRAINT_SPACE_LOCAL: /* ------------ FROM LOCALSPACE --------- */ case CONSTRAINT_SPACE_LOCAL: /* ------------ FROM LOCALSPACE --------- */
{ {
/* local to pose */ /* local to pose - do inverse procedure that was done for pose to local */
if (to==CONSTRAINT_SPACE_POSE || to==CONSTRAINT_SPACE_WORLD) {
/* do inverse procedure that was done for pose to local */
if (pchan->bone) { if (pchan->bone) {
/* we need the posespace_matrix = local_matrix + (parent_posespace_matrix + restpos) */ /* we need the posespace_matrix = local_matrix + (parent_posespace_matrix + restpos) */
if (pchan->parent) { if (pchan->parent) {
@ -488,9 +479,9 @@ void constraint_mat_convertspace (Object *ob, bPoseChannel *pchan, float mat[][4
Mat4MulMat4(mat, tempmat, diff_mat); Mat4MulMat4(mat, tempmat, diff_mat);
} }
} }
}
/* local to world */ /* use pose-space as stepping stone for other spaces */
if (to == CONSTRAINT_SPACE_WORLD) { if (ELEM(to, CONSTRAINT_SPACE_WORLD, CONSTRAINT_SPACE_PARLOCAL)) {
/* call self with slightly different values */ /* call self with slightly different values */
constraint_mat_convertspace(ob, pchan, mat, CONSTRAINT_SPACE_POSE, to); constraint_mat_convertspace(ob, pchan, mat, CONSTRAINT_SPACE_POSE, to);
} }
@ -498,16 +489,15 @@ void constraint_mat_convertspace (Object *ob, bPoseChannel *pchan, float mat[][4
break; break;
case CONSTRAINT_SPACE_PARLOCAL: /* -------------- FROM LOCAL WITH PARENT ---------- */ case CONSTRAINT_SPACE_PARLOCAL: /* -------------- FROM LOCAL WITH PARENT ---------- */
{ {
/* local to pose */ /* local + parent to pose */
if (to==CONSTRAINT_SPACE_POSE || to==CONSTRAINT_SPACE_WORLD) {
if (pchan->bone) { if (pchan->bone) {
Mat4CpyMat4(diff_mat, pchan->bone->arm_mat); Mat4CpyMat4(diff_mat, pchan->bone->arm_mat);
Mat4CpyMat4(tempmat, mat); Mat4CpyMat4(tempmat, mat);
Mat4MulMat4(mat, diff_mat, tempmat); Mat4MulMat4(mat, diff_mat, tempmat);
} }
}
/* local to world */ /* use pose-space as stepping stone for other spaces */
if (to == CONSTRAINT_SPACE_WORLD) { if (ELEM(to, CONSTRAINT_SPACE_WORLD, CONSTRAINT_SPACE_LOCAL)) {
/* call self with slightly different values */ /* call self with slightly different values */
constraint_mat_convertspace(ob, pchan, mat, CONSTRAINT_SPACE_POSE, to); constraint_mat_convertspace(ob, pchan, mat, CONSTRAINT_SPACE_POSE, to);
} }

@ -697,9 +697,11 @@ float dof_camera(Object *ob)
if (cam->dof_ob) { if (cam->dof_ob) {
/* too simple, better to return the distance on the view axis only /* too simple, better to return the distance on the view axis only
* return VecLenf(ob->obmat[3], cam->dof_ob->obmat[3]); */ * return VecLenf(ob->obmat[3], cam->dof_ob->obmat[3]); */
float mat[4][4], obmat[4][4];
float mat[4][4]; Mat4CpyMat4(obmat, ob->obmat);
Mat4Invert(ob->imat, ob->obmat); Mat4Ortho(obmat);
Mat4Invert(ob->imat, obmat);
Mat4MulMat4(mat, cam->dof_ob->obmat, ob->imat); Mat4MulMat4(mat, cam->dof_ob->obmat, ob->imat);
return fabs(mat[3][2]); return fabs(mat[3][2]);
} }

@ -33,6 +33,8 @@
struct ScrArea; struct ScrArea;
struct Sequence; struct Sequence;
#define SEQ_ZOOM_FAC(szoom) (szoom > 0)? (szoom) : (szoom == 0)? (1.0) : (-1.0/szoom)
void drawprefetchseqspace(struct ScrArea *sa, void *spacedata); void drawprefetchseqspace(struct ScrArea *sa, void *spacedata);
void drawseqspace(struct ScrArea *sa, void *spacedata); void drawseqspace(struct ScrArea *sa, void *spacedata);
void set_special_seq_update(int val); void set_special_seq_update(int val);

@ -266,8 +266,8 @@ typedef enum {
ICON_WINDOW_WINDOW, ICON_WINDOW_WINDOW,
ICON_PANEL_CLOSE, ICON_PANEL_CLOSE,
ICON_PHYSICS, ICON_PHYSICS,
ICON_BLANK36, ICON_LAYER_USED,
ICON_BLANK37, ICON_LAYER_ACTIVE,
ICON_BLANK38, ICON_BLANK38,
ICON_BLENDER, ICON_BLENDER,

@ -86,7 +86,8 @@ typedef struct View3D {
float winmat1[4][4]; // persp(1) storage, for swap matrices float winmat1[4][4]; // persp(1) storage, for swap matrices
float viewmat1[4][4]; float viewmat1[4][4];
float viewquat[4], dist, zfac, pad0; /* zfac is initgrabz() result */ float viewquat[4], dist, zfac; /* zfac is initgrabz() result */
int lay_used; /* used while drawing */
short persp; short persp;
short view; short view;

@ -33,12 +33,14 @@
#include "DNA_scene_types.h" /* for Base */ #include "DNA_scene_types.h" /* for Base */
#include "BKE_mesh.h" #include "BKE_mesh.h"
#include "BKE_image.h" // RFS: openanim
#include "BKE_library.h" #include "BKE_library.h"
#include "BKE_global.h" #include "BKE_global.h"
#include "BKE_main.h" #include "BKE_main.h"
#include "BKE_scene.h" #include "BKE_scene.h"
#include "BIF_editseq.h" /* get_last_seq */ #include "BIF_editseq.h" /* get_last_seq */
#include "BIF_editsound.h" // RFS: sound_open_hdaudio
#include "BLI_blenlib.h" #include "BLI_blenlib.h"
#include "BSE_sequence.h" #include "BSE_sequence.h"
#include "Ipo.h" #include "Ipo.h"
@ -48,6 +50,9 @@
#include "Sound.h" #include "Sound.h"
#include "gen_utils.h" #include "gen_utils.h"
#include "IMB_imbuf_types.h" // RFS: IB_rect
#include "IMB_imbuf.h" // RFS: IMB_anim_get_duration
enum seq_consts { enum seq_consts {
EXPP_SEQ_ATTR_TYPE = 0, EXPP_SEQ_ATTR_TYPE = 0,
EXPP_SEQ_ATTR_CHAN, EXPP_SEQ_ATTR_CHAN,
@ -145,7 +150,6 @@ static PyObject *NewSeq_internal(ListBase *seqbase, PyObject * args, Scene *sce)
seq->len = PyList_Size( list ); seq->len = PyList_Size( list );
/* strip and stripdata */ /* strip and stripdata */
seq->strip= strip= MEM_callocN(sizeof(Strip), "strip"); seq->strip= strip= MEM_callocN(sizeof(Strip), "strip");
strip->len= seq->len; strip->len= seq->len;
@ -185,12 +189,103 @@ static PyObject *NewSeq_internal(ListBase *seqbase, PyObject * args, Scene *sce)
strip->us= 1; strip->us= 1;
strip->stripdata= se= MEM_callocN(seq->len*sizeof(StripElem), "stripelem"); strip->stripdata= se= MEM_callocN(seq->len*sizeof(StripElem), "stripelem");
} else if (PyTuple_Check(py_data) && PyTuple_GET_SIZE(py_data) == 4) {
// MOVIE or AUDIO_HD
char *filename;
char *dir;
char *fullpath;
char *type;
int totframe;
if (!PyArg_ParseTuple( py_data, "ssss", &filename, &dir, &fullpath, &type )) {
BLI_remlink(seqbase, seq);
MEM_freeN(seq);
return EXPP_ReturnPyObjError( PyExc_ValueError,
"movie/audio hd data needs to be a tuple of a string and a list of images - (filename, dir, fullpath, type)" );
}
// RFS - Attempting to support Movie and Audio (HD) strips
#define RFS
#ifdef RFS
// Movie strips
if( strcmp( type, "movie" ) == 0 )
{
/* open it as an animation */
struct anim * an = openanim(fullpath, IB_rect);
if(an==0) {
BLI_remlink(seqbase, seq);
MEM_freeN(seq);
return EXPP_ReturnPyObjError( PyExc_ValueError,
"invalid movie strip" );
}
/* get the length in frames */
totframe = IMB_anim_get_duration( an );
/* set up sequence */
seq->type= SEQ_MOVIE;
seq->len= totframe;
seq->anim= an;
seq->anim_preseek = IMB_anim_get_preseek(an);
calc_sequence(seq);
/* strip and stripdata */
seq->strip= strip= MEM_callocN(sizeof(Strip), "strip");
strip->len= totframe;
strip->us= 1;
strncpy(strip->dir, dir, FILE_MAXDIR-1); // ????
strip->stripdata= se= MEM_callocN(sizeof(StripElem), "stripelem");
/* name movie in first strip */
strncpy(se->name, filename, FILE_MAXFILE-1); // ????
}
// Audio (HD) strips
if( strcmp( type, "audio_hd" ) == 0 )
{
struct hdaudio *hdaudio;
totframe= 0;
/* is it a sound file? */
hdaudio = sound_open_hdaudio( fullpath );
if(hdaudio==0) {
BLI_remlink(seqbase, seq);
MEM_freeN(seq);
return EXPP_ReturnPyObjError( PyExc_ValueError,
fullpath );
}
totframe= sound_hdaudio_get_duration(hdaudio, FPS);
/* set up sequence */
seq->type= SEQ_HD_SOUND;
seq->len= totframe;
seq->hdaudio= hdaudio;
calc_sequence(seq);
/* strip and stripdata - same as for MOVIE */
seq->strip= strip= MEM_callocN(sizeof(Strip), "strip");
strip->len= totframe;
strip->us= 1;
strncpy(strip->dir, dir, FILE_MAXDIR-1); // ????
strip->stripdata= se= MEM_callocN(sizeof(StripElem), "stripelem");
/* name movie in first strip */
strncpy(se->name, filename, FILE_MAXFILE-1); // ????
}
#endif
} else if (BPy_Sound_Check(py_data)) { } else if (BPy_Sound_Check(py_data)) {
/* sound */ /* RAM sound */
int totframe; int totframe;
bSound *sound = (( BPy_Sound * )py_data)->sound; bSound *sound = (( BPy_Sound * )py_data)->sound;
seq->type= SEQ_RAM_SOUND; seq->type= SEQ_RAM_SOUND;
seq->sound = sound; seq->sound = sound;
@ -198,7 +293,6 @@ static PyObject *NewSeq_internal(ListBase *seqbase, PyObject * args, Scene *sce)
sound->flags |= SOUND_FLAGS_SEQUENCE; sound->flags |= SOUND_FLAGS_SEQUENCE;
/* strip and stripdata */ /* strip and stripdata */
seq->strip= strip= MEM_callocN(sizeof(Strip), "strip"); seq->strip= strip= MEM_callocN(sizeof(Strip), "strip");
strip->len= totframe; strip->len= totframe;
@ -225,18 +319,7 @@ static PyObject *NewSeq_internal(ListBase *seqbase, PyObject * args, Scene *sce)
strip->len= seq->len; strip->len= seq->len;
strip->us= 1; strip->us= 1;
} else { } else {
/* movie, pydata is a path to a movie file */ // RFS: REMOVED MOVIE FROM HERE
char *name = PyString_AsString ( py_data );
if (!name) {
/* only free these 2 because other stuff isnt set */
BLI_remlink(seqbase, seq);
MEM_freeN(seq);
return EXPP_ReturnPyObjError( PyExc_TypeError,
"expects a string for chan/bone name and an int for the frame where to put the new key" );
}
seq->type= SEQ_MOVIE;
} }
strncpy(seq->name+2, "Untitled", 21); strncpy(seq->name+2, "Untitled", 21);
intern_pos_update(seq); intern_pos_update(seq);

@ -1766,7 +1766,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
psys->lattice=psys_get_lattice(ob,psys); psys->lattice=psys_get_lattice(ob,psys);
/* 3. start creating renderable things */ /* 3. start creating renderable things */
for(a=0,pa=pars; a<totpart+totchild; a++, pa++) { for(a=0,pa=pars; a<totpart+totchild; a++, pa++, seed++) {
random = rng_getFloat(rng); random = rng_getFloat(rng);
if(a<totpart){ if(a<totpart){

@ -2346,6 +2346,12 @@ static int is_rendering_allowed(Render *re)
if(re->osa==0) if(re->osa==0)
re->r.scemode &= ~R_FULL_SAMPLE; re->r.scemode &= ~R_FULL_SAMPLE;
/* no fullsample and edge */
if((re->r.scemode & R_FULL_SAMPLE) && (re->r.mode & R_EDGE)) {
re->error("Full Sample doesn't support Edge Enhance");
return 0;
}
} }
else else
re->r.scemode &= ~R_FULL_SAMPLE; /* clear to be sure */ re->r.scemode &= ~R_FULL_SAMPLE; /* clear to be sure */

@ -931,10 +931,15 @@ static void edge_enhance_add(RenderPart *pa, float *rectf, float *arect)
} }
} }
static void convert_to_key_alpha(RenderPart *pa, RenderLayer *rl)
static void convert_to_key_alpha(RenderPart *pa, float *rectf)
{ {
int y; RenderLayer *rlpp[RE_MAX_OSA];
int y, sample, totsample;
totsample= get_sample_layers(pa, rl, rlpp);
for(sample= 0; sample<totsample; sample++) {
float *rectf= rlpp[sample]->rectf;
for(y= pa->rectx*pa->recty; y>0; y--, rectf+=4) { for(y= pa->rectx*pa->recty; y>0; y--, rectf+=4) {
if(rectf[3] >= 1.0f); if(rectf[3] >= 1.0f);
@ -945,6 +950,7 @@ static void convert_to_key_alpha(RenderPart *pa, float *rectf)
} }
} }
} }
}
/* adds only alpha values */ /* adds only alpha values */
void edge_enhance_tile(RenderPart *pa, float *rectf, int *rectz) void edge_enhance_tile(RenderPart *pa, float *rectf, int *rectz)
@ -1229,7 +1235,7 @@ void zbufshadeDA_tile(RenderPart *pa)
/* de-premul alpha */ /* de-premul alpha */
if(R.r.alphamode & R_ALPHAKEY) if(R.r.alphamode & R_ALPHAKEY)
convert_to_key_alpha(pa, rl->rectf); convert_to_key_alpha(pa, rl);
/* free stuff within loop! */ /* free stuff within loop! */
MEM_freeN(pa->rectdaps); pa->rectdaps= NULL; MEM_freeN(pa->rectdaps); pa->rectdaps= NULL;
@ -1393,7 +1399,7 @@ void zbufshade_tile(RenderPart *pa)
/* de-premul alpha */ /* de-premul alpha */
if(R.r.alphamode & R_ALPHAKEY) if(R.r.alphamode & R_ALPHAKEY)
convert_to_key_alpha(pa, rl->rectf); convert_to_key_alpha(pa, rl);
if(edgerect) MEM_freeN(edgerect); if(edgerect) MEM_freeN(edgerect);
edgerect= NULL; edgerect= NULL;

File diff suppressed because it is too large Load Diff

@ -60,6 +60,7 @@
#include "BIF_gl.h" #include "BIF_gl.h"
#include "BIF_glutil.h" #include "BIF_glutil.h"
#include "BIF_butspace.h" #include "BIF_butspace.h"
#include "BIF_drawseq.h"
#include "BIF_graphics.h" #include "BIF_graphics.h"
#include "BIF_interface.h" #include "BIF_interface.h"
#include "BIF_mywindow.h" #include "BIF_mywindow.h"
@ -310,7 +311,7 @@ short draw_gpencil_panel (uiBlock *block, bGPdata *gpd, ScrArea *sa)
/* 'view align' button (naming depends on context) */ /* 'view align' button (naming depends on context) */
if (sa->spacetype == SPACE_VIEW3D) if (sa->spacetype == SPACE_VIEW3D)
uiDefButBitI(block, TOG, GP_DATA_VIEWALIGN, B_REDR, "Sketch in 3D", 170, 205, 150, 20, &gpd->flag, 0, 0, 0, 0, "New strokes are added in 3D-space"); uiDefButBitI(block, TOG, GP_DATA_VIEWALIGN, B_REDR, "Sketch in 3D", 170, 205, 150, 20, &gpd->flag, 0, 0, 0, 0, "New strokes are added in 3D-space");
else if (sa->spacetype != SPACE_SEQ) /* not available for sequencer yet */ else
uiDefButBitI(block, TOG, GP_DATA_VIEWALIGN, B_REDR, "Stick to View", 170, 205, 150, 20, &gpd->flag, 0, 0, 0, 0, "New strokes are added on 2d-canvas"); uiDefButBitI(block, TOG, GP_DATA_VIEWALIGN, B_REDR, "Stick to View", 170, 205, 150, 20, &gpd->flag, 0, 0, 0, 0, "New strokes are added on 2d-canvas");
} }
@ -411,8 +412,8 @@ static void gp_draw_stroke_point (bGPDspoint *points, short thickness, short sfl
co[1]= points->y; co[1]= points->y;
} }
else if (sflag & GP_STROKE_2DIMAGE) { else if (sflag & GP_STROKE_2DIMAGE) {
co[0]= points->x; co[0]= (points->x * winx) + offsx;
co[1]= points->y; co[1]= (points->y * winy) + offsy;
} }
else { else {
co[0]= (points->x / 1000 * winx); co[0]= (points->x / 1000 * winx);
@ -480,8 +481,12 @@ static void gp_draw_stroke_3d (bGPDspoint *points, int totpoints, short thicknes
static void gp_draw_stroke (bGPDspoint *points, int totpoints, short thickness, short dflag, short sflag, static void gp_draw_stroke (bGPDspoint *points, int totpoints, short thickness, short dflag, short sflag,
short debug, int offsx, int offsy, int winx, int winy) short debug, int offsx, int offsy, int winx, int winy)
{ {
/* if thickness is less than GP_DRAWTHICKNESS_SPECIAL, 'smooth' opengl lines look better */ /* if thickness is less than GP_DRAWTHICKNESS_SPECIAL, 'smooth' opengl lines look better
if ((thickness < GP_DRAWTHICKNESS_SPECIAL) || (dflag & GP_DRAWDATA_ONLYI2D)) { * - but NOT if Image Editor 'image-based' stroke
*/
if ( (thickness < GP_DRAWTHICKNESS_SPECIAL) ||
((curarea->spacetype==SPACE_IMAGE) && (dflag & GP_DRAWDATA_ONLYV2D)) )
{
bGPDspoint *pt; bGPDspoint *pt;
int i; int i;
@ -491,8 +496,8 @@ static void gp_draw_stroke (bGPDspoint *points, int totpoints, short thickness,
glVertex2f(pt->x, pt->y); glVertex2f(pt->x, pt->y);
} }
else if (sflag & GP_STROKE_2DIMAGE) { else if (sflag & GP_STROKE_2DIMAGE) {
const float x= pt->x; const float x= (pt->x * winx) + offsx;
const float y= pt->y; const float y= (pt->y * winy) + offsy;
glVertex2f(x, y); glVertex2f(x, y);
} }
@ -505,7 +510,10 @@ static void gp_draw_stroke (bGPDspoint *points, int totpoints, short thickness,
} }
glEnd(); glEnd();
} }
else { /* tesselation code: currently only enabled with rt != 0 */
/* tesselation code: currently only enabled with rt != 0 */
else
{
bGPDspoint *pt1, *pt2; bGPDspoint *pt1, *pt2;
float pm[2]; float pm[2];
int i; int i;
@ -526,8 +534,10 @@ static void gp_draw_stroke (bGPDspoint *points, int totpoints, short thickness,
s1[0]= pt2->x; s1[1]= pt2->y; s1[0]= pt2->x; s1[1]= pt2->y;
} }
else if (sflag & GP_STROKE_2DIMAGE) { else if (sflag & GP_STROKE_2DIMAGE) {
s0[0]= pt1->x; s0[1]= pt1->y; s0[0]= (pt1->x * winx) + offsx;
s1[0]= pt2->x; s1[1]= pt2->y; s0[1]= (pt1->y * winy) + offsy;
s1[0]= (pt2->x * winx) + offsx;
s1[1]= (pt2->y * winy) + offsy;
} }
else { else {
s0[0]= (pt1->x / 1000 * winx); s0[0]= (pt1->x / 1000 * winx);
@ -672,9 +682,8 @@ static void gp_draw_stroke (bGPDspoint *points, int totpoints, short thickness,
glVertex2f(pt->x, pt->y); glVertex2f(pt->x, pt->y);
} }
else if (sflag & GP_STROKE_2DIMAGE) { else if (sflag & GP_STROKE_2DIMAGE) {
// fixme const float x= (pt->x * winx) + offsx;
const float x= pt->x; const float y= (pt->y * winy) + offsy;
const float y= pt->y;
glVertex2f(x, y); glVertex2f(x, y);
} }
@ -889,7 +898,7 @@ void draw_gpencil_2dimage (ScrArea *sa, ImBuf *ibuf)
{ {
bGPdata *gpd; bGPdata *gpd;
int offsx, offsy, sizex, sizey; int offsx, offsy, sizex, sizey;
int dflag = 0; int dflag = GP_DRAWDATA_NOSTATUS;
/* check that we have grease-pencil stuff to draw */ /* check that we have grease-pencil stuff to draw */
if (ELEM(NULL, sa, ibuf)) return; if (ELEM(NULL, sa, ibuf)) return;
@ -902,13 +911,39 @@ void draw_gpencil_2dimage (ScrArea *sa, ImBuf *ibuf)
{ {
SpaceImage *sima= (SpaceImage *)sa->spacedata.first; SpaceImage *sima= (SpaceImage *)sa->spacedata.first;
// fixme... are these settings still needed? /* just draw using standard scaling (settings here are currently ignored anyways) */
// FIXME: the opengl poly-strokes don't draw at right thickness when done this way, so disabled
offsx= 0; offsx= 0;
offsy= 0; offsy= 0;
sizex= sa->winx; sizex= sa->winx;
sizey= sa->winy; sizey= sa->winy;
myortho2(sima->v2d.cur.xmin, sima->v2d.cur.xmax, sima->v2d.cur.ymin, sima->v2d.cur.ymax); myortho2(sima->v2d.cur.xmin, sima->v2d.cur.xmax, sima->v2d.cur.ymin, sima->v2d.cur.ymax);
dflag |= GP_DRAWDATA_ONLYV2D;
}
break;
case SPACE_SEQ: /* sequence */
{
SpaceSeq *sseq= (SpaceSeq *)sa->spacedata.first;
float zoom, zoomx, zoomy;
/* calculate accessory values */
zoom= SEQ_ZOOM_FAC(sseq->zoom);
if (sseq->mainb == SEQ_DRAW_IMG_IMBUF) {
zoomx = zoom * ((float)G.scene->r.xasp / (float)G.scene->r.yasp);
zoomy = zoom;
}
else
zoomx = zoomy = zoom;
sizex= zoomx * ibuf->x;
sizey= zoomy * ibuf->y;
offsx= (sa->winx-sizex)/2 + sseq->xof;
offsy= (sa->winy-sizey)/2 + sseq->yof;
dflag |= GP_DRAWDATA_ONLYI2D;
} }
break; break;
@ -917,12 +952,13 @@ void draw_gpencil_2dimage (ScrArea *sa, ImBuf *ibuf)
offsy= 0; offsy= 0;
sizex= sa->winx; sizex= sa->winx;
sizey= sa->winy; sizey= sa->winy;
dflag |= GP_DRAWDATA_ONLYI2D;
break; break;
} }
/* draw it! */ /* draw it! */
dflag = (GP_DRAWDATA_ONLYI2D|GP_DRAWDATA_NOSTATUS);
gp_draw_data(gpd, offsx, offsy, sizex, sizey, dflag); gp_draw_data(gpd, offsx, offsy, sizex, sizey, dflag);
} }

@ -923,16 +923,10 @@ static void draw_image_seq(ScrArea *sa)
if(ibuf->rect_float && ibuf->rect==NULL) if(ibuf->rect_float && ibuf->rect==NULL)
IMB_rect_from_float(ibuf); IMB_rect_from_float(ibuf);
if (sseq->zoom > 0) {
zoom = sseq->zoom;
} else if (sseq->zoom == 0) {
zoom = 1.0;
} else {
zoom = -1.0/sseq->zoom;
}
/* needed for gla draw */ /* needed for gla draw */
glaDefine2DArea(&curarea->winrct); glaDefine2DArea(&curarea->winrct);
zoom= SEQ_ZOOM_FAC(sseq->zoom);
if (sseq->mainb == SEQ_DRAW_IMG_IMBUF) { if (sseq->mainb == SEQ_DRAW_IMG_IMBUF) {
zoomx = zoom * ((float)G.scene->r.xasp / (float)G.scene->r.yasp); zoomx = zoom * ((float)G.scene->r.xasp / (float)G.scene->r.yasp);
zoomy = zoom; zoomy = zoom;
@ -977,6 +971,9 @@ static void draw_image_seq(ScrArea *sa)
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
} }
/* draw grease-pencil (image aligned) */
if (sseq->flag & SEQ_DRAW_GPENCIL)
draw_gpencil_2dimage(sa, ibuf);
if (free_ibuf) { if (free_ibuf) {
IMB_freeImBuf(ibuf); IMB_freeImBuf(ibuf);

@ -3024,8 +3024,11 @@ void drawview3dspace(ScrArea *sa, void *spacedata)
object_handle_update(base->object); // bke_object.h object_handle_update(base->object); // bke_object.h
} }
for(base= G.scene->base.first; base; base= base->next) v3d->lay_used = 0;
for(base= G.scene->base.first; base; base= base->next) {
object_handle_update(base->object); // bke_object.h object_handle_update(base->object); // bke_object.h
v3d->lay_used |= base->lay;
}
/* shadow buffers, before we setup matrices */ /* shadow buffers, before we setup matrices */
if(draw_glsl_material(NULL, v3d->drawtype)) if(draw_glsl_material(NULL, v3d->drawtype))

@ -67,6 +67,7 @@
#include "BIF_gl.h" #include "BIF_gl.h"
#include "BIF_glutil.h" #include "BIF_glutil.h"
#include "BIF_butspace.h" #include "BIF_butspace.h"
#include "BIF_drawseq.h"
#include "BIF_editarmature.h" #include "BIF_editarmature.h"
#include "BIF_editview.h" #include "BIF_editview.h"
#include "BIF_graphics.h" #include "BIF_graphics.h"
@ -694,7 +695,6 @@ static void gp_strokepoint_convertcoords (bGPDstroke *gps, bGPDspoint *pt, float
{ {
if (gps->flag & GP_STROKE_3DSPACE) { if (gps->flag & GP_STROKE_3DSPACE) {
/* directly use 3d-coordinates */ /* directly use 3d-coordinates */
// FIXME: maybe we need to counterotate this for object rotation?
VecCopyf(p3d, &pt->x); VecCopyf(p3d, &pt->x);
} }
else { else {
@ -1246,17 +1246,45 @@ static void gp_stroke_convertcoords (tGPsdata *p, short mval[], float out[])
out[1]= y; out[1]= y;
} }
/* 2d - on image 'canvas' (asume that p->v2d is set) */ /* 2d - on image 'canvas' (assume that p->v2d is set) */
else if ( (gpd->sbuffer_sflag & GP_STROKE_2DIMAGE) && else if ( (gpd->sbuffer_sflag & GP_STROKE_2DIMAGE) && (p->v2d) )
(p->v2d) && (p->ibuf) )
{ {
float x, y; /* for now - space specific */
switch (p->sa->spacetype) {
case SPACE_SEQ: /* sequencer */
{
SpaceSeq *sseq= (SpaceSeq *)p->sa->spacedata.first;
int sizex, sizey, offsx, offsy, rectx, recty;
float zoom, zoomx, zoomy;
/* convert to 'canvas' coordinates (not need to adjust to canvas) */ /* calculate zoom factor */
areamouseco_to_ipoco(p->v2d, mval, &x, &y); zoom= SEQ_ZOOM_FAC(sseq->zoom);
if (sseq->mainb == SEQ_DRAW_IMG_IMBUF) {
zoomx = zoom * ((float)G.scene->r.xasp / (float)G.scene->r.yasp);
zoomy = zoom;
}
else
zoomx = zoomy = zoom;
out[0]= x; /* calculate rect size */
out[1]= y; rectx= (G.scene->r.size*G.scene->r.xsch)/100;
recty= (G.scene->r.size*G.scene->r.ysch)/100;
sizex= zoomx * rectx;
sizey= zoomy * recty;
offsx= (p->sa->winx-sizex)/2 + sseq->xof;
offsy= (p->sa->winy-sizey)/2 + sseq->yof;
/* calculate new points */
out[0]= (float)(mval[0] - offsx) / (float)sizex;
out[1]= (float)(mval[1] - offsy) / (float)sizey;
}
break;
default: /* just use raw mouse coordinates - BAD! */
out[0]= mval[0];
out[1]= mval[1];
break;
}
} }
/* 2d - relative to screen (viewport area) */ /* 2d - relative to screen (viewport area) */
@ -1487,6 +1515,11 @@ static void gp_stroke_eraser_dostroke (tGPsdata *p, short mval[], short mvalo[],
x0= xyval[0]; x0= xyval[0];
y0= xyval[1]; y0= xyval[1];
} }
else if (gps->flag & GP_STROKE_2DIMAGE) {
ipoco_to_areaco_noclip(p->v2d, &gps->points->x, xyval);
x0= xyval[0];
y0= xyval[1];
}
else { else {
x0= (gps->points->x / 1000 * p->sa->winx); x0= (gps->points->x / 1000 * p->sa->winx);
y0= (gps->points->y / 1000 * p->sa->winy); y0= (gps->points->y / 1000 * p->sa->winy);
@ -1530,6 +1563,15 @@ static void gp_stroke_eraser_dostroke (tGPsdata *p, short mval[], short mvalo[],
x1= xyval[0]; x1= xyval[0];
y1= xyval[1]; y1= xyval[1];
} }
else if (gps->flag & GP_STROKE_2DIMAGE) {
ipoco_to_areaco_noclip(p->v2d, &pt1->x, xyval);
x0= xyval[0];
y0= xyval[1];
ipoco_to_areaco_noclip(p->v2d, &pt2->x, xyval);
x1= xyval[0];
y1= xyval[1];
}
else { else {
x0= (pt1->x / 1000 * p->sa->winx); x0= (pt1->x / 1000 * p->sa->winx);
y0= (pt1->y / 1000 * p->sa->winy); y0= (pt1->y / 1000 * p->sa->winy);
@ -1553,8 +1595,6 @@ static void gp_stroke_eraser_dostroke (tGPsdata *p, short mval[], short mvalo[],
} }
} }
/* -------- */
/* erase strokes which fall under the eraser strokes */ /* erase strokes which fall under the eraser strokes */
static void gp_stroke_doeraser (tGPsdata *p) static void gp_stroke_doeraser (tGPsdata *p)
{ {
@ -1626,14 +1666,14 @@ static void gp_paint_initstroke (tGPsdata *p, short paintmode)
case SPACE_SEQ: case SPACE_SEQ:
{ {
/* for now, this is not applicable here... */ /* for now, this is not applicable here... */
//p->gpd->sbuffer_sflag |= GP_STROKE_2DIMAGE; p->gpd->sbuffer_sflag |= GP_STROKE_2DIMAGE;
} }
break; break;
case SPACE_IMAGE: case SPACE_IMAGE:
{ {
/* check if any ibuf available */ /* check if any ibuf available */
if (p->ibuf) if (p->ibuf)
p->gpd->sbuffer_sflag |= GP_STROKE_2DIMAGE; p->gpd->sbuffer_sflag |= GP_STROKE_2DSPACE;
} }
break; break;
} }

@ -602,11 +602,11 @@ static uiBlock *node_nodemenu(void *arg_unused)
if(snode->treetype==NTREE_COMPOSIT) { if(snode->treetype==NTREE_COMPOSIT) {
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Execute Composite|E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Execute Composite|E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Read Saved Render Results|R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Read Saved Render Results|R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Read Saved Full Sample Results|R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Read Saved Full Sample Results|Shift R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Connect Node to Viewer|Ctrl LMB", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, ""); uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Connect Node to Viewer|Ctrl RMB", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
} }

@ -5567,6 +5567,16 @@ static void view3d_header_pulldowns(uiBlock *block, short *xcoord)
*xcoord= xco; *xcoord= xco;
} }
static int view3d_layer_icon(int but_lay, int ob_lay, int used_lay)
{
if (but_lay & ob_lay)
return ICON_LAYER_ACTIVE;
else if (but_lay & used_lay)
return ICON_LAYER_USED;
else
return ICON_BLANK1;
}
void view3d_buttons(void) void view3d_buttons(void)
{ {
uiBlock *block; uiBlock *block;
@ -5733,19 +5743,22 @@ void view3d_buttons(void)
/* LAYERS */ /* LAYERS */
if(G.obedit==NULL && G.vd->localview==0) { if(G.obedit==NULL && G.vd->localview==0) {
int ob_lay = ob ? ob->lay : 0;
uiBlockBeginAlign(block); uiBlockBeginAlign(block);
for(a=0; a<5; a++) for(a=0; a<5; a++) {
uiDefButBitI(block, TOG, 1<<a, B_LAY+a, "", (short)(xco+a*(XIC/2)), (short)(YIC/2),(short)(XIC/2),(short)(YIC/2), &(G.vd->lay), 0, 0, 0, 0, "Toggles Layer visibility (Num, Shift Num)"); uiDefIconButBitI(block, TOG, 1<<a, B_LAY+a, view3d_layer_icon(1<<a, ob_lay, G.vd->lay_used), (short)(xco+a*(XIC/2)), (short)(YIC/2),(short)(XIC/2),(short)(YIC/2), &(G.vd->lay), 0, 0, 0, 0, "Toggles Layer visibility (Alt Num, Alt Shift Num)");
for(a=0; a<5; a++) }
uiDefButBitI(block, TOG, 1<<(a+10), B_LAY+10+a, "",(short)(xco+a*(XIC/2)), 0, XIC/2, (YIC)/2, &(G.vd->lay), 0, 0, 0, 0, "Toggles Layer visibility (Alt Num, Alt Shift Num)"); for(a=0; a<5; a++) {
uiDefIconButBitI(block, TOG, 1<<(a+10), B_LAY+10+a, view3d_layer_icon(1<<(a+10), ob_lay, G.vd->lay_used), (short)(xco+a*(XIC/2)), 0, XIC/2, (YIC)/2, &(G.vd->lay), 0, 0, 0, 0, "Toggles Layer visibility (Alt Num, Alt Shift Num)");
}
xco+= 5; xco+= 5;
uiBlockBeginAlign(block); uiBlockBeginAlign(block);
for(a=5; a<10; a++) for(a=5; a<10; a++) {
uiDefButBitI(block, TOG, 1<<a, B_LAY+a, "", (short)(xco+a*(XIC/2)), (short)(YIC/2),(short)(XIC/2),(short)(YIC/2), &(G.vd->lay), 0, 0, 0, 0, "Toggles Layer visibility (Num, Shift Num)"); uiDefIconButBitI(block, TOG, 1<<a, B_LAY+a, view3d_layer_icon(1<<a, ob_lay, G.vd->lay_used), (short)(xco+a*(XIC/2)), (short)(YIC/2),(short)(XIC/2),(short)(YIC/2), &(G.vd->lay), 0, 0, 0, 0, "Toggles Layer visibility (Alt Num, Alt Shift Num)");
for(a=5; a<10; a++) }
uiDefButBitI(block, TOG, 1<<(a+10), B_LAY+10+a, "",(short)(xco+a*(XIC/2)), 0, XIC/2, (YIC)/2, &(G.vd->lay), 0, 0, 0, 0, "Toggles Layer visibility (Alt Num, Alt Shift Num)"); for(a=5; a<10; a++) {
uiDefIconButBitI(block, TOG, 1<<(a+10), B_LAY+10+a, view3d_layer_icon(1<<(a+10), ob_lay, G.vd->lay_used), (short)(xco+a*(XIC/2)), 0, XIC/2, (YIC)/2, &(G.vd->lay), 0, 0, 0, 0, "Toggles Layer visibility (Alt Num, Alt Shift Num)");
}
uiBlockEndAlign(block); uiBlockEndAlign(block);
xco+= (a-2)*(XIC/2)+3; xco+= (a-2)*(XIC/2)+3;

@ -2144,7 +2144,6 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
gameobj->NodeUpdateGS(0,true); gameobj->NodeUpdateGS(0,true);
gameobj->AddMeshUser(); gameobj->AddMeshUser();
} }
else else
{ {
@ -2209,6 +2208,41 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
{ {
struct Object* blenderchild = pcit->m_blenderchild; struct Object* blenderchild = pcit->m_blenderchild;
struct Object* blenderparent = blenderchild->parent;
KX_GameObject* parentobj = converter->FindGameObject(blenderparent);
KX_GameObject* childobj = converter->FindGameObject(blenderchild);
assert(childobj);
if (!parentobj || objectlist->SearchValue(childobj) != objectlist->SearchValue(parentobj))
{
// special case: the parent and child object are not in the same layer.
// This weird situation is used in Apricot for test purposes.
// Resolve it by not converting the child
childobj->GetSGNode()->DisconnectFromParent();
delete pcit->m_gamechildnode;
// Now destroy the child object but also all its descendent that may already be linked
// Remove the child reference in the local list!
// Note: there may be descendents already if the children of the child were processed
// by this loop before the child. In that case, we must remove the children also
CListValue* childrenlist = (CListValue*)childobj->PyGetChildrenRecursive(childobj);
childrenlist->Add(childobj->AddRef());
for ( i=0;i<childrenlist->GetCount();i++)
{
KX_GameObject* obj = static_cast<KX_GameObject*>(childrenlist->GetValue(i));
if (templist->RemoveValue(obj))
obj->Release();
if (sumolist->RemoveValue(obj))
obj->Release();
if (logicbrick_conversionlist->RemoveValue(obj))
obj->Release();
}
childrenlist->Release();
// now destroy recursively
kxscene->RemoveObject(childobj);
continue;
}
switch (blenderchild->partype) switch (blenderchild->partype)
{ {
case PARVERT1: case PARVERT1:
@ -2248,13 +2282,8 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
break; break;
} }
struct Object* blenderparent = blenderchild->parent;
KX_GameObject* parentobj = converter->FindGameObject(blenderparent);
if (parentobj)
{
parentobj-> GetSGNode()->AddChild(pcit->m_gamechildnode); parentobj-> GetSGNode()->AddChild(pcit->m_gamechildnode);
} }
}
vec_parent_child.clear(); vec_parent_child.clear();
// find 'root' parents (object that has not parents in SceneGraph) // find 'root' parents (object that has not parents in SceneGraph)

@ -501,7 +501,17 @@ void KX_BlenderSceneConverter::RegisterGameObject(
void KX_BlenderSceneConverter::UnregisterGameObject( void KX_BlenderSceneConverter::UnregisterGameObject(
KX_GameObject *gameobject) KX_GameObject *gameobject)
{ {
m_map_gameobject_to_blender.remove(CHashedPtr(gameobject)); CHashedPtr gptr(gameobject);
struct Object **bobp= m_map_gameobject_to_blender[gptr];
if (bobp) {
CHashedPtr bptr(*bobp);
KX_GameObject **gobp= m_map_blender_to_gameobject[bptr];
if (gobp && *gobp == gameobject)
// also maintain m_map_blender_to_gameobject if the gameobject
// being removed is matching the blender object
m_map_blender_to_gameobject.remove(bptr);
m_map_gameobject_to_blender.remove(gptr);
}
} }

@ -696,7 +696,7 @@ static PyObject* gPySetGLSLMaterialSetting(PyObject*,
char *setting; char *setting;
int enable, flag; int enable, flag;
if (PyArg_ParseTuple(args,"si",&setting,&enable)) if (!PyArg_ParseTuple(args,"si",&setting,&enable))
return NULL; return NULL;
flag = getGLSLSettingFlag(setting); flag = getGLSLSettingFlag(setting);