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

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndre Susano Pinto <andresusanopinto@gmail.com>2008-08-22 19:40:41 +0400
committerAndre Susano Pinto <andresusanopinto@gmail.com>2008-08-22 19:40:41 +0400
commit039ed9cb7f3edd2cae640065979aed4a7eb31103 (patch)
tree96c9cedda691cc5af747d6509a40f854a426a244
parentf4ae23f3794605f5b7c0a5b90d982d6dfd20d492 (diff)
svn merge -r 16215:16231 https://svn.blender.org/svnroot/bf-blender/trunk/blender
-rw-r--r--projectfiles_vc7/blender/blenkernel/BKE_blenkernel.vcproj6
-rw-r--r--release/text/copyright.txt2
-rw-r--r--source/blender/blenkernel/BKE_deform.h1
-rw-r--r--source/blender/blenkernel/intern/modifier.c5
-rw-r--r--source/blender/blenkernel/intern/shrinkwrap.c15
-rw-r--r--source/blender/blenlib/BLI_winstuff.h8
-rw-r--r--source/blender/include/BDR_gpencil.h1
-rw-r--r--source/blender/include/BIF_drawgpencil.h5
-rw-r--r--source/blender/makesdna/DNA_gpencil_types.h4
-rw-r--r--source/blender/makesdna/DNA_space_types.h1
-rw-r--r--source/blender/python/api2_2x/Particle.c6
-rw-r--r--source/blender/src/drawgpencil.c208
-rw-r--r--source/blender/src/gpencil.c60
-rw-r--r--source/gameengine/Converter/KX_ConvertActuators.cpp8
-rw-r--r--source/gameengine/Ketsji/KX_PythonInit.cpp133
-rw-r--r--source/gameengine/Physics/Bullet/CMakeLists.txt4
-rw-r--r--source/gameengine/PyDoc/GameLogic.py13
17 files changed, 305 insertions, 175 deletions
diff --git a/projectfiles_vc7/blender/blenkernel/BKE_blenkernel.vcproj b/projectfiles_vc7/blender/blenkernel/BKE_blenkernel.vcproj
index 0ea3503a289..42dcc843091 100644
--- a/projectfiles_vc7/blender/blenkernel/BKE_blenkernel.vcproj
+++ b/projectfiles_vc7/blender/blenkernel/BKE_blenkernel.vcproj
@@ -495,6 +495,9 @@
RelativePath="..\..\..\source\blender\blenkernel\intern\script.c">
</File>
<File
+ RelativePath="..\..\..\source\blender\blenkernel\intern\shrinkwrap.c">
+ </File>
+ <File
RelativePath="..\..\..\source\blender\blenkernel\intern\softbody.c">
</File>
<File
@@ -709,6 +712,9 @@
RelativePath="..\..\..\source\blender\blenkernel\BKE_script.h">
</File>
<File
+ RelativePath="..\..\..\source\blender\blenkernel\BKE_shrinkwrap.h">
+ </File>
+ <File
RelativePath="..\..\..\source\blender\blenkernel\BKE_softbody.h">
</File>
<File
diff --git a/release/text/copyright.txt b/release/text/copyright.txt
index 6082af3033f..9f49dd4587a 100644
--- a/release/text/copyright.txt
+++ b/release/text/copyright.txt
@@ -56,7 +56,7 @@
information, claims of third parties, damages as a result of injury to
any person, or any other loss) arising out of or in connection with the
license granted under this License Agreement or the use of or inability
- to use the Software, even if VF has been advised of the possibility of
+ to use the Software, even if BF has been advised of the possibility of
such damages.
5. User warning and indemnification
diff --git a/source/blender/blenkernel/BKE_deform.h b/source/blender/blenkernel/BKE_deform.h
index 73a9b2b5d4e..e982806a6cc 100644
--- a/source/blender/blenkernel/BKE_deform.h
+++ b/source/blender/blenkernel/BKE_deform.h
@@ -38,6 +38,7 @@
struct Object;
struct ListBase;
struct bDeformGroup;
+struct MDeformVert;
void copy_defgroups (struct ListBase *lb1, struct ListBase *lb2);
struct bDeformGroup *copy_defgroup (struct bDeformGroup *ingroup);
diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c
index f33f33d9d46..e8453ef934c 100644
--- a/source/blender/blenkernel/intern/modifier.c
+++ b/source/blender/blenkernel/intern/modifier.c
@@ -3,7 +3,7 @@
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
-* This program is free software; you can redistribute it and/orw
+* 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.
@@ -7405,7 +7405,6 @@ static void simpledeformModifier_updateDepgraph(ModifierData *md, DagForest *for
dag_add_relation(forest, dag_get_node(forest, smd->origin), obNode, DAG_RL_OB_DATA, "SimpleDeform Modifier");
}
-
/***/
static ModifierTypeInfo typeArr[NUM_MODIFIER_TYPES];
@@ -7733,7 +7732,6 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
| eModifierTypeFlag_AcceptsCVs
| eModifierTypeFlag_SupportsEditmode
| eModifierTypeFlag_EnableInEditmode;
-
mti->initData = shrinkwrapModifier_initData;
mti->copyData = shrinkwrapModifier_copyData;
mti->requiredDataMask = shrinkwrapModifier_requiredDataMask;
@@ -7757,7 +7755,6 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
mti->foreachObjectLink = simpledeformModifier_foreachObjectLink;
mti->updateDepgraph = simpledeformModifier_updateDepgraph;
-
typeArrInit = 0;
#undef INIT_TYPE
}
diff --git a/source/blender/blenkernel/intern/shrinkwrap.c b/source/blender/blenkernel/intern/shrinkwrap.c
index 5c020bf2339..292a800e9cd 100644
--- a/source/blender/blenkernel/intern/shrinkwrap.c
+++ b/source/blender/blenkernel/intern/shrinkwrap.c
@@ -63,7 +63,7 @@
#define OUT_OF_MEMORY() ((void)printf("Shrinkwrap: Out of memory\n"))
/* Benchmark macros */
-#ifndef _WIN32
+#if !defined(_WIN32) && 0
#include <sys/time.h>
@@ -166,11 +166,6 @@ void shrinkwrapModifier_deform(ShrinkwrapModifierData *smd, Object *ob, DerivedM
//TODO currently we need a copy in case object_get_derived_final returns an emDM that does not defines getVertArray or getFace array
calc.target = CDDM_copy( object_get_derived_final(smd->target, CD_MASK_BAREMESH) );
- if(!calc.target)
- {
- printf("Target derived mesh is null! :S\n");
- }
-
//TODO there might be several "bugs" on non-uniform scales matrixs.. because it will no longer be nearest surface, not sphere projection
//because space has been deformed
space_transform_setup(&calc.local2target, ob, smd->target);
@@ -182,12 +177,6 @@ void shrinkwrapModifier_deform(ShrinkwrapModifierData *smd, Object *ob, DerivedM
//Projecting target defined - lets work!
if(calc.target)
{
-
- printf("Shrinkwrap (%s)%d over (%s)%d\n",
- calc.ob->id.name, calc.numVerts,
- calc.smd->target->id.name, calc.target->getNumVerts(calc.target)
- );
-
switch(smd->shrinkType)
{
case MOD_SHRINKWRAP_NEAREST_SURFACE:
@@ -447,7 +436,7 @@ do
{
float *co = calc->vertexCos[i];
float tmp_co[3], tmp_no[3];
- float lim = 1000; //TODO: we should use FLT_MAX here, but sweepsphere code isnt prepared for that
+ float lim = 10000.0f; //TODO: we should use FLT_MAX here, but sweepsphere code isnt prepared for that
float weight = vertexgroup_get_vertex_weight(dvert, i, vgroup);
if(weight == 0.0f) continue;
diff --git a/source/blender/blenlib/BLI_winstuff.h b/source/blender/blenlib/BLI_winstuff.h
index 11150075bac..3bb63506c95 100644
--- a/source/blender/blenlib/BLI_winstuff.h
+++ b/source/blender/blenlib/BLI_winstuff.h
@@ -61,6 +61,10 @@
// These definitions are also in arithb for simplicity
+#ifdef __cplusplus
+extern "C" {
+#endif
+
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
@@ -116,5 +120,9 @@ int closedir (DIR *dp);
void get_default_root(char *root);
int check_file_chars(char *filename);
+#ifdef __cplusplus
+}
+#endif
+
#endif /* __WINSTUFF_H__ */
diff --git a/source/blender/include/BDR_gpencil.h b/source/blender/include/BDR_gpencil.h
index eb749cf28ec..7340a2e44e0 100644
--- a/source/blender/include/BDR_gpencil.h
+++ b/source/blender/include/BDR_gpencil.h
@@ -43,7 +43,6 @@ struct bGPDframe;
/* Temporary 'Stroke Point' data */
typedef struct tGPspoint {
short x, y; /* x and y coordinates of cursor (in relative to area) */
- float xf, yf; /* same as x and y, but as floats */
float pressure; /* pressure of tablet at this point */
} tGPspoint;
diff --git a/source/blender/include/BIF_drawgpencil.h b/source/blender/include/BIF_drawgpencil.h
index 418446313df..eacafce058d 100644
--- a/source/blender/include/BIF_drawgpencil.h
+++ b/source/blender/include/BIF_drawgpencil.h
@@ -28,15 +28,18 @@
#ifndef BIF_DRAWGPENCIL_H
#define BIF_DRAWGPENCIL_H
+
+struct bGPdata;
struct ScrArea;
struct View3D;
struct SpaceNode;
struct SpaceSeq;
-struct bGPdata;
struct uiBlock;
+struct ImBuf;
short draw_gpencil_panel(struct uiBlock *block, struct bGPdata *gpd, struct ScrArea *sa);
+void draw_gpencil_2dimage(struct ScrArea *sa, struct ImBuf *ibuf);
void draw_gpencil_2dview(struct ScrArea *sa, short onlyv2d);
void draw_gpencil_3dview(struct ScrArea *sa, short only3d);
void draw_gpencil_oglrender(struct View3D *v3d, int winx, int winy);
diff --git a/source/blender/makesdna/DNA_gpencil_types.h b/source/blender/makesdna/DNA_gpencil_types.h
index dca4e28688d..13d412c2c42 100644
--- a/source/blender/makesdna/DNA_gpencil_types.h
+++ b/source/blender/makesdna/DNA_gpencil_types.h
@@ -59,8 +59,10 @@ typedef struct bGPDstroke {
#define GP_STROKE_3DSPACE (1<<0)
/* stroke is in 2d-space */
#define GP_STROKE_2DSPACE (1<<1)
+ /* stroke is in 2d-space (but with special 'image' scaling) */
+#define GP_STROKE_2DIMAGE (1<<2)
/* stroke is an "eraser" stroke */
-#define GP_STROKE_ERASER (1<<2)
+#define GP_STROKE_ERASER (1<<15)
/* Grease-Pencil Annotations - 'Frame'
diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h
index a8694dfb7f5..39d457058c1 100644
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@ -247,6 +247,7 @@ typedef struct SpaceImage {
float xof, yof; /* user defined offset, image is centered */
float centx, centy; /* storage for offset while render drawing */
+ struct bGPdata *gpd; /* grease pencil data */
} SpaceImage;
typedef struct SpaceNla {
diff --git a/source/blender/python/api2_2x/Particle.c b/source/blender/python/api2_2x/Particle.c
index 2c2e724129e..bc65426e16c 100644
--- a/source/blender/python/api2_2x/Particle.c
+++ b/source/blender/python/api2_2x/Particle.c
@@ -804,7 +804,7 @@ static PyObject *Part_GetLoc( BPy_PartSys * self, PyObject * args )
{
ParticleSystem *psys = 0L;
Object *ob = 0L;
- PyObject *partlist,*seglist;
+ PyObject *partlist,*seglist=0L;
ParticleCacheKey **cache,*path;
PyObject* loc = 0L;
ParticleKey state;
@@ -1107,7 +1107,7 @@ static PyObject *Part_GetSize( BPy_PartSys * self, PyObject * args )
ParticleSystem *psys = 0L;
ParticleData *data;
Object *ob = 0L;
- PyObject *partlist,*tuple;
+ PyObject *partlist,*tuple=0L;
DerivedMesh* dm;
float vm[4][4],wm[4][4];
float size;
@@ -1217,7 +1217,7 @@ static PyObject *Part_GetAge( BPy_PartSys * self, PyObject * args )
ParticleSystem *psys = 0L;
ParticleData *data;
Object *ob = 0L;
- PyObject *partlist,*tuple;
+ PyObject *partlist,*tuple=0L;
DerivedMesh* dm;
float vm[4][4],wm[4][4];
float life;
diff --git a/source/blender/src/drawgpencil.c b/source/blender/src/drawgpencil.c
index ee28049e2c0..f60d53a9c5d 100644
--- a/source/blender/src/drawgpencil.c
+++ b/source/blender/src/drawgpencil.c
@@ -37,6 +37,9 @@
#include "MEM_guardedalloc.h"
+#include "IMB_imbuf.h"
+#include "IMB_imbuf_types.h"
+
#include "BMF_Api.h"
#include "BLI_arithb.h"
@@ -317,6 +320,7 @@ enum {
GP_DRAWDATA_NOSTATUS = (1<<0), /* don't draw status info */
GP_DRAWDATA_ONLY3D = (1<<1), /* only draw 3d-strokes */
GP_DRAWDATA_ONLYV2D = (1<<2), /* only draw 'canvas' strokes */
+ GP_DRAWDATA_ONLYI2D = (1<<3), /* only draw 'image' strokes */
};
/* ----- Tool Buffer Drawing ------ */
@@ -446,7 +450,7 @@ 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, short debug, int winx, int winy)
{
/* if thickness is less than 3, 'smooth' opengl lines look better */
- if ((thickness < 3) || (G.rt==0)) {
+ if (thickness < 3) {
bGPDspoint *pt;
int i;
@@ -466,18 +470,18 @@ static void gp_draw_stroke (bGPDspoint *points, int totpoints, short thickness,
}
else { /* tesselation code: currently only enabled with rt != 0 */
bGPDspoint *pt1, *pt2;
- float p0[2], p1[2], pm[2];
+ float pm[2];
int i;
glShadeModel(GL_FLAT);
- glBegin(GL_QUAD_STRIP);
+ glBegin(GL_QUADS);
for (i=0, pt1=points, pt2=points+1; i < (totpoints-1); i++, pt1++, pt2++) {
float s0[2], s1[2]; /* segment 'center' points */
float t0[2], t1[2]; /* tesselated coordinates */
float m1[2], m2[2]; /* gradient and normal */
- float pthick, dist; /* thickness at segment point, and length of segment */
- float sminorang; /* minor angle between strokes */
+ float mt[2], sc[2]; /* gradient for thickness, point for end-cap */
+ float pthick; /* thickness at segment point */
/* get x and y coordinates from points */
if (sflag & GP_STROKE_2DSPACE) {
@@ -494,91 +498,123 @@ static void gp_draw_stroke (bGPDspoint *points, int totpoints, short thickness,
/* calculate gradient and normal - 'angle'=(ny/nx) */
m1[1]= s1[1] - s0[1];
m1[0]= s1[0] - s0[0];
- dist = Vec2Lenf(s0, s1);
- m2[1]= -(m1[0]) / dist;
- m2[0]= m1[1] / dist;
+ Normalize2(m1);
+ m2[1]= -m1[0];
+ m2[0]= m1[1];
+
+ /* always use pressure from first point here */
+ pthick= (pt1->pressure * thickness);
- /* if the first segment, initialise the first segment using segment's normal */
- if (i == 0) {
- pthick= (pt1->pressure * thickness);
+ /* if the first segment, start of segment is segment's normal */
+ if (i == 0) {
+ /* draw start cap first
+ * - make points slightly closer to center (about halfway across)
+ */
+ mt[0]= m2[0] * pthick * 0.5;
+ mt[1]= m2[1] * pthick * 0.5;
+ sc[0]= s0[0] - (m1[0] * pthick * 0.75);
+ sc[1]= s0[1] - (m1[1] * pthick * 0.75);
+
+ t0[0]= sc[0] - mt[0];
+ t0[1]= sc[1] - mt[1];
+ t1[0]= sc[0] + mt[0];
+ t1[1]= sc[1] + mt[1];
- // TODO: also draw/do a round end-cap first
+ glVertex2fv(t0);
+ glVertex2fv(t1);
- p0[0]= s0[0] - (pthick * m2[0]);
- p0[1]= s0[1] - (pthick * m2[1]);
- p1[0]= s1[0] + (pthick * m2[0]);
- p1[1]= s1[1] + (pthick * m2[1]);
+ /* calculate points for start of segment */
+ mt[0]= m2[0] * pthick;
+ mt[1]= m2[1] * pthick;
- Vec2Copyf(pm, m1);
+ t0[0]= s0[0] - mt[0];
+ t0[1]= s0[1] - mt[1];
+ t1[0]= s0[0] + mt[0];
+ t1[1]= s0[1] + mt[1];
+
+ /* draw this line twice (first to finish off start cap, then for stroke) */
+ glVertex2fv(t1);
+ glVertex2fv(t0);
+ glVertex2fv(t0);
+ glVertex2fv(t1);
}
-
- /* if the minor angle between the current segment and the previous one is less than 90 degrees */
- if (i)
- sminorang= NormalizedVecAngle2_2D(pm, m1);
- else
- sminorang= 0.0f;
-
- if ((IS_EQ(sminorang, 0)==0) && (abs(sminorang) < M_PI_2) )
- {
- float closep[2];
+ /* if not the first segment, use bisector of angle between segments */
+ else {
+ float mb[2]; /* bisector normal */
+ float athick, dfac; /* actual thickness, difference between thicknesses */
- /* recalculate startpoint of segment, where the new start-line:
- * - starts a new gl-quad-strip
- * - uses the vert of old startpoint closer to our endpoint
- * - distance between new startpoints = distance between old startpoints
- * - new startpoints occur on same gradient as old segment does (has potential for some 'minor' overlap, but ok)
+ /* calculate gradient of bisector (as average of normals) */
+ mb[0]= (pm[0] + m2[0]) / 2;
+ mb[1]= (pm[1] + m2[1]) / 2;
+ Normalize2(mb);
+
+ /* calculate gradient to apply
+ * - as basis, use just pthick * bisector gradient
+ * - if cross-section not as thick as it should be, add extra padding to fix it
*/
+ mt[0]= mb[0] * pthick;
+ mt[1]= mb[1] * pthick;
+ athick= Vec2Length(mt);
+ dfac= pthick - (athick * 2);
+ if ( ((athick * 2) < pthick) && (IS_EQ(athick, pthick)==0) )
+ {
+ mt[0] += (mb[0] * dfac);
+ mt[1] += (mb[1] * dfac);
+ }
- /* find the closer vertex, and distance between startpoints */
- if (Vec2Lenf(p0, s1) > Vec2Lenf(p1, s1))
- Vec2Copyf(closep, p1);
- else
- Vec2Copyf(closep, p0);
-
- /* determine which side this closer vertex should be on */
- pthick= (pt1->pressure * thickness * 2);
- if ( ((closep[0] - s0[0]) > 0) || ((closep[1] - s0[1]) > 0) ) {
- /* assumes this is the 'second' point, (i.e. the 'plus' one), so the other is subtracting */
- p0[0]= closep[0] - (pthick * pm[0]);
- p0[1]= closep[1] - (pthick * pm[1]);
- p1[0]= closep[0];
- p1[1]= closep[1];
- }
- else if ( ((closep[0] - s0[0]) < 0) || ((closep[1] - s0[1]) < 0) ) {
- /* assumes this is the 'first' point, (i.e. the 'minus' one), so the other is adding */
- p0[0]= closep[0];
- p0[1]= closep[1];
- p1[0]= closep[0] + (pthick * pm[0]);
- p1[1]= closep[1] + (pthick * pm[1]);
- }
+ /* calculate points for start of segment */
+ t0[0]= s0[0] - mt[0];
+ t0[1]= s0[1] - mt[1];
+ t1[0]= s0[0] + mt[0];
+ t1[1]= s0[1] + mt[1];
- /* reset gl-states! */
- glEnd();
- glBegin(GL_QUAD_STRIP);
+ /* draw this line twice (once for end of current segment, and once for start of next) */
+ glVertex2fv(t1);
+ glVertex2fv(t0);
+ glVertex2fv(t0);
+ glVertex2fv(t1);
}
- /* do the end of this segment */
- pthick= (pt2->pressure * thickness);
- t0[0] = s1[0] - (pthick * m2[0]);
- t0[1] = s1[1] - (pthick * m2[1]);
- t1[0] = s1[0] + (pthick * m2[0]);
- t1[1] = s1[1] + (pthick * m2[1]);
-
- /* draw this segment */
- glVertex2f(p0[0], p0[1]);
- glVertex2f(p1[0], p1[1]);
- glVertex2f(t0[0], t0[1]);
- glVertex2f(t1[0], t1[1]);
-
- // TODO: draw end cap if last segment
+ /* if last segment, also draw end of segment (defined as segment's normal) */
if (i == totpoints-2) {
-
+ /* for once, we use second point's pressure (otherwise it won't be drawn) */
+ pthick= (pt2->pressure * thickness);
+
+ /* calculate points for end of segment */
+ mt[0]= m2[0] * pthick;
+ mt[1]= m2[1] * pthick;
+
+ t0[0]= s1[0] - mt[0];
+ t0[1]= s1[1] - mt[1];
+ t1[0]= s1[0] + mt[0];
+ t1[1]= s1[1] + mt[1];
+
+ /* draw this line twice (once for end of stroke, and once for endcap)*/
+ glVertex2fv(t1);
+ glVertex2fv(t0);
+ glVertex2fv(t0);
+ glVertex2fv(t1);
+
+
+ /* draw end cap as last step
+ * - make points slightly closer to center (about halfway across)
+ */
+ mt[0]= m2[0] * pthick * 0.5;
+ mt[1]= m2[1] * pthick * 0.5;
+ sc[0]= s1[0] + (m1[0] * pthick * 0.75);
+ sc[1]= s1[1] + (m1[1] * pthick * 0.75);
+
+ t0[0]= sc[0] - mt[0];
+ t0[1]= sc[1] - mt[1];
+ t1[0]= sc[0] + mt[0];
+ t1[1]= sc[1] + mt[1];
+
+ glVertex2fv(t1);
+ glVertex2fv(t0);
}
- /* store current points for next segment to use */
- Vec2Copyf(p0, t0);
- Vec2Copyf(p1, t1);
- Vec2Copyf(pm, m1);
+ /* store stroke's 'natural' normal for next stroke to use */
+ Vec2Copyf(pm, m2);
}
glEnd();
@@ -626,6 +662,10 @@ static void gp_draw_strokes (bGPDframe *gpf, int winx, int winy, int dflag, shor
continue;
if (!(dflag & GP_DRAWDATA_ONLYV2D) && (gps->flag & GP_STROKE_2DSPACE))
continue;
+ if ((dflag & GP_DRAWDATA_ONLYI2D) && !(gps->flag & GP_STROKE_2DIMAGE))
+ continue;
+ if (!(dflag & GP_DRAWDATA_ONLYI2D) && (gps->flag & GP_STROKE_2DIMAGE))
+ continue;
if ((gps->points == 0) || (gps->totpoints < 1))
continue;
@@ -796,6 +836,22 @@ static void gp_draw_data (bGPdata *gpd, int winx, int winy, int dflag)
/* ----- Grease Pencil Sketches Drawing API ------ */
+/* draw grease-pencil sketches to specified 2d-view that uses ibuf corrections */
+void draw_gpencil_2dimage (ScrArea *sa, ImBuf *ibuf)
+{
+ bGPdata *gpd;
+ int dflag = 0;
+
+ /* check that we have grease-pencil stuff to draw */
+ if (ELEM(NULL, sa, ibuf)) return;
+ gpd= gpencil_data_getactive(sa);
+ if (gpd == NULL) return;
+
+ /* draw it! */
+ dflag = (GP_DRAWDATA_ONLYI2D|GP_DRAWDATA_NOSTATUS);
+ gp_draw_data(gpd, sa->winx, sa->winy, dflag);
+}
+
/* draw grease-pencil sketches to specified 2d-view assuming that matrices are already set correctly
* Note: this gets called twice - first time with onlyv2d=1 to draw 'canvas' strokes, second time with onlyv2d=0 for screen-aligned strokes
*/
diff --git a/source/blender/src/gpencil.c b/source/blender/src/gpencil.c
index eef21323a44..9b250fc3ec0 100644
--- a/source/blender/src/gpencil.c
+++ b/source/blender/src/gpencil.c
@@ -39,6 +39,9 @@
#include "BMF_Api.h"
+#include "IMB_imbuf.h"
+#include "IMB_imbuf_types.h"
+
#include "BLI_arithb.h"
#include "BLI_blenlib.h"
@@ -312,11 +315,17 @@ bGPdata *gpencil_data_getactive (ScrArea *sa)
{
SpaceSeq *sseq= sa->spacedata.first;
- /* only applicable for "Image Preview" mode */
+ /* only applicable for image modes */
if (sseq->mainb)
return sseq->gpd;
}
break;
+ case SPACE_IMAGE:
+ {
+ SpaceImage *sima= sa->spacedata.first;
+ return sima->gpd;
+ }
+ break;
}
/* nothing found */
@@ -379,6 +388,17 @@ short gpencil_data_setactive (ScrArea *sa, bGPdata *gpd)
}
}
break;
+ case SPACE_IMAGE:
+ {
+ SpaceImage *sima= sa->spacedata.first;
+
+ if (sima->gpd)
+ free_gpencil_data(sima->gpd);
+ sima->gpd= gpd;
+
+ return 1;
+ }
+ break;
}
/* failed to add */
@@ -589,7 +609,7 @@ void gpencil_layer_delactive (bGPdata *gpd)
}
/* ************************************************** */
-/* GREASE-PENCIL EDITING MODE - Tools */
+/* GREASE-PENCIL EDITING - Tools */
/* --------- Data Deletion ---------- */
@@ -679,6 +699,7 @@ void gpencil_delete_menu (void)
typedef struct tGPsdata {
ScrArea *sa; /* area where painting originated */
View2D *v2d; /* needed for GP_STROKE_2DSPACE */
+ ImBuf *ibuf; /* needed for GP_STROKE_2DIMAGE */
bGPdata *gpd; /* gp-datablock layer comes from */
bGPDlayer *gpl; /* layer we're working on */
@@ -800,6 +821,16 @@ static void gp_session_initpaint (tGPsdata *p)
}
}
break;
+ case SPACE_IMAGE:
+ {
+ SpaceImage *sima= curarea->spacedata.first;
+
+ /* set the current area */
+ p->sa= curarea;
+ p->v2d= &sima->v2d;
+ //p->ibuf= BKE_image_get_ibuf(sima->image, &sima->iuser);
+ }
+ break;
/* unsupported views */
default:
{
@@ -869,6 +900,7 @@ static short gp_stroke_filtermval (tGPsdata *p, short mval[2], short pmval[2])
return 1;
/* check if the distance since the last point is significant enough */
+ // future optimisation: sqrt here may be too slow?
else if (sqrt(dx*dx + dy*dy) > MIN_EUCLIDEAN_PX)
return 1;
@@ -884,7 +916,7 @@ static void gp_stroke_convertcoords (tGPsdata *p, short mval[], float out[])
/* in 3d-space - pt->x/y/z are 3 side-by-side floats */
if (gpd->sbuffer_sflag & GP_STROKE_3DSPACE) {
- short mx=mval[0], my=mval[1];
+ const short mx=mval[0], my=mval[1];
float *fp= give_cursor();
float dvec[3];
@@ -904,6 +936,26 @@ static void gp_stroke_convertcoords (tGPsdata *p, short mval[], float out[])
out[1]= y;
}
+ /* 2d - on image 'canvas' (asume that p->v2d is set) */
+ else if ( (gpd->sbuffer_sflag & GP_STROKE_2DIMAGE) &&
+ (p->v2d) && (p->ibuf) )
+ {
+ ImBuf *ibuf= p->ibuf;
+ float x, y;
+
+ /* convert to 'canvas' coordinates, then adjust for view */
+ areamouseco_to_ipoco(p->v2d, mval, &x, &y);
+
+ if (ibuf) {
+ out[0]= x*ibuf->x;
+ out[1]= y*ibuf->y;
+ }
+ else {
+ out[0]= x;
+ out[1]= y;
+ }
+ }
+
/* 2d - relative to screen (viewport area) */
else {
out[0] = (float)(mval[0]) / (float)(p->sa->winx) * 1000;
@@ -927,8 +979,6 @@ static short gp_stroke_addpoint (tGPsdata *p, short mval[2], float pressure)
/* store settings */
pt->x= mval[0];
pt->y= mval[1];
- pt->xf= (float)mval[0];
- pt->yf= (float)mval[0];
pt->pressure= pressure;
/* increment counters */
diff --git a/source/gameengine/Converter/KX_ConvertActuators.cpp b/source/gameengine/Converter/KX_ConvertActuators.cpp
index cb2521de9a4..b1f86afa4ee 100644
--- a/source/gameengine/Converter/KX_ConvertActuators.cpp
+++ b/source/gameengine/Converter/KX_ConvertActuators.cpp
@@ -384,8 +384,12 @@ void BL_ConvertActuators(char* maggiename,
else
{
/* but we need to convert the samplename into absolute pathname first */
- BLI_convertstringcode(soundact->sound->name, maggiename);
- samplename = soundact->sound->name;
+ char fullpath[sizeof(soundact->sound->name)];
+
+ /* dont modify soundact->sound->name, only change a copy */
+ BLI_strncpy(fullpath, soundact->sound->name, sizeof(fullpath));
+ BLI_convertstringcode(fullpath, maggiename);
+ samplename = fullpath;
/* and now we can load it */
if (soundscene->LoadSample(samplename, NULL, 0) > -1)
diff --git a/source/gameengine/Ketsji/KX_PythonInit.cpp b/source/gameengine/Ketsji/KX_PythonInit.cpp
index 472ae759d65..5d2126ca37a 100644
--- a/source/gameengine/Ketsji/KX_PythonInit.cpp
+++ b/source/gameengine/Ketsji/KX_PythonInit.cpp
@@ -30,7 +30,13 @@
#include "GL/glew.h"
+// directory header for py function getBlendFileList
#include <stdlib.h>
+#ifndef WIN32
+ #include <dirent.h>
+#else
+ #include "BLI_winstuff.h"
+#endif
#ifdef WIN32
#pragma warning (disable : 4786)
@@ -112,9 +118,7 @@ static PyObject* gPyGetRandomFloat(PyObject*)
return PyFloat_FromDouble(MT_random());
}
-static PyObject* gPySetGravity(PyObject*,
- PyObject* args,
- PyObject*)
+static PyObject* gPySetGravity(PyObject*, PyObject* args)
{
MT_Vector3 vec = MT_Vector3(0., 0., 0.);
if (PyVecArgTo(args, vec))
@@ -138,9 +142,7 @@ file to make a full path name (doesn't change during the game, even if you load\
other .blend).\n\
The function also converts the directory separator to the local file system format.";
-static PyObject* gPyExpandPath(PyObject*,
- PyObject* args,
- PyObject*)
+static PyObject* gPyExpandPath(PyObject*, PyObject* args)
{
char expanded[FILE_MAXDIR + FILE_MAXFILE];
char* filename;
@@ -185,9 +187,7 @@ static PyObject* gPyGetSpectrum(PyObject*)
-static PyObject* gPyStartDSP(PyObject*,
- PyObject* args,
- PyObject*)
+static PyObject* gPyStartDSP(PyObject*, PyObject* args)
{
SND_IAudioDevice* audiodevice = SND_DeviceManager::Instance();
@@ -205,9 +205,7 @@ static PyObject* gPyStartDSP(PyObject*,
-static PyObject* gPyStopDSP(PyObject*,
- PyObject* args,
- PyObject*)
+static PyObject* gPyStopDSP(PyObject*, PyObject* args)
{
SND_IAudioDevice* audiodevice = SND_DeviceManager::Instance();
@@ -223,9 +221,7 @@ static PyObject* gPyStopDSP(PyObject*,
return NULL;
}
-static PyObject* gPySetLogicTicRate(PyObject*,
- PyObject* args,
- PyObject*)
+static PyObject* gPySetLogicTicRate(PyObject*, PyObject* args)
{
float ticrate;
if (PyArg_ParseTuple(args, "f", &ticrate))
@@ -242,9 +238,7 @@ static PyObject* gPyGetLogicTicRate(PyObject*)
return PyFloat_FromDouble(KX_KetsjiEngine::GetTicRate());
}
-static PyObject* gPySetPhysicsTicRate(PyObject*,
- PyObject* args,
- PyObject*)
+static PyObject* gPySetPhysicsTicRate(PyObject*, PyObject* args)
{
float ticrate;
if (PyArg_ParseTuple(args, "f", &ticrate))
@@ -257,9 +251,7 @@ static PyObject* gPySetPhysicsTicRate(PyObject*,
return NULL;
}
-static PyObject* gPySetPhysicsDebug(PyObject*,
- PyObject* args,
- PyObject*)
+static PyObject* gPySetPhysicsDebug(PyObject*, PyObject* args)
{
int debugMode;
if (PyArg_ParseTuple(args, "i", &debugMode))
@@ -278,6 +270,44 @@ static PyObject* gPyGetPhysicsTicRate(PyObject*)
return PyFloat_FromDouble(PHY_GetActiveEnvironment()->getFixedTimeStep());
}
+static PyObject* gPyGetBlendFileList(PyObject*, PyObject* args)
+{
+ char cpath[sizeof(G.sce)];
+ char *searchpath = NULL;
+ PyObject* list;
+
+ DIR *dp;
+ struct dirent *dirp;
+
+ if (!PyArg_ParseTuple(args, "|s", &searchpath))
+ return NULL;
+
+ list = PyList_New(0);
+
+ if (searchpath) {
+ BLI_strncpy(cpath, searchpath, FILE_MAXDIR + FILE_MAXFILE);
+ BLI_convertstringcode(cpath, G.sce);
+ } else {
+ /* Get the dir only */
+ BLI_split_dirfile_basic(G.sce, cpath, NULL);
+ }
+
+ if((dp = opendir(cpath)) == NULL) {
+ /* todo, show the errno, this shouldnt happen anyway if the blendfile is readable */
+ fprintf(stderr, "Could not read directoty () failed, code %d (%s)\n", cpath, errno, strerror(errno));
+ return list;
+ }
+
+ while ((dirp = readdir(dp)) != NULL) {
+ if (BLI_testextensie(dirp->d_name, ".blend")) {
+ PyList_Append(list, PyString_FromString(dirp->d_name));
+ }
+ }
+
+ closedir(dp);
+ return list;
+}
+
static STR_String gPyGetCurrentScene_doc =
"getCurrentScene()\n"
"Gets a reference to the current scene.\n";
@@ -377,14 +407,13 @@ static struct PyMethodDef game_methods[] = {
{"setLogicTicRate", (PyCFunction) gPySetLogicTicRate, METH_VARARGS, "Sets the logic tic rate"},
{"getPhysicsTicRate", (PyCFunction) gPyGetPhysicsTicRate, METH_NOARGS, "Gets the physics tic rate"},
{"setPhysicsTicRate", (PyCFunction) gPySetPhysicsTicRate, METH_VARARGS, "Sets the physics tic rate"},
+ {"getBlendFileList", (PyCFunction)gPyGetBlendFileList, METH_VARARGS, "Gets a list of blend files in the same directory as the current blend file"},
{"PrintGLInfo", (PyCFunction)pyPrintExt, METH_NOARGS, "Prints GL Extension Info"},
{NULL, (PyCFunction) NULL, 0, NULL }
};
-static PyObject* gPyGetWindowHeight(PyObject*,
- PyObject* args,
- PyObject*)
+static PyObject* gPyGetWindowHeight(PyObject*, PyObject* args)
{
int height = (gp_Canvas ? gp_Canvas->GetHeight() : 0);
@@ -394,9 +423,7 @@ static PyObject* gPyGetWindowHeight(PyObject*,
-static PyObject* gPyGetWindowWidth(PyObject*,
- PyObject* args,
- PyObject*)
+static PyObject* gPyGetWindowWidth(PyObject*, PyObject* args)
{
@@ -411,9 +438,7 @@ static PyObject* gPyGetWindowWidth(PyObject*,
// temporarility visibility thing, will be moved to rasterizer/renderer later
bool gUseVisibilityTemp = false;
-static PyObject* gPyEnableVisibility(PyObject*,
- PyObject* args,
- PyObject*)
+static PyObject* gPyEnableVisibility(PyObject*, PyObject* args)
{
int visible;
if (PyArg_ParseTuple(args,"i",&visible))
@@ -429,9 +454,7 @@ static PyObject* gPyEnableVisibility(PyObject*,
-static PyObject* gPyShowMouse(PyObject*,
- PyObject* args,
- PyObject*)
+static PyObject* gPyShowMouse(PyObject*, PyObject* args)
{
int visible;
if (PyArg_ParseTuple(args,"i",&visible))
@@ -455,9 +478,7 @@ static PyObject* gPyShowMouse(PyObject*,
-static PyObject* gPySetMousePosition(PyObject*,
- PyObject* args,
- PyObject*)
+static PyObject* gPySetMousePosition(PyObject*, PyObject* args)
{
int x,y;
if (PyArg_ParseTuple(args,"ii",&x,&y))
@@ -472,9 +493,7 @@ static PyObject* gPySetMousePosition(PyObject*,
Py_Return;
}
-static PyObject* gPySetEyeSeparation(PyObject*,
- PyObject* args,
- PyObject*)
+static PyObject* gPySetEyeSeparation(PyObject*, PyObject* args)
{
float sep;
if (PyArg_ParseTuple(args, "f", &sep))
@@ -496,9 +515,7 @@ static PyObject* gPyGetEyeSeparation(PyObject*, PyObject*, PyObject*)
return NULL;
}
-static PyObject* gPySetFocalLength(PyObject*,
- PyObject* args,
- PyObject*)
+static PyObject* gPySetFocalLength(PyObject*, PyObject* args)
{
float focus;
if (PyArg_ParseTuple(args, "f", &focus))
@@ -518,9 +535,7 @@ static PyObject* gPyGetFocalLength(PyObject*, PyObject*, PyObject*)
return NULL;
}
-static PyObject* gPySetBackgroundColor(PyObject*,
- PyObject* args,
- PyObject*)
+static PyObject* gPySetBackgroundColor(PyObject*, PyObject* args)
{
MT_Vector4 vec = MT_Vector4(0., 0., 0.3, 0.);
@@ -538,9 +553,7 @@ static PyObject* gPySetBackgroundColor(PyObject*,
-static PyObject* gPySetMistColor(PyObject*,
- PyObject* args,
- PyObject*)
+static PyObject* gPySetMistColor(PyObject*, PyObject* args)
{
MT_Vector3 vec = MT_Vector3(0., 0., 0.);
@@ -558,9 +571,7 @@ static PyObject* gPySetMistColor(PyObject*,
-static PyObject* gPySetMistStart(PyObject*,
- PyObject* args,
- PyObject*)
+static PyObject* gPySetMistStart(PyObject*, PyObject* args)
{
float miststart;
@@ -579,9 +590,7 @@ static PyObject* gPySetMistStart(PyObject*,
-static PyObject* gPySetMistEnd(PyObject*,
- PyObject* args,
- PyObject*)
+static PyObject* gPySetMistEnd(PyObject*, PyObject* args)
{
float mistend;
@@ -599,9 +608,7 @@ static PyObject* gPySetMistEnd(PyObject*,
}
-static PyObject* gPySetAmbientColor(PyObject*,
- PyObject* args,
- PyObject*)
+static PyObject* gPySetAmbientColor(PyObject*, PyObject* args)
{
MT_Vector3 vec = MT_Vector3(0., 0., 0.);
@@ -620,9 +627,7 @@ static PyObject* gPySetAmbientColor(PyObject*,
-static PyObject* gPyMakeScreenshot(PyObject*,
- PyObject* args,
- PyObject*)
+static PyObject* gPyMakeScreenshot(PyObject*, PyObject* args)
{
char* filename;
if (PyArg_ParseTuple(args,"s",&filename))
@@ -638,9 +643,7 @@ static PyObject* gPyMakeScreenshot(PyObject*,
Py_Return;
}
-static PyObject* gPyEnableMotionBlur(PyObject*,
- PyObject* args,
- PyObject*)
+static PyObject* gPyEnableMotionBlur(PyObject*, PyObject* args)
{
float motionblurvalue;
if (PyArg_ParseTuple(args,"f",&motionblurvalue))
@@ -656,9 +659,7 @@ static PyObject* gPyEnableMotionBlur(PyObject*,
Py_Return;
}
-static PyObject* gPyDisableMotionBlur(PyObject*,
- PyObject* args,
- PyObject*)
+static PyObject* gPyDisableMotionBlur(PyObject*, PyObject* args)
{
if(gp_Rasterizer)
{
diff --git a/source/gameengine/Physics/Bullet/CMakeLists.txt b/source/gameengine/Physics/Bullet/CMakeLists.txt
index b610fd1bbb0..6c733786caf 100644
--- a/source/gameengine/Physics/Bullet/CMakeLists.txt
+++ b/source/gameengine/Physics/Bullet/CMakeLists.txt
@@ -30,6 +30,10 @@ SET(INC
.
../common
../../../../extern/bullet2/src
+ ../../../../intern/moto/include
+ ../../../kernel/gen_system
+ ../../../../intern/string
+ ../../Rasterizer
)
BLENDERLIB(bf_bullet "${SRC}" "${INC}")
diff --git a/source/gameengine/PyDoc/GameLogic.py b/source/gameengine/PyDoc/GameLogic.py
index c911ce8ec60..b65bc0f3ce8 100644
--- a/source/gameengine/PyDoc/GameLogic.py
+++ b/source/gameengine/PyDoc/GameLogic.py
@@ -14,8 +14,7 @@ Documentation for the GameLogic Module.
Examples::
# To get a controller:
- import GameLogic
- co = GameLogic.getCurrentController()
+ co = GameLogic.getCurrentController() # GameLogic is automatically imported
# To get the game object associated with this controller:
obj = co.getOwner()
@@ -237,3 +236,13 @@ def expandPath(path):
@return: The converted string
@rtype: string
"""
+
+def getBlendFileList(path = "//"):
+ """
+ Returns a list of blend files in the same directory as the open blend file, or from using the option argument.
+
+ @param path: Optional directory argument, will be expanded (like expandPath) into the full path.
+ @type path: string
+ @return: A list of filenames, with no directory prefix
+ @rtype: list
+ """ \ No newline at end of file