[GameEngine] Commit all Kester's changes made to the gameengine to restore 2.25 like physics.

[SCons] Build with Solid as default when enabling the gameengine in the build process
[SCons] Build solid and qhull from the extern directory and link statically against them

That was about it.

There are a few things that needs double checking:

* Makefiles
* Projectfiles
* All the other systems than Linux and Windows on which the build (with scons) has been successfully tested.
This commit is contained in:
Nathan Letwory 2004-03-22 22:02:18 +00:00
parent 5b90aafbd6
commit 00291b5cf4
133 changed files with 9550 additions and 1534 deletions

@ -68,7 +68,7 @@ if sys.platform == 'linux2' or sys.platform == 'linux-i386':
# SOLID library information
solid_lib = [] # TODO
solid_libpath = [] # TODO
solid_include = ['#extern/solid/include']
solid_include = ['#extern/solid']
qhull_lib = [] # TODO
qhull_libpath = [] # TODO
qhull_include = ['#extern/qhull/include']
@ -156,7 +156,7 @@ elif sys.platform == 'darwin':
# SOLID library information
solid_lib = [] # TODO
solid_libpath = [] # TODO
solid_include = ['#extern/solid/include']
solid_include = ['#extern/solid']
qhull_lib = [] # TODO
qhull_libpath = [] # TODO
qhull_include = ['#extern/qhull/include']
@ -247,8 +247,8 @@ elif sys.platform == 'win32':
use_openal = 'true'
use_fmod = 'false'
use_quicktime = 'true'
use_sumo = 'false'
use_ode = 'true'
use_sumo = 'true'
use_ode = 'false'
use_buildinfo = 'false'
build_blender_dynamic = 'true'
build_blender_static = 'false'
@ -313,7 +313,7 @@ elif sys.platform == 'win32':
# SOLID library information
solid_lib = ['extern/solid']
solid_libpath = ['#../lib/windows/solid/lib']
solid_include = ['#../lib/windows/solid/include']
solid_include = ['#extern/solid']
qhull_lib = ['qhull']
qhull_libpath = ['#../lib/windows/qhull/lib']
qhull_include = ['#extern/qhull/include']
@ -391,7 +391,7 @@ elif string.find (sys.platform, 'sunos') != -1:
# SOLID library information
solid_lib = [] # TODO
solid_libpath = [] # TODO
solid_include = ['#extern/solid/include']
solid_include = ['#extern/solid']
qhull_lib = [] # TODO
qhull_libpath = [] # TODO
qhull_include = ['#extern/qhull/include']
@ -558,7 +558,7 @@ elif sys.platform=='openbsd3':
# SOLID library information
solid_lib = [] # TODO
solid_libpath = [] # TODO
solid_include = ['#extern/solid/include']
solid_include = ['#extern/solid']
qhull_lib = [] # TODO
qhull_libpath = [] # TODO
qhull_include = ['#extern/qhull/include']
@ -617,10 +617,10 @@ else:
config.write ("BUILD_DIR = %r\n"%(root_build_dir))
config.write ("USE_INTERNATIONAL = %r\n"%(use_international))
config.write ("BUILD_GAMEENGINE = %r\n"%(use_gameengine))
if use_sumo == 'true':
config.write ("USE_PHYSICS = 'solid'\n")
else:
if use_ode == 'true':
config.write ("USE_PHYSICS = 'ode'\n")
else:
config.write ("USE_PHYSICS = 'solid'\n")
config.write ("USE_OPENAL = %r\n"%(use_openal))
config.write ("USE_FMOD = %r\n"%(use_fmod))
config.write ("USE_QUICKTIME = %r\n"%(use_quicktime))
@ -903,9 +903,7 @@ if user_options_dict['BUILD_GAMEENGINE'] == 1:
'NG_network',
'NG_loopbacknetwork'])
if user_options_dict['USE_PHYSICS'] == 'solid':
link_env.Append (LIBS=['PHY_Sumo'])
link_env.Append (LIBS=['extern_qhull',
'extern_solid'])
link_env.Append (LIBS=['PHY_Sumo', 'PHY_Physics', 'blender_MT', 'extern_solid', 'extern_qhull'])
else:
link_env.Append (LIBS=['PHY_Ode',
'PHY_Physics'])

@ -1,9 +1,16 @@
import sys
qhull_env = Environment()
# Import the C flags set in the SConstruct file
Import ('cflags')
Import ('defines')
Import ('user_options_dict')
if sys.platform=='linux2' or sys.platform=='linux-i386':
qhull_env.Append (CCFLAGS = ['-O2', '-ansi'])
elif sys.platform=='sunos':
qhull_env.Append (CCFLAGS = ['Xc', '-v', '-fast'])
else:
qhull_env.Append (CCFLAGS = cflags)
qhull_env.Append (CPPDEFINES = defines)

@ -13,6 +13,9 @@ cxxflags = []
if sys.platform=='win32':
defines += ['WIN32','NDEBUG', '_WINDOWS', '_LIB']
cflags += ['/MT', '/W3', '/GX', '/O2']
elif sys.platform=='linux2' or sys.platform=='linux-i386':
defines += ['NDEBUG']
cflags += ['-O2']
else:
print "################################################"
print

276
extern/solid/SOLID/SOLID.h vendored Normal file

@ -0,0 +1,276 @@
/*
* SOLID - Software Library for Interference Detection
*
* Copyright (C) 2001-2003 Dtecta. All rights reserved.
*
* This library may be distributed under the terms of the Q Public License
* (QPL) as defined by Trolltech AS of Norway and appearing in the file
* LICENSE.QPL included in the packaging of this file.
*
* This library may be distributed and/or modified under the terms of the
* GNU General Public License (GPL) version 2 as published by the Free Software
* Foundation and appearing in the file LICENSE.GPL included in the
* packaging of this file.
*
* This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
* WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
* Commercial use or any other use of this library not covered by either
* the QPL or the GPL requires an additional license from Dtecta.
* Please contact info@dtecta.com for enquiries about the terms of commercial
* use of this library.
*/
#ifndef SOLID_H
#define SOLID_H
#include "SOLID_types.h"
#ifdef __cplusplus
extern "C" {
#endif
DT_DECLARE_HANDLE(DT_ObjectHandle);
DT_DECLARE_HANDLE(DT_SceneHandle);
DT_DECLARE_HANDLE(DT_ShapeHandle);
DT_DECLARE_HANDLE(DT_VertexBaseHandle);
DT_DECLARE_HANDLE(DT_RespTableHandle);
DT_DECLARE_HANDLE(DT_ArchiveHandle);
typedef unsigned int DT_ResponseClass;
typedef enum DT_ResponseType {
DT_NO_RESPONSE, /* No response (obsolete) */
DT_SIMPLE_RESPONSE, /* No collision data */
DT_WITNESSED_RESPONSE, /* A point common to both objects
is returned as collision data
*/
DT_DEPTH_RESPONSE /* The penetration depth is returned
as collision data. The penetration depth
is the shortest vector over which one
object needs to be translated in order
to bring the objects in touching contact.
*/
} DT_ResponseType;
/* For witnessed response, the following structure represents a common point. The world
coordinates of 'point1' and 'point2' coincide. 'normal' is the zero vector.
For depth response, the following structure represents the penetration depth.
'point1' en 'point2' are the witness points of the penetration depth in world coordinates.
The penetration depth vector in world coordinates is represented by 'normal'.
*/
typedef struct DT_CollData {
DT_Vector3 point1; /* Point in object1 in world coordinates */
DT_Vector3 point2; /* Point in object2 in world coordinates */
DT_Vector3 normal; /* point2 - point1 */
} DT_CollData;
/* A response callback is called by SOLID for each pair of collding objects. 'client-data'
is a pointer to an arbitrary structure in the client application. The client objects are
pointers to structures in the client application associated with the coliding objects.
'coll_data' is the collision data computed by SOLID.
*/
typedef DT_Bool (*DT_ResponseCallback)(void *client_data,
void *client_object1,
void *client_object2,
const DT_CollData *coll_data);
/* Shape definition */
extern DECLSPEC DT_ShapeHandle DT_NewBox(DT_Scalar x, DT_Scalar y, DT_Scalar z);
extern DECLSPEC DT_ShapeHandle DT_NewCone(DT_Scalar radius, DT_Scalar height);
extern DECLSPEC DT_ShapeHandle DT_NewCylinder(DT_Scalar radius, DT_Scalar height);
extern DECLSPEC DT_ShapeHandle DT_NewSphere(DT_Scalar radius);
extern DECLSPEC DT_ShapeHandle DT_NewPoint(const DT_Vector3 point);
extern DECLSPEC DT_ShapeHandle DT_NewLineSegment(const DT_Vector3 source, const DT_Vector3 target);
extern DECLSPEC DT_ShapeHandle DT_NewMinkowski(DT_ShapeHandle shape1, DT_ShapeHandle shape2);
extern DECLSPEC DT_ShapeHandle DT_NewHull(DT_ShapeHandle shape1, DT_ShapeHandle shape2);
extern DECLSPEC DT_VertexBaseHandle DT_NewVertexBase(const void *pointer, DT_Size stride);
extern DECLSPEC void DT_DeleteVertexBase(DT_VertexBaseHandle vertexBase);
extern DECLSPEC void DT_ChangeVertexBase(DT_VertexBaseHandle vertexBase, const void *pointer);
extern DECLSPEC DT_ShapeHandle DT_NewComplexShape(DT_VertexBaseHandle vertexBase);
extern DECLSPEC void DT_EndComplexShape();
extern DECLSPEC DT_ShapeHandle DT_NewPolytope(DT_VertexBaseHandle vertexBase);
extern DECLSPEC void DT_EndPolytope();
extern DECLSPEC void DT_Begin();
extern DECLSPEC void DT_End();
extern DECLSPEC void DT_Vertex(const DT_Vector3 vertex);
extern DECLSPEC void DT_VertexIndex(DT_Index index);
extern DECLSPEC void DT_VertexIndices(DT_Count count, const DT_Index *indices);
extern DECLSPEC void DT_VertexRange(DT_Index first, DT_Count count);
extern DECLSPEC void DT_DeleteShape(DT_ShapeHandle shape);
/* Object */
extern DECLSPEC DT_ObjectHandle DT_CreateObject(
void *client_object, /* pointer to object in client memory */
DT_ShapeHandle shape /* the shape or geometry of the object */
);
extern DECLSPEC void DT_DestroyObject(DT_ObjectHandle object);
extern DECLSPEC void DT_SetPosition(DT_ObjectHandle object, const DT_Vector3 position);
extern DECLSPEC void DT_SetOrientation(DT_ObjectHandle object, const DT_Quaternion orientation);
extern DECLSPEC void DT_SetScaling(DT_ObjectHandle object, const DT_Vector3 scaling);
/* The margin is an offset from the actual shape. The actual geometry of an
object is the set of points whose distance to the transformed shape is at
most the margin. During the lifetime of an object the margin can be
modified.
*/
extern DECLSPEC void DT_SetMargin(DT_ObjectHandle object, DT_Scalar margin);
/* These commands assume a column-major 4x4 OpenGL matrix representation */
extern DECLSPEC void DT_SetMatrixf(DT_ObjectHandle object, const float *m);
extern DECLSPEC void DT_GetMatrixf(DT_ObjectHandle object, float *m);
extern DECLSPEC void DT_SetMatrixd(DT_ObjectHandle object, const double *m);
extern DECLSPEC void DT_GetMatrixd(DT_ObjectHandle object, double *m);
extern DECLSPEC void DT_GetBBox(DT_ObjectHandle object, DT_Vector3 min, DT_Vector3 max);
/* This next command returns the distance between the objects. De returned
closest points are given in world coordinates.
*/
extern DECLSPEC DT_Scalar DT_GetClosestPair(DT_ObjectHandle object1, DT_ObjectHandle object2,
DT_Vector3 point1, DT_Vector3 point2);
extern DECLSPEC DT_Bool DT_GetCommonPoint(DT_ObjectHandle object1, DT_ObjectHandle object2,
DT_Vector3 point);
extern DECLSPEC DT_Bool DT_GetPenDepth(DT_ObjectHandle object1, DT_ObjectHandle object2,
DT_Vector3 point1, DT_Vector3 point2);
/* Scene */
extern DECLSPEC DT_SceneHandle DT_CreateScene();
extern DECLSPEC void DT_DestroyScene(DT_SceneHandle scene);
extern DECLSPEC void DT_AddObject(DT_SceneHandle scene, DT_ObjectHandle object);
extern DECLSPEC void DT_RemoveObject(DT_SceneHandle scene, DT_ObjectHandle object);
/* Note that objects can be assigned to multiple scenes! */
/* Response */
/* Response tables are defined independent of the scenes in which they are used.
Multiple response tables can be used in one scene, and a response table
can be shared among scenes.
*/
extern DECLSPEC DT_RespTableHandle DT_CreateRespTable();
extern DECLSPEC void DT_DestroyRespTable(DT_RespTableHandle respTable);
/* Responses are defined on (pairs of) response classes. Each response table
maintains its set of response classes.
*/
extern DECLSPEC DT_ResponseClass DT_GenResponseClass(DT_RespTableHandle respTable);
/* To each object for which a response is defined in the response table a
response class needs to be assigned.
*/
extern DECLSPEC void DT_SetResponseClass(DT_RespTableHandle respTable,
DT_ObjectHandle object,
DT_ResponseClass responseClass);
extern DECLSPEC void DT_ClearResponseClass(DT_RespTableHandle respTable,
DT_ObjectHandle object);
extern DECLSPEC void DT_CallResponse(DT_RespTableHandle respTable,
DT_ObjectHandle object1,
DT_ObjectHandle object2,
const DT_CollData *coll_data);
/* For each pair of objects multiple responses can be defined. A response is a callback
together with its response type and client data. */
/* Responses can be defined for all pairs of response classes... */
extern DECLSPEC void DT_AddDefaultResponse(DT_RespTableHandle respTable,
DT_ResponseCallback response,
DT_ResponseType type, void *client_data);
extern DECLSPEC void DT_RemoveDefaultResponse(DT_RespTableHandle respTable,
DT_ResponseCallback response);
/* ...per response class... */
extern DECLSPEC void DT_AddClassResponse(DT_RespTableHandle respTable,
DT_ResponseClass responseClass,
DT_ResponseCallback response,
DT_ResponseType type, void *client_data);
extern DECLSPEC void DT_RemoveClassResponse(DT_RespTableHandle respTable,
DT_ResponseClass responseClass,
DT_ResponseCallback response);
/* ... and per pair of response classes...*/
extern DECLSPEC void DT_AddPairResponse(DT_RespTableHandle respTable,
DT_ResponseClass responseClass1,
DT_ResponseClass responseClass2,
DT_ResponseCallback response,
DT_ResponseType type, void *client_data);
extern DECLSPEC void DT_RemovePairResponse(DT_RespTableHandle respTable,
DT_ResponseClass responseClass1,
DT_ResponseClass responseClass2,
DT_ResponseCallback response);
/* The next command calls the response callbacks for all intersecting pairs of objects in a scene.
'DT_Test' returns the number of pairs of objects for which callbacks have been called.
*/
extern DECLSPEC DT_Count DT_Test(DT_SceneHandle scene, DT_RespTableHandle respTable);
/* Set the maximum relative error in the closest points and penetration depth
computation. The default for `max_error' is 1.0e-3. Larger errors result
in better performance. Non-positive error tolerances are ignored.
*/
extern DECLSPEC void DT_SetAccuracy(DT_Scalar max_error);
/* Set the maximum tolerance on relative errors due to rounding. The default for `tol_error'
is the machine epsilon. Very large tolerances result in false collisions. Setting tol_error too small
results in missed collisions. Non-positive error tolerances are ignored.
*/
extern DECLSPEC void DT_SetTolerance(DT_Scalar tol_error);
/* This function returns the client pointer to the first object in a scene hit by the ray
(actually a line segment) defined by the points 'from' en 'to'. The spot is the hit point
on the object in local coordinates. 'normal' is the normal to the surface of the object in
world coordinates. The ignore_client pointer is used to make one of the objects transparent.
NB: Currently ray tests are implemented for spheres, boxes, and meshes only!!
*/
extern DECLSPEC void *DT_RayCast(DT_SceneHandle scene, void *ignore_client,
const DT_Vector3 source, const DT_Vector3 target,
DT_Scalar max_param, DT_Scalar *param, DT_Vector3 normal);
/* Similar, only here a single object is tested and a boolean is returned */
extern DECLSPEC DT_Bool DT_ObjectRayCast(DT_ObjectHandle object,
const DT_Vector3 source, const DT_Vector3 target,
DT_Scalar max_param, DT_Scalar *param, DT_Vector3 normal);
#ifdef __cplusplus
}
#endif
#endif

75
extern/solid/SOLID/SOLID_broad.h vendored Normal file

@ -0,0 +1,75 @@
/*
* SOLID - Software Library for Interference Detection
*
* Copyright (C) 2001-2003 Dtecta. All rights reserved.
*
* This library may be distributed under the terms of the Q Public License
* (QPL) as defined by Trolltech AS of Norway and appearing in the file
* LICENSE.QPL included in the packaging of this file.
*
* This library may be distributed and/or modified under the terms of the
* GNU General Public License (GPL) version 2 as published by the Free Software
* Foundation and appearing in the file LICENSE.GPL included in the
* packaging of this file.
*
* This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
* WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
* Commercial use or any other use of this library not covered by either
* the QPL or the GPL requires an additional license from Dtecta.
* Please contact info@dtecta.com for enquiries about the terms of commercial
* use of this library.
*/
#ifndef SOLID_BROAD_H
#define SOLID_BROAD_H
#include "SOLID_types.h"
#ifdef __cplusplus
extern "C" {
#endif
DT_DECLARE_HANDLE(BP_SceneHandle);
DT_DECLARE_HANDLE(BP_ProxyHandle);
typedef void (*BP_Callback)(void *client_data,
void *object1,
void *object2);
typedef bool (*BP_RayCastCallback)(void *client_data,
void *object,
const DT_Vector3 source,
const DT_Vector3 target,
DT_Scalar *lambda);
extern DECLSPEC BP_SceneHandle BP_CreateScene(void *client_data,
BP_Callback beginOverlap,
BP_Callback endOverlap);
extern DECLSPEC void BP_DestroyScene(BP_SceneHandle scene);
extern DECLSPEC BP_ProxyHandle BP_CreateProxy(BP_SceneHandle scene,
void *object,
const DT_Vector3 min,
const DT_Vector3 max);
extern DECLSPEC void BP_DestroyProxy(BP_SceneHandle scene,
BP_ProxyHandle proxy);
extern DECLSPEC void BP_SetBBox(BP_ProxyHandle proxy,
const DT_Vector3 min,
const DT_Vector3 max);
extern DECLSPEC void *BP_RayCast(BP_SceneHandle scene,
BP_RayCastCallback objectRayCast,
void *client_data,
const DT_Vector3 source,
const DT_Vector3 target,
DT_Scalar *lambda);
#ifdef __cplusplus
}
#endif
#endif

53
extern/solid/SOLID/SOLID_types.h vendored Normal file

@ -0,0 +1,53 @@
/*
* SOLID - Software Library for Interference Detection
*
* Copyright (C) 2001-2003 Dtecta. All rights reserved.
*
* This library may be distributed under the terms of the Q Public License
* (QPL) as defined by Trolltech AS of Norway and appearing in the file
* LICENSE.QPL included in the packaging of this file.
*
* This library may be distributed and/or modified under the terms of the
* GNU General Public License (GPL) version 2 as published by the Free Software
* Foundation and appearing in the file LICENSE.GPL included in the
* packaging of this file.
*
* This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
* WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
* Commercial use or any other use of this library not covered by either
* the QPL or the GPL requires an additional license from Dtecta.
* Please contact info@dtecta.com for enquiries about the terms of commercial
* use of this library.
*/
#ifndef SOLID_TYPES_H
#define SOLID_TYPES_H
#ifndef DECLSPEC
# ifdef WIN32
# define DECLSPEC __declspec(dllexport)
# else
# define DECLSPEC
# endif
#endif
#define DT_DECLARE_HANDLE(name) typedef struct name##__ { int unused; } *name
typedef unsigned short DT_Index;
typedef unsigned short DT_Count;
typedef unsigned int DT_Size;
typedef float DT_Scalar;
typedef int DT_Bool;
#define DT_FALSE 0
#define DT_TRUE 1
#define DT_CONTINUE 0
#define DT_DONE 1
typedef DT_Scalar DT_Vector3[3];
typedef DT_Scalar DT_Quaternion[4];
#endif

@ -217,7 +217,7 @@ Mesh *add_mesh()
me->size[0]= me->size[1]= me->size[2]= 1.0;
me->smoothresh= 30;
me->texflag= ME_AUTOSPACE;
me->texflag= AUTOSPACE;
me->flag= ME_TWOSIDED;
me->subdiv= 1;
me->subdivr = 1;
@ -398,7 +398,7 @@ void tex_space_mesh(Mesh *me)
boundbox_mesh(me, loc, size);
if(me->texflag & ME_AUTOSPACE) {
if(me->texflag & AUTOSPACE) {
if(me->key) {
kb= me->key->refkey;
if (kb) {

@ -258,8 +258,72 @@ typedef enum {
#define BIFNICONIDS (BIFICONID_LAST-BIFICONID_FIRST + 1)
} BIFIconID;
typedef enum {
#define BIFCOLORSHADE_FIRST (COLORSHADE_DARK)
COLORSHADE_DARK,
COLORSHADE_GREY,
COLORSHADE_MEDIUM,
COLORSHADE_HILITE,
COLORSHADE_LIGHT,
COLORSHADE_WHITE,
#define BIFCOLORSHADE_LAST (COLORSHADE_WHITE)
#define BIFNCOLORSHADES (BIFCOLORSHADE_LAST-BIFCOLORSHADE_FIRST + 1)
} BIFColorShade;
/* ---------- theme ----------- */
typedef enum {
#define BIFCOLORID_FIRST (BUTGREY)
BUTGREY = 0,
BUTGREEN,
BUTBLUE,
BUTSALMON,
MIDGREY,
BUTPURPLE,
BUTYELLOW,
REDALERT,
BUTRUST,
BUTWHITE,
BUTDBLUE,
BUTPINK,
BUTDPINK,
BUTMACTIVE,
BUTIPO,
BUTAUDIO,
BUTCAMERA,
BUTRANDOM,
BUTEDITOBJECT,
BUTPROPERTY,
BUTSCENE,
BUTMOTION,
BUTMESSAGE,
BUTACTION,
BUTCD,
BUTGAME,
BUTVISIBILITY,
BUTYUCK,
BUTSEASICK,
BUTCHOKE,
BUTIMPERIAL,
BUTTEXTCOLOR,
BUTTEXTPRESSED,
BUTSBACKGROUND,
VIEWPORTBACKCOLOR,
VIEWPORTGRIDCOLOR,
VIEWPORTACTIVECOLOR,
VIEWPORTSELECTEDCOLOR,
VIEWPORTUNSELCOLOR,
EDITVERTSEL,
EDITVERTUNSEL,
EDITEDGESEL,
EDITEDGEUNSEL,
#define BIFCOLORID_LAST (EDITEDGEUNSEL)
#define BIFNCOLORIDS (BIFCOLORID_LAST-BIFCOLORID_FIRST + 1)
} BIFColorID;
enum {
TH_AUTO, /* for buttons, to signal automatic color assignment */
@ -355,6 +419,8 @@ void BIF_InitTheme(void);
void BIF_SetTheme(struct ScrArea *sa);
void BIF_resources_init (void);
void BIF_resources_free (void);
void BIF_colors_init (void);
void BIF_load_ui_colors (void);
// icon API
@ -368,4 +434,6 @@ char *BIF_ThemeGetColorPtr(struct bTheme *btheme, int spacetype, int colorid);
char *BIF_ThemeColorsPup(int spacetype);
void BIF_def_color (BIFColorID colorid, unsigned char r, unsigned char g, unsigned char b);
#endif /* BIF_ICONS_H */

@ -74,6 +74,9 @@ extern void do_mballbuts(unsigned short event);
extern void do_latticebuts(unsigned short event);
extern void do_fpaintbuts(unsigned short event);
/* dont like it here , rather make a BIF_Buttons_Editing.h or so BM*/
extern int Buttons_Editing_GetFaceShadows();
/* shading */
extern void material_panels(void);
extern void do_matbuts(unsigned short event);
@ -97,6 +100,9 @@ extern void do_scriptbuts(unsigned short event);
/* ipowindow */
extern void do_ipobuts(unsigned short event); // drawipo.c (bad! ton)
/* uvautocalculation */
void do_uvautocalculationbuts(unsigned short event);
void get_uvautocalculationsettings(float *radius,float *cubesize, int *mapdir, int *mapalign);
/* butspace.c */
void test_meshpoin_but(char *name, struct ID **idpp);
void test_obpoin_but(char *name, struct ID **idpp);
@ -337,6 +343,14 @@ enum {
#define B_VERTEXSMOOTH 2080
#define B_MAKESTICKY 2082
#define B_MAKEVERTCOL 2083
#define B_CHROMADEPTH 2084
#define B_ISDEFLECTOR 2085
#define B_PDEFDAMPING 2086
#define B_GRAVITY 2087
#define B_GRAVSTRENGTH 2088
#define B_GRAVPOWER 2089
#define B_PDEFRDAMP 2090
#define B_PDEFPERM 2091
/* *********************** */
#define B_CURVEBUTS 2200
@ -416,6 +430,12 @@ enum {
#define B_SOUNDACT_BROWSE 2712
#define B_SETSECTOR 2713
#define B_SETPROP 2714
#define B_SETACTOR 2715
#define B_SETMAINACTOR 2716
#define B_SETDYNA 2717
/* *********************** */
#define B_FPAINTBUTS 2900
@ -508,8 +528,37 @@ enum {
B_CONSTRAINT_ADD_LOCLIKE,
B_CONSTRAINT_ADD_ACTION,
B_CONSTRAINT_ADD_LOCKTRACK,
B_CONSTRAINT_ADD_FOLLOWPATH
B_CONSTRAINT_ADD_FOLLOWPATH,
B_CONSTRAINT_ADD_DISTANCELIMIT
};
/*+++ BM */
/* *********************** */
#define B_UVAUTOCALCBUTS 3400
enum {
B_UVAUTO_REDRAW = 3301,
B_UVAUTO_SPHERE,
B_UVAUTO_CYLINDER,
B_UVAUTO_CYLRADIUS,
B_UVAUTO_WINDOW,
B_UVAUTO_CUBE,
B_UVAUTO_CUBESIZE,
B_UVAUTO_STD1,
B_UVAUTO_STD2,
B_UVAUTO_STD4,
B_UVAUTO_STD8,
B_UVAUTO_BOUNDS1,
B_UVAUTO_BOUNDS2,
B_UVAUTO_BOUNDS4,
B_UVAUTO_BOUNDS8,
B_UVAUTO_TOP,
B_UVAUTO_FACE,
B_UVAUTO_OBJECT,
B_UVAUTO_ALIGNX,
B_UVAUTO_ALIGNY
};
/* *********************** */
/*--- BM */
/* *********************** */

@ -217,6 +217,7 @@
#define REDRAWBUTSSCRIPT 0x401A
#define REDRAWBUTSLOGIC 0x401B
#define REDRAWBUTSSHADING 0x401C
#define REDRAWBUTSGAME 0x401D
#define REDRAWINFO 0x4021
#define RENDERPREVIEW 0x4022
@ -234,6 +235,7 @@
#define REDRAWTEXT 0x402E
#define REDRAWSOUND 0x402F
#define REDRAWACTION 0x4030
#define REDRAWBUTSCONSTRAINT 0x4034
#define REDRAWNLA 0x4031
#define REDRAWSCRIPT 0x4032

@ -79,8 +79,8 @@ typedef struct bKinematicConstraint{
typedef struct bTrackToConstraint{
Object *tar;
int reserved1; /* Track Axis */
int reserved2; /* Up Axis */
int reserved1; /* I'll be using reserved1 and reserved2 as Track and Up flags, not sure if that's what they were intented for anyway. Not sure either if it would create backward incompatibility if I were to rename them. - theeth*/
int reserved2;
char subtarget[32];
} bTrackToConstraint;
@ -126,6 +126,17 @@ typedef struct bFollowPathConstraint{
int upflag;
} bFollowPathConstraint;
/* Distance Limiting constraints */
typedef struct bDistanceLimitConstraint{
Object *tar;
char subtarget[32];
float pad1;
float pad2;
float distance;
float offset[3];
} bDistanceLimitConstraint;
/* Zero-target constraints */
typedef struct bRotationConstraint{
float xmin, xmax;
@ -133,6 +144,8 @@ typedef struct bRotationConstraint{
float zmin, zmax;
} bRotationConstraint;
/* bConstraint.type */
#define CONSTRAINT_TYPE_NULL 0
#define CONSTRAINT_TYPE_CHILDOF 1 /* Unimplemented */
@ -148,6 +161,7 @@ typedef struct bRotationConstraint{
#define CONSTRAINT_TYPE_PYTHON 11 /* Unimplemented */
#define CONSTRAINT_TYPE_ACTION 12
#define CONSTRAINT_TYPE_LOCKTRACK 13 /* New Tracking constraint that locks an axis in place - theeth */
#define CONSTRAINT_TYPE_DISTANCELIMIT 14
/* bConstraint.flag */
#define CONSTRAINT_EXPAND 0x00000001
@ -167,6 +181,39 @@ typedef struct bRotationConstraint{
#define LOCLIKE_X 0x00000001
#define LOCLIKE_Y 0x00000002
#define LOCLIKE_Z 0x00000004
#define LOCSPACE 0x00000008
/* Tracking flags */
#define LOCK_X 0x00000000
#define LOCK_Y 0x00000001
#define LOCK_Z 0x00000002
#define UP_X 0x00000000
#define UP_Y 0x00000001
#define UP_Z 0x00000002
#define TRACK_X 0x00000000
#define TRACK_Y 0x00000001
#define TRACK_Z 0x00000002
#define TRACK_nX 0x00000003
#define TRACK_nY 0x00000004
#define TRACK_nZ 0x00000005
/* Tracking flags */
#define LOCK_X 0x00000000
#define LOCK_Y 0x00000001
#define LOCK_Z 0x00000002
#define UP_X 0x00000000
#define UP_Y 0x00000001
#define UP_Z 0x00000002
#define TRACK_X 0x00000000
#define TRACK_Y 0x00000001
#define TRACK_Z 0x00000002
#define TRACK_nX 0x00000003
#define TRACK_nY 0x00000004
#define TRACK_nZ 0x00000005
/* Tracking flags */
#define LOCK_X 0x00000000

@ -100,7 +100,7 @@ typedef struct Mesh {
/* **************** MESH ********************* */
/* texflag */
#define ME_AUTOSPACE 1
#define AUTOSPACE 1
/* me->flag */
#define ME_ISDONE 1

@ -64,6 +64,18 @@ typedef struct BoundBox {
float vec[8][3];
} BoundBox;
/* OcInfo and LBuf structs are for the Enji gameengine */
typedef struct OcInfo {
float dvec[3];
float size[3];
} OcInfo;
typedef struct LBuf {
short tot, max;
int pad;
struct Object **ob;
} LBuf;
typedef struct Object {
ID id;
@ -153,6 +165,7 @@ typedef struct Object {
* bit 8: Friction is anisotropic
* bit 9: Object is a ghost
* bit 10: Do rigid body dynamics.
* bit 11: Use bounding object for physics
*/
int gameflag;
/**
@ -165,6 +178,13 @@ typedef struct Object {
ListBase constraints;
ListBase nlastrips;
struct Life *life;
LBuf lbuf;
LBuf port;
float toonedge, pad2;
} Object;
/* this work object is defined in object.c */
@ -250,6 +270,11 @@ extern Object workob;
#define OB_SOLID 3
#define OB_SHADED 4
#define OB_TEXTURE 5
#define OB_TOON_MONO 6
#define OB_TOON_COLOR 7
#define OB_TOON_TRANSP 8
#define OB_TOON_FLAT 9
#define OB_TOON_SMOOTH 10
/* dtx: flags */
#define OB_AXIS 2
@ -291,6 +316,7 @@ extern Object workob;
#define OB_ANISOTROPIC_FRICTION 256
#define OB_GHOST 512
#define OB_RIGID_BODY 1024
#define OB_BOUNDS 2048
#define OB_COLLISION_RESPONSE 4096
#define OB_SECTOR 8192

@ -63,6 +63,8 @@
#include "DNA_sound_types.h"
#include "DNA_text_types.h"
#include "DNA_view3d_types.h"
#include "DNA_mesh_types.h"
#include "DNA_world_types.h"
#include "BKE_library.h"
#include "BKE_global.h"
@ -87,7 +89,6 @@
#include "nla.h" /* For __NLA : Important, do not remove */
#include "butspace.h" // own module
/* internals */
/****/
@ -347,6 +348,30 @@ void do_logic_buts(unsigned short event)
switch(event) {
case B_SETSECTOR:
/* check for inconsistant types */
ob->gameflag &= ~(OB_PROP|OB_MAINACTOR|OB_DYNAMIC|OB_ACTOR);
ob->dtx |= OB_BOUNDBOX;
allqueue(REDRAWBUTSGAME, 0);
allqueue(REDRAWVIEW3D, 0);
break;
case B_SETPROP:
/* check for inconsistant types */
ob->gameflag &= ~(OB_SECTOR|OB_MAINACTOR|OB_DYNAMIC|OB_ACTOR);
allqueue(REDRAWBUTSGAME, 0);
allqueue(REDRAWVIEW3D, 0);
break;
case B_SETACTOR:
case B_SETDYNA:
case B_SETMAINACTOR:
ob->gameflag &= ~(OB_SECTOR|OB_PROP);
allqueue(REDRAWBUTSGAME, 0);
allqueue(REDRAWVIEW3D, 0);
break;
case B_ADD_PROP:
prop= new_property(PROP_FLOAT);
make_unique_prop_names(prop->name);
@ -2246,63 +2271,96 @@ static uiBlock *actuator_menu(void *arg_unused)
return block;
}
/* never used, see CVS 1.134 for the code */
/* static FreeCamera *new_freecamera(void) */
/* never used, see CVS 1.120 for the code */
/* static uiBlock *freecamera_menu(void) */
void logic_buts(void)
void buttons_enji(uiBlock *block, Object *ob)
{
ID **idar;
Object *ob;
bProperty *prop;
bSensor *sens;
bController *cont;
bActuator *act;
uiBlock *block;
uiBut *but;
int a;
short xco, yco, count, width, ycoo;
char *pupstr, name[32];
int butreturn = 0;
ob= OBACT;
if(ob==0) return;
uiSetButLock(ob->id.lib!=0, "Can't edit library data");
sprintf(name, "buttonswin %d", curarea->win);
block= uiNewBlock(&curarea->uiblocks, name, UI_EMBOSS, UI_HELV, curarea->win);
uiBlockSetCol(block, TH_BUT_SETTING2);
uiDefButI(block, TOG|BIT|2, B_REDR, "Actor",
25,205,60,19, &ob->gameflag, 0, 0, 0, 0,
uiDefBut(block, TOG|INT|BIT|13, B_SETSECTOR, "Sector",
10,205,65,19, &ob->gameflag, 0, 0, 0, 0,
"All game elements should be in the Sector boundbox");
uiDefBut(block, TOG|INT|BIT|14, B_SETPROP, "Prop",
75,205,65,19, &ob->gameflag, 0, 0, 0, 0,
"An Object fixed within a sector");
uiBlockSetCol(block, BUTPURPLE);
uiDefBut(block, TOG|INT|BIT|2, B_SETACTOR, "Actor",
140,205,65,19, &ob->gameflag, 0, 0, 0, 0,
"Objects that are evaluated by the engine ");
if(ob->gameflag & OB_ACTOR) {
uiDefButI(block, TOG|BIT|9, B_REDR, "Ghost", 85,205,65,19, &ob->gameflag, 0, 0, 0, 0, "Objects that don't restitute collisions (like a ghost)");
uiDefButI(block, TOG|BIT|0, B_REDR, "Dynamic", 150,205,65,19, &ob->gameflag, 0, 0, 0, 0, "Motion defined by laws of physics");
uiDefBut(block, TOG|INT|BIT|0, B_SETDYNA, "Dynamic",
205,205,75,19, &ob->gameflag, 0, 0, 0, 0,
"Motion defined by laws of physics");
uiDefBut(block, TOG|INT|BIT|15, B_SETMAINACTOR, "MainActor",
280,205,70,19, &ob->gameflag, 0, 0, 0, 0, "");
if(ob->gameflag & OB_DYNAMIC) {
uiDefBut(block, TOG|INT|BIT|6, B_DIFF, "Do Fh",
10,185,50,19, &ob->gameflag, 0, 0, 0, 0,
"Use Fh settings in Materials");
uiDefBut(block, TOG|INT|BIT|7, B_DIFF, "Rot Fh",
60,185,50,19, &ob->gameflag, 0, 0, 0, 0,
"Use face normal to rotate Object");
uiDefButI(block, TOG|BIT|10, B_REDR, "Rigid Body", 215,205,135,19, &ob->gameflag, 0, 0, 0, 0, "");
uiBlockSetCol(block, BUTGREY);
uiDefBut(block, NUM|FLO, B_DIFF, "Mass:",
110, 185, 120, 19, &ob->mass, 0.01, 100.0, 10, 0,
"The mass of the Object");
uiDefBut(block, NUM|FLO, REDRAWVIEW3D, "Size:",
230, 185, 120, 19, &ob->inertia, 0.01, 10.0, 10, 0,
"Bounding sphere size");
uiDefBut(block, NUM|FLO, B_DIFF, "Damp:",
10, 165, 100, 19, &ob->damping, 0.0, 1.0, 10, 0,
"General movement damping");
uiDefBut(block, NUM|FLO, B_DIFF, "RotDamp:",
110, 165, 120, 19, &ob->rdamping, 0.0, 1.0, 10, 0,
"General rotation damping");
}
}
uiDefButI(block, TOG|BIT|6, B_DIFF, "Do Fh", 10,185,50,19, &ob->gameflag, 0, 0, 0, 0, "Use Fh settings in Materials");
uiDefButI(block, TOG|BIT|7, B_DIFF, "Rot Fh", 60,185,50,19, &ob->gameflag, 0, 0, 0, 0, "Use face normal to rotate Object");
}
uiDefButF(block, NUM, B_DIFF, "Mass:", 110, 185, 80, 19, &ob->mass, 0.01, 100.0, 10, 0, "The mass of the Object");
uiDefButF(block, NUM, REDRAWVIEW3D, "Size:", 190, 185, 80, 19, &ob->inertia, 0.01, 10.0, 10, 0, "Bounding sphere size");
uiDefButF(block, NUM, B_DIFF, "Form:", 270, 185, 80, 19, &ob->formfactor, 0.01, 100.0, 10, 0, "Form factor");
void buttons_ketsji(uiBlock *block, Object *ob)
{
uiDefButI(block, TOG|BIT|2, B_REDR, "Actor",
10,205,75,19, &ob->gameflag, 0, 0, 0, 0,
"Objects that are evaluated by the engine ");
if(ob->gameflag & OB_ACTOR) {
uiDefButI(block, TOG|BIT|9, B_REDR, "Ghost", 85,205,65,19,
&ob->gameflag, 0, 0, 0, 0,
"Objects that don't restitute collisions (like a ghost)");
uiDefButI(block, TOG|BIT|0, B_REDR, "Dynamic", 150,205,65,19,
&ob->gameflag, 0, 0, 0, 0,
"Motion defined by laws of physics");
uiDefButF(block, NUM, B_DIFF, "Damp:", 10, 165, 100, 19, &ob->damping, 0.0, 1.0, 10, 0, "General movement damping");
uiDefButF(block, NUM, B_DIFF, "RotDamp:", 110, 165, 120, 19, &ob->rdamping, 0.0, 1.0, 10, 0, "General rotation damping");
uiDefButI(block, TOG|BIT|8, B_REDR, "Anisotropic", 230, 165, 120, 19,
if(ob->gameflag & OB_DYNAMIC) {
uiDefButI(block, TOG|BIT|10, B_REDR, "Rigid Body", 215,205,135,19,
&ob->gameflag, 0, 0, 0, 0,
"Enable rolling physics");
uiDefButI(block, TOG|BIT|6, B_DIFF, "Do Fh", 10,185,50,19,
&ob->gameflag, 0, 0, 0, 0,
"Use Fh settings in Materials");
uiDefButI(block, TOG|BIT|7, B_DIFF, "Rot Fh", 60,185,50,19,
&ob->gameflag, 0, 0, 0, 0,
"Use face normal to rotate Object");
uiDefButF(block, NUM, B_DIFF, "Mass:", 110, 185, 80, 19,
&ob->mass, 0.01, 100.0, 10, 0,
"The mass of the Object");
uiDefButF(block, NUM, REDRAWVIEW3D, "Size:", 190, 185, 80, 19,
&ob->inertia, 0.01, 10.0, 10, 0,
"Bounding sphere size");
uiDefButF(block, NUM, B_DIFF, "Form:", 270, 185, 80, 19,
&ob->formfactor, 0.01, 100.0, 10, 0,
"Form factor");
uiDefButF(block, NUM, B_DIFF, "Damp:", 10, 165, 100, 19,
&ob->damping, 0.0, 1.0, 10, 0,
"General movement damping");
uiDefButF(block, NUM, B_DIFF, "RotDamp:", 110, 165, 120, 19,
&ob->rdamping, 0.0, 1.0, 10, 0,
"General rotation damping");
uiDefButI(block, TOG|BIT|8, B_REDR, "Anisotropic",
230, 165, 120, 19,
&ob->gameflag, 0.0, 1.0, 10, 0,
"Enable anisotropic friction");
}
}
if (ob->gameflag & OB_ANISOTROPIC_FRICTION) {
uiDefButF(block, NUM, B_DIFF, "x friction:", 10, 145, 114, 19,
@ -2315,9 +2373,62 @@ void logic_buts(void)
&ob->anisotropicFriction[2], 0.0, 1.0, 10, 0,
"Relative friction coefficient in the z-direction.");
}
}
if (!(ob->gameflag & OB_GHOST)) {
uiDefButI(block, TOG|BIT|11, B_REDR, "Bounds", 10, 125, 75, 19,
&ob->gameflag, 0, 0,0, 0,
"Specify a bounds object for physics");
if (ob->gameflag & OB_BOUNDS) {
uiDefButS(block, MENU, REDRAWVIEW3D, "Boundary Display%t|Box%x0|Sphere%x1|Cylinder%x2|Cone%x3|Polyheder%x4",
85, 125, 100, 19, &ob->boundtype, 0, 0, 0, 0, "Selects the boundary display type");
}
}
}
/* never used, see CVS 1.134 for the code */
/* static FreeCamera *new_freecamera(void) */
/* never used, see CVS 1.120 for the code */
/* static uiBlock *freecamera_menu(void) */
void logic_buts(void)
{
ID **idar;
Object *ob;
bProperty *prop;
bSensor *sens;
bController *cont;
bActuator *act;
uiBlock *block;
uiBut *but;
World *wrld;
int a;
short xco, yco, count, width, ycoo;
char *pupstr, name[32];
int butreturn = 0;
wrld= G.scene->world;
if(wrld==0) return;
ob= OBACT;
if(ob==0) return;
uiSetButLock(ob->id.lib!=0, "Can't edit library data");
sprintf(name, "buttonswin %d", curarea->win);
block= uiNewBlock(&curarea->uiblocks, name, UI_EMBOSS, UI_HELV, curarea->win);
uiBlockSetCol(block, TH_BUT_SETTING2);
if (wrld->physicsEngine == 1)
buttons_enji(block, ob);
if ( (wrld->physicsEngine == 4) || (wrld->physicsEngine == 2) )
buttons_ketsji(block, ob);
uiBlockSetCol(block, TH_AUTO);
uiDefBut(block, BUT, B_ADD_PROP, "ADD property", 10, 110, 340, 24,
uiDefBut(block, BUT, B_ADD_PROP, "ADD property", 10, 90, 340, 24,
NULL, 0.0, 100.0, 100, 0,
"");
@ -2327,10 +2438,10 @@ void logic_buts(void)
prop= ob->prop.first;
while(prop) {
but= uiDefBut(block, BUT, 1, "Del", 10, (short)(90-20*a), 40, 19, NULL, 0.0, 0.0, 1, (float)a, "");
but= uiDefBut(block, BUT, 1, "Del", 10, (short)(70-20*a), 40, 19, NULL, 0.0, 0.0, 1, (float)a, "");
uiButSetFunc(but, del_property, prop, NULL);
uiDefButS(block, MENU, B_CHANGE_PROP, pupstr, 50, (short)(90-20*a), 60, 19, &prop->type, 0, 0, 0, 0, "");
but= uiDefBut(block, TEX, 1, "Name:", 110, (short)(90-20*a), 105, 19, prop->name, 0, 31, 0, 0, "");
uiDefButS(block, MENU, B_CHANGE_PROP, pupstr, 50, (short)(70-20*a), 60, 19, &prop->type, 0, 0, 0, 0, "");
but= uiDefBut(block, TEX, 1, "Name:", 110, (short)(70-20*a), 105, 19, prop->name, 0, 31, 0, 0, "");
uiButSetFunc(but, make_unique_prop_names_cb, prop->name, (void*) 1);
if (strcmp(prop->name, "Text") == 0) {
@ -2340,19 +2451,19 @@ void logic_buts(void)
}
if(prop->type==PROP_BOOL) {
uiDefButI(block, TOG|BIT|0, B_REDR, "True", 215, (short)(90-20*a), 55, 19, &prop->data, 0, 0, 0, 0, "");
uiDefButI(block, TOGN|BIT|0, B_REDR, "False", 270, (short)(90-20*a), 55, 19, &prop->data, 0, 0, 0, 0, "");
uiDefButI(block, TOG|BIT|0, B_REDR, "True", 215, (short)(70-20*a), 55, 19, &prop->data, 0, 0, 0, 0, "");
uiDefButI(block, TOGN|BIT|0, B_REDR, "False", 270, (short)(70-20*a), 55, 19, &prop->data, 0, 0, 0, 0, "");
}
else if(prop->type==PROP_INT)
uiDefButI(block, NUM, butreturn, "", 215, (short)(90-20*a), 110, 19, &prop->data, -10000, 10000, 0, 0, "");
uiDefButI(block, NUM, butreturn, "", 215, (short)(70-20*a), 110, 19, &prop->data, -10000, 10000, 0, 0, "");
else if(prop->type==PROP_FLOAT)
uiDefButF(block, NUM, butreturn, "", 215, (short)(90-20*a), 110, 19, (float*) &prop->data, -10000, 10000, 100, 0, "");
uiDefButF(block, NUM, butreturn, "", 215, (short)(70-20*a), 110, 19, (float*) &prop->data, -10000, 10000, 100, 0, "");
else if(prop->type==PROP_STRING)
uiDefBut(block, TEX, butreturn, "", 215, (short)(90-20*a), 110, 19, prop->poin, 0, 127, 0, 0, "");
uiDefBut(block, TEX, butreturn, "", 215, (short)(70-20*a), 110, 19, prop->poin, 0, 127, 0, 0, "");
else if(prop->type==PROP_TIME)
uiDefButF(block, NUM, butreturn, "", 215, (short)(90-20*a), 110, 19, (float*) &prop->data, -10000, 10000, 0, 0, "");
uiDefButF(block, NUM, butreturn, "", 215, (short)(70-20*a), 110, 19, (float*) &prop->data, -10000, 10000, 0, 0, "");
uiDefButS(block, TOG|BIT|0, 0, "D", 325, (short)(90-20*a), 20, 19, &prop->flag, 0, 0, 0, 0, "Print Debug info");
uiDefButS(block, TOG|BIT|0, 0, "D", 325, (short)(70-20*a), 20, 19, &prop->flag, 0, 0, 0, 0, "Print Debug info");
a++;
prop= prop->next;

@ -1066,10 +1066,10 @@ static void render_panel_render(void)
uiDefButI(block, TOG|BIT|7,0,"x", 665,50,20,23,&G.scene->r.mode, 0, 0, 0, 0, "Disables time difference in field calculations");
uiDefButI(block, TOG|BIT|17,0,"Gauss", 564,30,60,20, &G.scene->r.mode, 0, 0, 0, 0, "Enable Gaussian sampling filter for antialiasing");
uiDefButF(block, NUM,B_DIFF,"", 624,30,60,20,&G.scene->r.gauss,0.5, 1.5, 100, 2, "Sets the Gaussian filter size)");
uiDefButF(block, NUM,B_DIFF,"", 624,30,60,20,&G.scene->r.gauss,0.5, 1.5, 100, 2, "Sets the Gaussian filter size");
uiDefButI(block, TOG|BIT|9,REDRAWVIEWCAM, "Border", 564,10,60,20, &G.scene->r.mode, 0, 0, 0, 0, "Render a small cut-out of the image");
uiDefButI(block, TOG|BIT|2,B_REDR, "Gamma", 624,10,60,20, &G.scene->r.mode, 0, 0, 0, 0, "Enable gamma correction");
uiDefButI(block, TOG|BIT|2,0, "Gamma", 624,10,60,20, &G.scene->r.mode, 0, 0, 0, 0, "Enable gamma correction");
}

@ -3229,7 +3229,7 @@ void ob_to_tex_transob(Object *ob, TransOb *tob)
if(id==0);
else if( GS(id->name)==ID_ME) {
me= ob->data;
me->texflag &= ~ME_AUTOSPACE;
me->texflag &= ~AUTOSPACE;
tob->loc= me->loc;
tob->rot= me->rot;
tob->size= me->size;

@ -991,7 +991,7 @@ void sound_init_audio(void)
hSystem = SYS_GetSystem();
noaudio = SYS_GetCommandLineInt(hSystem,"noaudio",0);
if (1)/*(noaudio) intrr: disable game engine audio (openal) */
if (noaudio)/*(noaudio) intrr: disable game engine audio (openal) */
SND_SetDeviceType(snd_e_dummydevice);
ghAudioDeviceInterface = SND_GetAudioDevice();

@ -53,12 +53,8 @@
#include "KX_PyConstraintBinding.h"
#include "RAS_OpenGLRasterizer.h"
#include "RAS_CheckVertexArrays.h"
#ifdef WIN32
#include "RAS_VAOpenGLRasterizer.h"
#endif
#include "RAS_GLExtensionManager.h"
#include "NG_LoopBackNetworkDeviceInterface.h"
#include "SND_DeviceManager.h"
@ -103,6 +99,9 @@ extern "C" void StartKetsjiShell(struct ScrArea *area,
STR_String exitstring = "";
BlendFileData *bfd= NULL;
RAS_GLExtensionManager *extman = new RAS_GLExtensionManager(SYS_GetCommandLineInt(SYS_GetSystem(), "show_extensions", 1));
extman->LinkExtensions();
do
{
View3D *v3d= (View3D*) area->spacedata.first;
@ -121,17 +120,13 @@ extern "C" void StartKetsjiShell(struct ScrArea *area,
RAS_IRasterizer* rasterizer = NULL;
// let's see if we want to use vertexarrays or not
#ifdef WIN32
int usevta = SYS_GetCommandLineInt(syshandle,"vertexarrays",1);
bool useVertexArrays = (usevta > 0);
if (useVertexArrays && RAS_SystemSupportsVertexArrays())
if (useVertexArrays && extman->QueryVersion(1, 1))
rasterizer = new RAS_VAOpenGLRasterizer(canvas);
else
rasterizer = new RAS_OpenGLRasterizer(canvas);
#else
rasterizer = new RAS_OpenGLRasterizer(canvas);
#endif
// create the inputdevices
KX_BlenderKeyboardDevice* keyboarddevice = new KX_BlenderKeyboardDevice();
@ -374,5 +369,10 @@ extern "C" void StartKetsjiShell(struct ScrArea *area,
}
} while (exitrequested == KX_EXIT_REQUEST_RESTART_GAME || exitrequested == KX_EXIT_REQUEST_START_OTHER_GAME);
if (extman)
{
delete extman;
extman = NULL;
}
if (bfd) BLO_blendfiledata_free(bfd);
}

@ -88,8 +88,7 @@ void KX_BlenderPolyMaterial::Activate(RAS_IRasterizer* rasty, TCachingInfo& cach
rasty->EnableTextures(false);
}
//TF_TWOSIDE == 512, todo, make this a ketsji enum
if(m_drawingmode & 512)
if(m_drawingmode & RAS_IRasterizer::KX_TWOSIDE)
{
rasty->SetCullFace(false);
}
@ -97,6 +96,13 @@ void KX_BlenderPolyMaterial::Activate(RAS_IRasterizer* rasty, TCachingInfo& cach
{
rasty->SetCullFace(true);
}
if (m_drawingmode & RAS_IRasterizer::KX_LINES) {
rasty->SetLines(true);
}
else {
rasty->SetLines(false);
}
}
rasty->SetSpecularity(m_specular[0],m_specular[1],m_specular[2],m_specularity);

@ -62,6 +62,11 @@
#include "STR_String.h"
#include "RAS_BucketManager.h" // for polymaterial (needed for textprinting)
#include "SM_Scene.h"
#include "SumoPhysicsEnvironment.h"
#include "KX_SumoPhysicsController.h"
#include "KX_Scene.h"
KX_BlenderRenderTools::KX_BlenderRenderTools()
{
}
@ -174,29 +179,32 @@ void KX_BlenderRenderTools::applyTransform(RAS_IRasterizer* rasty,double* oglmat
if (objectdrawmode & RAS_IPolyMaterial::SHADOW)
{
// shadow must be cast to the ground, physics system needed here!
// KX_GameObject* gameobj = (KX_GameObject*) this->m_clientobject;
MT_Point3 frompoint(oglmatrix[12],oglmatrix[13],oglmatrix[14]);
KX_GameObject *gameobj = (KX_GameObject*) this->m_clientobject;
MT_Vector3 direction = MT_Vector3(0,0,-1);
direction.normalize();
direction *= 100000;
// MT_Point3 topoint = frompoint + direction;
MT_Point3 topoint = frompoint + direction;
MT_Point3 resultpoint;
MT_Vector3 resultnormal;
//todo:
//use physics abstraction
KX_Scene* kxscene = (KX_Scene*) m_auxilaryClientInfo;
SumoPhysicsEnvironment *spe = dynamic_cast<SumoPhysicsEnvironment *>( kxscene->GetPhysicsEnvironment());
SM_Scene *scene = spe->GetSumoScene();
KX_SumoPhysicsController *spc = dynamic_cast<KX_SumoPhysicsController *>( gameobj->GetPhysicsController());
KX_GameObject *parent = gameobj->GetParent();
if (!spc && parent)
spc = dynamic_cast<KX_SumoPhysicsController *>(parent->GetPhysicsController());
if (parent)
parent->Release();
SM_Object *thisObj = spc?spc->GetSumoObject():NULL;
//SM_Scene* scene = (SM_Scene*) m_auxilaryClientInfo;
//SM_Object* hitObj = scene->rayTest(gameobj->GetSumoObject(),frompoint,topoint,
// resultpoint, resultnormal);
if (0) //hitObj)
if (scene->rayTest(thisObj, frompoint, topoint, resultpoint, resultnormal))
{
MT_Vector3 left(oglmatrix[0],oglmatrix[1],oglmatrix[2]);
MT_Vector3 dir = -(left.cross(resultnormal)).normalized();
@ -209,14 +217,12 @@ void KX_BlenderRenderTools::applyTransform(RAS_IRasterizer* rasty,double* oglmat
resultnormal[0],resultnormal[1],resultnormal[2], 0,
0, 0, 0, 1};
glTranslated(resultpoint[0],resultpoint[1],resultpoint[2]);
glMultMatrixd(maat);
//glMultMatrixd(oglmatrix);
glMultMatrixd(maat);
} else
{
glMultMatrixd(oglmatrix);
}
} else
{

@ -39,7 +39,7 @@ include nan_compile.mk
CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
CPPFLAGS += -I$(OPENGL_HEADERS)
CPPFLAGS += -I$(NAN_SUMO)/include
CPPFLAGS += -I$(NAN_SUMO)/include -I$(NAN_SOLID)/include
CPPFLAGS += -I$(NAN_STRING)/include
CPPFLAGS += -I$(NAN_MOTO)/include
CPPFLAGS += -I$(NAN_BMFONT)/include
@ -65,6 +65,9 @@ CPPFLAGS += -I../SceneGraph
CPPFLAGS += -I../../kernel/gen_system
CPPFLAGS += -I../Network
CPPFLAGS += -I../Network/LoopBackNetwork
CPPFLAGS += -I../Physics/common
CPPFLAGS += -I../Physics/Sumo
ifeq ($(OS),windows)
CPPFLAGS += -I../../blender
endif

@ -1,3 +1,4 @@
import sys
Import ('user_options_dict')
Import ('library_env')
@ -33,7 +34,8 @@ kx_blenderhook_env.Append (CPPPATH=['.',
'#source/gameengine/Expressions',
'#source/gameengine/Network',
'#source/gameengine/SceneGraph',
'#source/gameengine/Physics/Sumo/include',
'#source/gameengine/Physics/common',
'#source/gameengine/Physics/Sumo',
'#source/gameengine/Physics/Sumo/Fuzzics/include',
'#source/gameengine/Network/LoopBackNetwork',
'#intern/SoundSystem',
@ -44,4 +46,7 @@ kx_blenderhook_env.Append (CPPPATH=['.',
kx_blenderhook_env.Append (CPPPATH = user_options_dict['PYTHON_INCLUDE'])
kx_blenderhook_env.Append (CPPPATH = user_options_dict['SOLID_INCLUDE'])
if sys.platform=='win32':
kx_blenderhook_env.Append (CXXFLAGS = ['/GR'])
kx_blenderhook_env.Library (target='#'+user_options_dict['BUILD_DIR']+'/lib/KX_blenderhook', source=source_files)

@ -72,8 +72,8 @@ BL_ActionActuator::~BL_ActionActuator()
}
void BL_ActionActuator::ProcessReplica(){
bPose *oldpose = m_pose;
bPose *oldbpose = m_blendpose;
// bPose *oldpose = m_pose;
// bPose *oldbpose = m_blendpose;
m_pose = NULL;
m_blendpose = NULL;
@ -99,7 +99,6 @@ bool BL_ActionActuator::Update(double curtime,double deltatime)
{
bool bNegativeEvent = false;
bool bPositiveEvent = false;
int numevents = m_events.size();
bool keepgoing = true;
bool wrap = false;
bool apply=true;
@ -114,7 +113,6 @@ bool BL_ActionActuator::Update(double curtime,double deltatime)
i--;
if ((*i)->GetNumber() == 0.0f)
{
int ka=0;
bNegativeEvent = true;
}
else

@ -51,22 +51,23 @@ public:
float stride,
PyTypeObject* T=&Type)
: SCA_IActuator(gameobj,T),
m_blendframe(0),
m_lastpos(0, 0, 0),
m_flag(0),
m_starttime (starttime),
m_endtime(endtime) ,
m_localtime(starttime),
m_lastUpdate(-1),
m_propname(propname),
m_action(action),
m_playtype(playtype),
m_flag(0),
m_blendin(blendin),
m_blendframe(0),
m_pose(NULL),
m_userpose(NULL),
m_blendpose(NULL),
m_priority(priority),
m_stridelength(stride),
m_lastpos(0, 0, 0)
m_pose(NULL),
m_blendpose(NULL),
m_userpose(NULL),
m_propname(propname),
m_action(action)
{
};
virtual ~BL_ActionActuator();

@ -50,9 +50,10 @@ public:
struct bArmature *arm,
struct bPose *pose) :
KX_GameObject(sgReplicationInfo,callbacks),
m_armature(arm),
m_pose(pose),
m_mrdPose(NULL),
m_armature(arm),
m_lastframe(0.),
m_activeAct(NULL),
m_activePriority(999)
{}

@ -62,7 +62,6 @@
#include "KX_ConvertControllers.h"
#include "KX_ConvertSensors.h"
#include "KX_GameObject.h"
#include "SCA_LogicManager.h"
#include "SCA_EventManager.h"
#include "SCA_TimeEventManager.h"
@ -71,6 +70,7 @@
#include "KX_EmptyObject.h"
#include "MT_Point3.h"
#include "MT_Transform.h"
#include "MT_MinMax.h"
#include "SCA_IInputDevice.h"
#include "RAS_TexMatrix.h"
#include "RAS_ICanvas.h"
@ -175,9 +175,9 @@ static unsigned int KX_Mcol2uint_new(MCol col)
unsigned int temp=0;
unsigned char *cp= (unsigned char *)&temp;
cp[3]=255;
cp[2]= col.r;
cp[0]= col.r;
cp[1]= col.g;
cp[0]= col.b;
cp[2]= col.b;
return temp;
}
@ -580,7 +580,7 @@ void my_tex_space_mesh(Mesh *me)
my_boundbox_mesh(me, loc, size);
if(me->texflag & ME_AUTOSPACE) {
if(me->texflag & AUTOSPACE) {
if(me->key) {
kb= me->key->refkey;
if (kb) {
@ -650,9 +650,9 @@ void my_get_local_bounds(Object *ob, float *centre, float *size)
size[1]= 0.5*fabs(bb->vec[0][1] - bb->vec[2][1]);
size[2]= 0.5*fabs(bb->vec[0][2] - bb->vec[1][2]);
centre[0]= (bb->vec[0][0] + bb->vec[4][0])/2.0;
centre[1]= (bb->vec[0][1] + bb->vec[2][1])/2.0;
centre[2]= (bb->vec[0][2] + bb->vec[1][2])/2.0;
centre[0]= 0.5*(bb->vec[0][0] + bb->vec[4][0]);
centre[1]= 0.5*(bb->vec[0][1] + bb->vec[2][1]);
centre[2]= 0.5*(bb->vec[0][2] + bb->vec[1][2]);
}
}
@ -699,13 +699,42 @@ void BL_CreatePhysicsObjectNew(KX_GameObject* gameobj,
objprop.m_ghost = (blenderobject->gameflag & OB_GHOST) != 0;
objprop.m_dynamic_parent=NULL;
objprop.m_isdeformable = ((blenderobject->gameflag2 & 2)) != 0;
objprop.m_implicitsphere = false;
objprop.m_implicitbox = false;
objprop.m_boundclass = objprop.m_dyna?KX_BOUNDSPHERE:KX_BOUNDMESH;
if (blenderobject->dtx & OB_BOUNDBOX)
KX_BoxBounds bb;
my_get_local_bounds(blenderobject,objprop.m_boundobject.box.m_center,bb.m_extends);
if (blenderobject->gameflag & OB_BOUNDS)
{
objprop.m_implicitsphere = (blenderobject->boundtype == OB_BOUND_SPHERE);
objprop.m_implicitbox = (blenderobject->boundtype == OB_BOUND_BOX);
switch (blenderobject->boundtype)
{
case OB_BOUND_BOX:
objprop.m_boundclass = KX_BOUNDBOX;
//mmm, has to be divided by 2 to be proper extends
objprop.m_boundobject.box.m_extends[0]=2.f*bb.m_extends[0];
objprop.m_boundobject.box.m_extends[1]=2.f*bb.m_extends[1];
objprop.m_boundobject.box.m_extends[2]=2.f*bb.m_extends[2];
break;
case OB_BOUND_SPHERE:
{
objprop.m_boundclass = KX_BOUNDSPHERE;
objprop.m_boundobject.c.m_radius = MT_max(bb.m_extends[0], MT_max(bb.m_extends[1], bb.m_extends[2]));
break;
}
case OB_BOUND_CYLINDER:
{
objprop.m_boundclass = KX_BOUNDCYLINDER;
objprop.m_boundobject.c.m_radius = MT_max(bb.m_extends[0], bb.m_extends[1]);
objprop.m_boundobject.c.m_height = 2.f*bb.m_extends[2];
break;
}
case OB_BOUND_CONE:
{
objprop.m_boundclass = KX_BOUNDCONE;
objprop.m_boundobject.c.m_radius = MT_max(bb.m_extends[0], bb.m_extends[1]);
objprop.m_boundobject.c.m_height = 2.f*bb.m_extends[2];
break;
}
}
}
// get Root Parent of blenderobject
@ -724,13 +753,6 @@ void BL_CreatePhysicsObjectNew(KX_GameObject* gameobj,
objprop.m_isactor = (blenderobject->gameflag & OB_ACTOR)!=0;
objprop.m_concave = (blenderobject->boundtype & 4) != 0;
my_get_local_bounds(blenderobject,objprop.m_boundingbox.m_center,objprop.m_boundingbox.m_extends);
//mmm, has to be divided by 2 to be proper extends
objprop.m_boundingbox.m_extends[0]*=2.f;
objprop.m_boundingbox.m_extends[1]*=2.f;
objprop.m_boundingbox.m_extends[2]*=2.f;
switch (physics_engine)
{
case UseSumo:

@ -62,5 +62,4 @@ CValue* BL_DeformableGameObject::GetReplica()
ProcessReplica(replica);
return replica;
}

@ -54,7 +54,7 @@
bool BL_MeshDeformer::Apply(RAS_IPolyMaterial *mat)
{
int i, j, index;
size_t i, j, index;
vecVertexArray array;
vecIndexArrays mvarray;
vecIndexArrays diarray;

@ -49,11 +49,12 @@ public:
void RecalcNormals();
virtual void Relink(GEN_Map<class GEN_HashedPtr, void*>*map){};
BL_MeshDeformer(struct Object* obj, class BL_SkinMeshObject *meshobj):
m_transverts(NULL),
m_tvtot(0),
m_transnors(NULL),
m_pMeshObject(meshobj),
m_bmesh((struct Mesh*)(obj->data)){};
m_bmesh((struct Mesh*)(obj->data)),
m_transnors(NULL),
m_transverts(NULL),
m_tvtot(0)
{};
virtual ~BL_MeshDeformer();
virtual void SetSimulatedTime(double time){};
virtual bool Apply(class RAS_IPolyMaterial *mat);

@ -65,7 +65,7 @@ BL_SkinDeformer::~BL_SkinDeformer()
bool BL_SkinDeformer::Apply(RAS_IPolyMaterial *mat)
{
int i, j, index;
size_t i, j, index;
vecVertexArray array;
#ifdef __NLA_OLDDEFORM
vecMVertArray mvarray;

@ -66,8 +66,8 @@ public:
class BL_SkinMeshObject *mesh)
:BL_MeshDeformer(bmeshobj, mesh),
m_armobj(NULL),
m_defbase(&bmeshobj->defbase),
m_lastUpdate(-1)
m_lastUpdate(-1),
m_defbase(&bmeshobj->defbase)
{
/* Build all precalculatable matrices for bones */

@ -66,7 +66,7 @@ int BL_SkinMeshObject::FindOrAddDeform(int vtxarray, int mv, struct MDeformVert
int numvert = ao->m_MvertArrayCache1[vtxarray]->size();
/* Check to see if this has already been pushed */
for (int i=0; i<ao->m_MvertArrayCache1[vtxarray]->size(); i++){
for (size_t i=0; i<ao->m_MvertArrayCache1[vtxarray]->size(); i++){
if (mv == (*ao->m_MvertArrayCache1[vtxarray])[i])
return i;
}
@ -84,7 +84,7 @@ int BL_SkinMeshObject::FindVertexArray(int numverts,RAS_IPolyMaterial* polymat)
BL_SkinArrayOptimizer* ao = (BL_SkinArrayOptimizer*)GetArrayOptimizer(polymat);
for (int i=0;i<ao->m_VertexArrayCache1.size();i++)
for (size_t i=0;i<ao->m_VertexArrayCache1.size();i++)
{
if ( (ao->m_TriangleArrayCount[i] + (numverts-2)) < BUCKET_MAX_TRIANGLES)
{

@ -114,7 +114,7 @@ public:
int FindVertexArray(int numverts,RAS_IPolyMaterial* polymat);
BL_SkinMeshObject(int lightlayer) : RAS_MeshObject (lightlayer)
{};
{ m_class = 1;};
virtual ~BL_SkinMeshObject(){
};

@ -34,7 +34,6 @@
#endif
#ifdef WIN32
#pragma warning (disable:4786) // suppress stl-MSVC debug info warning
#endif
@ -176,94 +175,66 @@ void KX_BlenderSceneConverter::ConvertScene(const STR_String& scenename,
e_PhysicsEngine physics_engine = UseSumo;
/* FIXME: Force physics engine = sumo.
This isn't really a problem - no other physics engines are available.
if (blenderscene)
{
int i=0;
if (blenderscene->world)
{
switch (blenderscene->world->physicsEngine)
{
case 1:
case 4:
{
physics_engine = UseNone;
break;
};
case 2:
{
physics_engine = UseSumo;
physics_engine = UseODE;
break;
}
case 3:
{
physics_engine = UseODE;
break;
}
case 4:
{
physics_engine = UseDynamo;
break;
}
default:
case 2:
{
physics_engine = UseODE;
}
}
physics_engine = UseSumo;
break;
};
case 0:
{
physics_engine = UseNone;
}
}
}
}
*/
switch (physics_engine)
{
case UseSumo:
{
#ifdef USE_SUMO_SOLID
PHY_IPhysicsEnvironment* physEnv =
new SumoPhysicsEnvironment();
#else
physics_engine = UseNone;
PHY_IPhysicsEnvironment* physEnv =
new DummyPhysicsEnvironment();
#endif
destinationscene ->SetPhysicsEnvironment(physEnv);
case UseSumo:
destinationscene ->SetPhysicsEnvironment(new SumoPhysicsEnvironment());
break;
}
case UseODE:
{
#endif
#ifdef USE_ODE
PHY_IPhysicsEnvironment* physEnv =
new ODEPhysicsEnvironment();
#else
PHY_IPhysicsEnvironment* physEnv =
new DummyPhysicsEnvironment();
case UseODE:
destinationscene ->SetPhysicsEnvironment(new ODEPhysicsEnvironment());
break;
#endif //USE_ODE
destinationscene ->SetPhysicsEnvironment(physEnv);
break;
}
case UseDynamo:
{
}
case UseNone:
{
};
default:
{
physics_engine = UseNone;
PHY_IPhysicsEnvironment* physEnv =
new DummyPhysicsEnvironment();
destinationscene ->SetPhysicsEnvironment(physEnv);
}
default:
physics_engine = UseNone;
destinationscene ->SetPhysicsEnvironment(new DummyPhysicsEnvironment());
break;
}
BL_ConvertBlenderObjects(m_maggie,

@ -618,7 +618,7 @@ void BL_ConvertActuators(char* maggiename,
case ACT_CONSTRAINT:
{
float min = 0.0, max = 0.0;
int locrot;
KX_ConstraintActuator::KX_CONSTRAINTTYPE locrot = KX_ConstraintActuator::KX_ACT_CONSTRAINT_NODEF;
bConstraintActuator *conact
= (bConstraintActuator*) bact->data;
/* convert settings... degrees in the ui become radians */

@ -297,15 +297,13 @@ void BL_ConvertSensors(struct Object* blenderobject,
(blendertouchsensor->name ? blendertouchsensor->name: ""));
//if (gameobj->GetSumoObject())
//{
// gamesensor = 0;
//new KX_TouchSensor(eventmgr,
//gameobj,
//gameobj->GetSumoObject(),
//bFindMaterial,
//touchPropOrMatName);
//}
if (gameobj->GetPhysicsController())
{
gamesensor = new KX_TouchSensor(eventmgr,
gameobj,
bFindMaterial,
touchPropOrMatName);
}
}
@ -324,15 +322,13 @@ void BL_ConvertSensors(struct Object* blenderobject,
touchpropertyname = (char*) (blendertouchsensor->ma->id.name+2);
}
bool bFindMaterial = true;
//if (gameobj->GetSumoObject())
//{
// gamesensor = 0;
//new KX_TouchSensor(eventmgr,
// gameobj,
// gameobj->GetSumoObject(),
// bFindMaterial,
// touchpropertyname);
//}
if (gameobj->GetPhysicsController())
{
gamesensor = new KX_TouchSensor(eventmgr,
gameobj,
bFindMaterial,
touchpropertyname);
}
}
break;
}
@ -380,7 +376,7 @@ void BL_ConvertSensors(struct Object* blenderobject,
//sumoObj->setMargin(blendernearsensor->dist);
//sumoObj->setPosition(gameobj->NodeGetWorldPosition());
bool bFindMaterial = false;
gamesensor = 0;//new KX_NearSensor(eventmgr,gameobj,blendernearsensor->dist,blendernearsensor->resetdist,bFindMaterial,nearpropertyname,kxscene);
gamesensor = new KX_NearSensor(eventmgr,gameobj,blendernearsensor->dist,blendernearsensor->resetdist,bFindMaterial,nearpropertyname,kxscene);
}
break;
@ -514,7 +510,7 @@ void BL_ConvertSensors(struct Object* blenderobject,
case SENS_RADAR:
{
/*
SCA_EventManager* eventmgr = logicmgr->FindEventManager(SCA_EventManager::TOUCH_EVENTMGR);
if (eventmgr)
{
@ -540,14 +536,9 @@ void BL_ConvertSensors(struct Object* blenderobject,
//MT_Scalar coneradius = coneheight * (factor / 2);
MT_Scalar coneradius = coneheight * factor;
DT_ShapeHandle shape = DT_Cone(coneradius,coneheight);
// this sumoObject is not deleted by a gameobj, so delete it ourself
// later (memleaks)!
SM_Object* sumoObj = new SM_Object(shape,NULL,NULL,NULL);
sumoObj->setMargin(0.0);
sumoObj->setPosition(gameobj->NodeGetWorldPosition());
MT_Scalar smallmargin = 0.0;
MT_Scalar largemargin = 0.1;
@ -560,13 +551,12 @@ void BL_ConvertSensors(struct Object* blenderobject,
radaraxis,
smallmargin,
largemargin,
sumoObj,
bFindMaterial,
radarpropertyname,
kxscene);
}
*/
break;
}
case SENS_RAY:
@ -586,15 +576,13 @@ void BL_ConvertSensors(struct Object* blenderobject,
int axis = blenderraysensor->axisflag;
gamesensor = 0;
/*new KX_RaySensor(eventmgr,
gamesensor = new KX_RaySensor(eventmgr,
gameobj,
checkname,
bFindMaterial,
distance,
axis,
kxscene->GetSumoScene());
*/
kxscene);
}
break;

@ -42,7 +42,8 @@ CPPFLAGS += -I$(OPENGL_HEADERS)
CPPFLAGS += -I$(NAN_STRING)/include
CPPFLAGS += -I$(NAN_SOUNDSYSTEM)/include
CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
CPPFLAGS += -I$(NAN_FUZZICS)/include -I$(NAN_SUMO)/include -I$(NAN_MOTO)/include
CPPFLAGS += -I$(NAN_FUZZICS)/include -I$(NAN_SUMO) -I$(NAN_MOTO)/include
CPPFLAGS += -I$(NAN_SOLID)/include
CPPFLAGS += -I../../blender
# these two needed because of blenkernel
CPPFLAGS += -I../../blender/imbuf

@ -50,7 +50,7 @@ kx_converter_env.Append (CPPPATH = ['.',
'#source/gameengine/Physics/common',
'#source/gameengine/Physics/BlOde',
'#source/gameengine/Physics/Dummy',
'#source/gameengine/Physics/Sumo/include',
'#source/gameengine/Physics/Sumo',
'#source/gameengine/Physics/Sumo/Fuzzics/include',
'#source/gameengine/Network/LoopBackNetwork',
'#source/blender/misc',

@ -45,8 +45,8 @@
using namespace std;
SCA_AlwaysEventManager::SCA_AlwaysEventManager(class SCA_LogicManager* logicmgr)
: m_logicmgr(logicmgr),
SCA_EventManager(ALWAYS_EVENTMGR)
: SCA_EventManager(ALWAYS_EVENTMGR),
m_logicmgr(logicmgr)
{
}

@ -156,6 +156,10 @@ PyMethodDef SCA_ISensor::Methods[] = {
METH_VARARGS, GetUseNegPulseMode_doc},
{"setUseNegPulseMode", (PyCFunction) SCA_ISensor::sPySetUseNegPulseMode,
METH_VARARGS, SetUseNegPulseMode_doc},
{"getInvert", (PyCFunction) SCA_ISensor::sPyGetInvert,
METH_VARARGS, GetInvert_doc},
{"setInvert", (PyCFunction) SCA_ISensor::sPySetInvert,
METH_VARARGS, SetInvert_doc},
{NULL,NULL} //Sentinel
};

@ -46,8 +46,8 @@
SCA_KeyboardManager::SCA_KeyboardManager(SCA_LogicManager* logicmgr,
SCA_IInputDevice* inputdev)
: SCA_EventManager(KEYBOARD_EVENTMGR),
m_logicmanager(logicmgr),
m_inputDevice(inputdev)
m_inputDevice(inputdev),
m_logicmanager(logicmgr)
{
}
@ -70,7 +70,7 @@ void SCA_KeyboardManager::NextFrame(double curtime,double deltatime)
{
//const SCA_InputEvent& event = GetEventValue(SCA_IInputDevice::KX_EnumInputs inputcode)=0;
// cerr << "SCA_KeyboardManager::NextFrame"<< endl;
for (int i=0;i<m_sensors.size();i++)
for (unsigned int i=0;i<m_sensors.size();i++)
{
SCA_KeyboardSensor* keysensor = (SCA_KeyboardSensor*)m_sensors[i];
keysensor->Activate(m_logicmanager,NULL);

@ -50,13 +50,6 @@ SCA_LogicManager::SCA_LogicManager()
SCA_LogicManager::~SCA_LogicManager()
{
for (vector<SCA_EventManager*>::iterator it = m_eventmanagers.begin();!(it==m_eventmanagers.end());it++)
{
delete (*it);
}
m_eventmanagers.clear();
m_sensorcontrollermapje.clear();
int numgameobj = m_mapStringToGameObjects.size();
for (int i = 0; i < numgameobj; i++)
{
@ -73,6 +66,12 @@ SCA_LogicManager::~SCA_LogicManager()
delete controllerarray;
}
*/
for (vector<SCA_EventManager*>::iterator it = m_eventmanagers.begin();!(it==m_eventmanagers.end());it++)
{
delete (*it);
}
m_eventmanagers.clear();
m_sensorcontrollermapje.clear();
}

@ -52,8 +52,8 @@
SCA_MouseManager::SCA_MouseManager(SCA_LogicManager* logicmgr,
SCA_IInputDevice* mousedev)
: SCA_EventManager(MOUSE_EVENTMGR),
m_logicmanager(logicmgr),
m_mousedevice (mousedev)
m_mousedevice (mousedev),
m_logicmanager(logicmgr)
{
m_xpos = 0;
m_ypos = 0;
@ -78,7 +78,7 @@ void SCA_MouseManager::NextFrame(double curtime,double deltatime)
{
if (m_mousedevice)
{
for (int i = 0; i < m_sensors.size(); i++)
for (unsigned int i = 0; i < m_sensors.size(); i++)
{
SCA_MouseSensor* mousesensor = (SCA_MouseSensor*) m_sensors[i];
// (0,0) is the Upper Left corner in our local window

@ -47,9 +47,9 @@
SCA_PropertyActuator::SCA_PropertyActuator(SCA_IObject* gameobj,CValue* sourceObj,const STR_String& propname,const STR_String& expr,int acttype,PyTypeObject* T )
: SCA_IActuator(gameobj,T),
m_type(acttype),
m_propname(propname),
m_exprtxt(expr),
m_type(acttype),
m_sourceObj(sourceObj)
{
}

@ -53,12 +53,12 @@ SCA_PropertySensor::SCA_PropertySensor(SCA_EventManager* eventmgr,
KX_PROPSENSOR_TYPE checktype,
PyTypeObject* T )
: SCA_ISensor(gameobj,eventmgr,T),
m_checkpropname(propname),
m_checktype(checktype),
m_checkpropval(propval),
m_checkpropmaxval(propmaxval),
m_checktype(checktype),
m_range_expr(NULL),
m_lastresult(false)
m_checkpropname(propname),
m_lastresult(false),
m_range_expr(NULL)
{
m_recentresult=false;
//CParser pars;

@ -50,9 +50,9 @@ SCA_PythonController* SCA_PythonController::m_sCurrentController = NULL;
SCA_PythonController::SCA_PythonController(SCA_IObject* gameobj,
PyTypeObject* T)
: SCA_IController(gameobj, T),
m_pythondictionary(NULL),
m_bytecode(NULL),
m_bModified(true)
m_bModified(true),
m_pythondictionary(NULL)
{
}
@ -285,10 +285,8 @@ PyObject* SCA_PythonController::PyGetActuators(PyObject* self,
PyObject* args,
PyObject* kwds)
{
int index;
PyObject* resultlist = PyList_New(m_linkedactuators.size());
for (index=0;index<m_linkedactuators.size();index++)
for (unsigned int index=0;index<m_linkedactuators.size();index++)
{
PyList_SetItem(resultlist,index,m_linkedactuators[index]->AddRef());
}
@ -310,8 +308,7 @@ SCA_PythonController::PyGetSensor(PyObject* self,
return NULL;
}
int index;
for (index=0;index<m_linkedsensors.size();index++)
for (unsigned int index=0;index<m_linkedsensors.size();index++)
{
SCA_ISensor* sensor = m_linkedsensors[index];
STR_String realname = sensor->GetName();
@ -341,8 +338,7 @@ SCA_PythonController::PyGetActuator(PyObject* self,
return NULL;
}
int index;
for (index=0;index<m_linkedactuators.size();index++)
for (unsigned int index=0;index<m_linkedactuators.size();index++)
{
SCA_IActuator* actua = m_linkedactuators[index];
STR_String realname = actua->GetName();
@ -363,10 +359,8 @@ SCA_PythonController::PyGetSensors(PyObject* self,
PyObject* args,
PyObject* kwds)
{
int index;
PyObject* resultlist = PyList_New(m_linkedsensors.size());
for (index=0;index<m_linkedsensors.size();index++)
for (unsigned int index=0;index<m_linkedsensors.size();index++)
{
PyList_SetItem(resultlist,index,m_linkedsensors[index]->AddRef());
}

@ -56,10 +56,10 @@ SCA_RandomActuator::SCA_RandomActuator(SCA_IObject *gameobj,
const STR_String &propName,
PyTypeObject* T)
: SCA_IActuator(gameobj, T),
m_distribution(mode),
m_propname(propName),
m_parameter1(para1),
m_parameter2(para2)
m_parameter2(para2),
m_distribution(mode)
{
m_base = new SCA_RandomNumberGenerator(seed);
m_counter = 0;
@ -94,7 +94,7 @@ bool SCA_RandomActuator::Update(double curtime,double deltatime)
RemoveAllEvents();
CValue *tmpval;
CValue *tmpval = NULL;
if (bNegativeEvent)
return false; // do nothing on negative events
@ -241,7 +241,15 @@ bool SCA_RandomActuator::Update(double curtime,double deltatime)
}
break;
default:
; /* unknown distribution... */
{
/* unknown distribution... */
static bool randomWarning = false;
if (!randomWarning) {
randomWarning = true;
std::cout << "RandomActuator '" << GetName() << "' has an unknown distribution." << std::endl;
}
return false;
}
}
/* Round up: assign it */

@ -45,8 +45,8 @@ using namespace std;
#endif
SCA_RandomEventManager::SCA_RandomEventManager(class SCA_LogicManager* logicmgr)
: m_logicmgr(logicmgr),
SCA_EventManager(RANDOM_EVENTMGR)
: SCA_EventManager(RANDOM_EVENTMGR),
m_logicmgr(logicmgr)
{
}

@ -245,13 +245,13 @@ float GPC_Engine::DetermineProgress(void)
void GPC_Engine::UpdateLoadingAnimation(void)
{
int delta;
//int delta;
float progress = DetermineProgress();
if(progress > m_previousProgress)
{
delta = progress - m_previousProgress;
// delta = progress - m_previousProgress;
m_previousProgress = progress;
if(m_previousProgress > 1.0)
m_previousProgress = 1.0; // limit to 1.0 (has to change !)

@ -331,7 +331,7 @@ int my_set_tpage(TFace *tface)
{
int minfilter= fLinearMipMap?GL_LINEAR_MIPMAP_LINEAR:GL_LINEAR_MIPMAP_NEAREST;
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, rectw, recth, GL_RGBA, GL_UNSIGNED_BYTE, rect);
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, rectw, recth, GL_RGBA, GL_UNSIGNED_BYTE, rect);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minfilter);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}

@ -94,6 +94,11 @@
#include "IMB_imbuf_types.h"
// End of Blender includes
#include "SM_Scene.h"
#include "SumoPhysicsEnvironment.h"
#include "KX_SumoPhysicsController.h"
#include "KX_Scene.h"
GPC_RenderTools::GPC_RenderTools()
{
@ -454,8 +459,8 @@ void GPC_RenderTools::applyTransform(RAS_IRasterizer* rasty,double* oglmatrix,in
if (objectdrawmode & RAS_IPolyMaterial::SHADOW)
{
// shadow must be cast to the ground, physics system needed here!
KX_GameObject* gameobj = (KX_GameObject*) this->m_clientobject;
MT_Point3 frompoint(oglmatrix[12],oglmatrix[13],oglmatrix[14]);
KX_GameObject *gameobj = (KX_GameObject*) this->m_clientobject;
MT_Vector3 direction = MT_Vector3(0,0,-1);
@ -466,16 +471,20 @@ void GPC_RenderTools::applyTransform(RAS_IRasterizer* rasty,double* oglmatrix,in
MT_Point3 resultpoint;
MT_Vector3 resultnormal;
//todo: replace by physicsenvironment raycast
//todo:
//use physics abstraction
KX_Scene* kxscene = (KX_Scene*) m_auxilaryClientInfo;
SumoPhysicsEnvironment *spe = dynamic_cast<SumoPhysicsEnvironment *>( kxscene->GetPhysicsEnvironment());
SM_Scene *scene = spe->GetSumoScene();
KX_SumoPhysicsController *spc = dynamic_cast<KX_SumoPhysicsController *>( gameobj->GetPhysicsController());
KX_GameObject *parent = gameobj->GetParent();
if (!spc && parent)
spc = dynamic_cast<KX_SumoPhysicsController *>(parent->GetPhysicsController());
if (parent)
parent->Release();
SM_Object *thisObj = spc?spc->GetSumoObject():NULL;
//SM_Scene* scene = (SM_Scene*) m_auxilaryClientInfo;
SM_Object* hitObj = 0;
//scene->rayTest(gameobj->GetSumoObject(),frompoint,topoint,
// resultpoint, resultnormal);
if (hitObj)
if (scene->rayTest(thisObj, frompoint, topoint, resultpoint, resultnormal))
{
MT_Vector3 left(oglmatrix[0],oglmatrix[1],oglmatrix[2]);
MT_Vector3 dir = -(left.cross(resultnormal)).normalized();
@ -488,14 +497,12 @@ void GPC_RenderTools::applyTransform(RAS_IRasterizer* rasty,double* oglmatrix,in
resultnormal[0],resultnormal[1],resultnormal[2], 0,
0, 0, 0, 1};
glTranslated(resultpoint[0],resultpoint[1],resultpoint[2]);
glMultMatrixd(maat);
//glMultMatrixd(oglmatrix);
glMultMatrixd(maat);
} else
{
glMultMatrixd(oglmatrix);
}
} else
{

@ -52,6 +52,7 @@ CPPFLAGS += -I$(NAN_FUZZICS)/include
CPPFLAGS += -I$(NAN_STRING)/include
CPPFLAGS += -I$(NAN_MOTO)/include
CPPFLAGS += -I$(NAN_SUMO)/include
CPPFLAGS += -I$(NAN_SOLID)/include
CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
CPPFLAGS += -I$(NAN_BMFONT)/include
@ -67,6 +68,8 @@ CPPFLAGS += -I../../../gameengine/Network/LoopBackNetwork
CPPFLAGS += -I../../../gameengine/Rasterizer
CPPFLAGS += -I../../../gameengine/SceneGraph
CPPFLAGS += -I../../../gameengine/Rasterizer/RAS_OpenGLRasterizer
CPPFLAGS += -I../../../gameengine/Physics/Sumo
CPPFLAGS += -I../../../gameengine/Physics/common
###############################

@ -153,6 +153,7 @@ bool GPG_Application::startWindow(STR_String& title,
* so that the client rectangle has the size requested.
*/
m_mainWindow->setClientSize(windowWidth, windowHeight);
m_mainWindow->setCursorVisibility(false);
success = initEngine(m_mainWindow, stereoMode);
if (success) {
@ -179,6 +180,7 @@ bool GPG_Application::startFullScreen(
setting.frequency = frequency;
fSystem->beginFullScreen(setting, &m_mainWindow, stereoVisual);
m_mainWindow->setCursorVisibility(false);
success = initEngine(m_mainWindow, stereoMode);
if (success) {

@ -81,6 +81,7 @@ extern "C"
#include "RAS_IRasterizer.h"
#include "BKE_main.h"
#include "BKE_utildefines.h"
#ifdef WIN32
#ifdef NDEBUG
@ -92,6 +93,8 @@ extern "C"
const int kMinWindowWidth = 100;
const int kMinWindowHeight = 100;
char bprogname[FILE_MAXDIR+FILE_MAXFILE];
void usage(char* program)
{
char * consoleoption;
@ -101,18 +104,19 @@ void usage(char* program)
consoleoption = "";
#endif
printf("usage: %s [-p l t w h] [-f fw fh fb ff] %s[-g gamengineoptions] "
printf("usage: %s -w [-p l t w h] %s[-g gamengineoptions] "
"-s stereomode filename.blend\n", program, consoleoption);
printf(" -w: display in a window\n");
printf(" -p: specify window position\n");
printf(" l = window left coordinate\n");
printf(" t = window top coordinate\n");
printf(" w = window width\n");
printf(" h = window height\n");
printf(" -f: start game in full screen mode\n");
/* printf(" -f: start game in full screen mode\n");
printf(" fw = full screen mode pixel width\n");
printf(" fh = full screen mode pixel height\n");
printf(" fb = full screen mode bits per pixel\n");
printf(" ff = full screen mode frequency\n");
printf(" ff = full screen mode frequency\n"); */
printf(" -s: start player in stereo\n");
printf(" stereomode = hwpageflip or syncdoubling depending on the type of stereo you want\n");
#ifdef _WIN32
@ -204,8 +208,8 @@ int main(int argc, char** argv)
int i;
bool error = false;
SYS_SystemHandle syshandle = SYS_GetSystem();
bool fullScreen = false;
bool fullScreenParFound = false;
bool fullScreen = true;
bool fullScreenParFound = true;
bool windowParFound = false;
bool closeConsole = true;
int stereomode = RAS_IRasterizer::RAS_STEREO_NOSTEREO;
@ -215,8 +219,8 @@ int main(int argc, char** argv)
int windowTop = 100;
int windowWidth = 640;
int windowHeight = 480;
int fullScreenWidth = 640;
int fullScreenHeight= 480;
GHOST_TUns32 fullScreenWidth = 0;
GHOST_TUns32 fullScreenHeight= 0;
int fullScreenBpp = 16;
int fullScreenFrequency = 60;
@ -225,6 +229,7 @@ int main(int argc, char** argv)
signal (SIGFPE, SIG_IGN);
#endif /* __alpha__ */
#endif /* __linux__ */
BLI_where_am_i(bprogname, argv[0]);
#ifdef __APPLE__
// Can't use Carbon right now because of double defined type ID (In Carbon.h and DNA_ID.h, sigh)
@ -315,24 +320,12 @@ int main(int argc, char** argv)
}
break;
case 'f':
case 'w':
// Parse window position and size options
{
fullScreen = true;
i++;
if ((i + 4) < argc)
{
fullScreenWidth = atoi(argv[i++]);
fullScreenHeight = atoi(argv[i++]);
fullScreenBpp = atoi(argv[i++]);
fullScreenFrequency = atoi(argv[i]);
fullScreen = false;
fullScreenParFound = true;
}
else
{
error = true;
printf("error: too few options for fullscreen argument.\n");
}
i++;
}
break;
case 'c':
@ -403,6 +396,7 @@ int main(int argc, char** argv)
GHOST_ISystem* system = GHOST_ISystem::getSystem();
assertd(system);
system->getMainDisplayDimensions(fullScreenWidth, fullScreenHeight);
// process first batch of events. If the user
// drops a file on top off the blenderplayer icon, we
// recieve an event with the filename
@ -570,7 +564,7 @@ int main(int argc, char** argv)
bool run = true;
while (run)
{
system->processEvents(true);
system->processEvents(false);
system->dispatchEvents();
if (exitcode = app.getExitRequested())
{

@ -95,8 +95,8 @@ const MT_Point3 KX_Camera::GetCameraLocation()
//return m_trans1.getOrigin();
//return MT_Point3(0,0,0); <-----
/* .... I want it in world coords */
MT_Transform trans;
trans.setBasis(NodeGetWorldOrientation());
//MT_Transform trans;
//trans.setBasis(NodeGetWorldOrientation());
return NodeGetWorldPosition();
}

@ -183,8 +183,6 @@ bool KX_CameraActuator::Update(double curtime,double deltatime)
MT_Point3 lookat = ((KX_GameObject*)m_ob)->NodeGetWorldPosition();
MT_Matrix3x3 actormat = ((KX_GameObject*)m_ob)->NodeGetWorldOrientation();
float fp1[3], fp2[3], rc[3];
float inp, fac; //, factor = 0.0; /* some factor... */
float mindistsq, maxdistsq, distsq;

@ -55,11 +55,12 @@ private:
double m_ipotime;
public:
KX_CameraIpoSGController() : m_ipotime(0.0),
KX_CameraIpoSGController() :
m_modify_lens(false),
m_modify_clipstart(false),
m_modify_clipend(false),
m_modified(true)
m_modified(true),
m_ipotime(0.0)
{}
~KX_CameraIpoSGController();

@ -35,12 +35,21 @@
/**
* Client Type and Additional Info. This structure can be use instead of a bare void* pointer, for safeness, and additional info for callbacks
*/
struct KX_ClientObjectInfo
{
int m_type;
enum {
STATIC,
ACTOR,
RESERVED1,
RADAR,
NEAR
} m_type;
void* m_clientobject;
void* m_auxilary_info;
public:
KX_ClientObjectInfo(void *clientobject) :
m_clientobject(clientobject)
{}
};
#endif //__KX_CLIENTOBJECT_INFO_H

@ -40,8 +40,11 @@
KX_ConstraintWrapper::KX_ConstraintWrapper(
PHY_ConstraintType ctype,
int constraintId,
PHY_IPhysicsEnvironment* physenv,PyTypeObject *T)
: m_constraintType(ctype),m_constraintId(constraintId),m_physenv(physenv),PyObjectPlus(T)
PHY_IPhysicsEnvironment* physenv,PyTypeObject *T) :
PyObjectPlus(T),
m_constraintId(constraintId),
m_constraintType(ctype),
m_physenv(physenv)
{
}
KX_ConstraintWrapper::~KX_ConstraintWrapper()

@ -32,22 +32,35 @@
#ifndef KX_CONVERTPHYSICSOBJECTS
#define KX_CONVERTPHYSICSOBJECTS
/* These are defined by the build system... */
//#define USE_SUMO_SOLID
//solid is not available yet
#define USE_ODE
//#define USE_ODE
class RAS_MeshObject;
class KX_Scene;
typedef enum {
KX_BOUNDBOX,
KX_BOUNDSPHERE,
KX_BOUNDCYLINDER,
KX_BOUNDCONE,
KX_BOUNDMESH
} KX_BoundBoxClass;
struct KX_Bounds
struct KX_BoxBounds
{
float m_center[3];
float m_extends[3];
};
/* Cone/Cylinder */
struct KX_CBounds
{
float m_radius;
float m_height;
};
struct KX_ObjectProperties
{
bool m_dyna;
@ -59,9 +72,11 @@ struct KX_ObjectProperties
bool m_isactor;
bool m_concave;
bool m_isdeformable;
bool m_implicitsphere ;
bool m_implicitbox;
KX_Bounds m_boundingbox;
KX_BoundBoxClass m_boundclass;
union {
KX_BoxBounds box;
KX_CBounds c;
} m_boundobject;
};
#ifdef USE_ODE

@ -29,7 +29,9 @@
*
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
#ifdef WIN32
#pragma warning (disable : 4786)
#endif
// defines USE_ODE to choose physics engine
#include "KX_ConvertPhysicsObject.h"
@ -63,7 +65,6 @@
// USE_SUMO_SOLID is defined in headerfile KX_ConvertPhysicsObject.h
#ifdef USE_SUMO_SOLID
#include "SumoPhysicsEnvironment.h"
#include "KX_SumoPhysicsController.h"
@ -83,16 +84,15 @@ void BL_RegisterSumoObject(KX_GameObject* gameobj,class SM_Scene* sumoScene,DT_S
DT_ShapeHandle CreateShapeFromMesh(RAS_MeshObject* meshobj);
void KX_ConvertSumoObject( class KX_GameObject* gameobj,
class RAS_MeshObject* meshobj,
class KX_Scene* kxscene,
void KX_ConvertSumoObject( KX_GameObject* gameobj,
RAS_MeshObject* meshobj,
KX_Scene* kxscene,
PHY_ShapeProps* kxshapeprops,
PHY_MaterialProps* kxmaterial,
struct KX_ObjectProperties* objprop)
{
SM_ShapeProps* smprop = new SM_ShapeProps;
smprop->m_ang_drag = kxshapeprops->m_ang_drag;
@ -105,6 +105,7 @@ void KX_ConvertSumoObject( class KX_GameObject* gameobj,
smprop->m_inertia = kxshapeprops->m_inertia;
smprop->m_lin_drag = kxshapeprops->m_lin_drag;
smprop->m_mass = kxshapeprops->m_mass;
smprop->m_radius = objprop->m_radius;
SM_MaterialProps* smmaterial = new SM_MaterialProps;
@ -116,55 +117,48 @@ void KX_ConvertSumoObject( class KX_GameObject* gameobj,
smmaterial->m_friction = kxmaterial->m_friction;
smmaterial->m_restitution = kxmaterial->m_restitution;
class SumoPhysicsEnvironment* sumoEnv =
SumoPhysicsEnvironment* sumoEnv =
(SumoPhysicsEnvironment*)kxscene->GetPhysicsEnvironment();
SM_Scene* sceneptr = sumoEnv->GetSumoScene();
SM_Object* sumoObj=NULL;
if (objprop->m_dyna)
{
DT_ShapeHandle shape = DT_Sphere(0.0);
if (objprop->m_ghost)
DT_ShapeHandle shape = NULL;
switch (objprop->m_boundclass)
{
sumoObj = new SM_Object(shape,NULL,smprop,NULL);
} else
case KX_BOUNDBOX:
shape = DT_NewBox(objprop->m_boundobject.box.m_extends[0], objprop->m_boundobject.box.m_extends[1], objprop->m_boundobject.box.m_extends[2]);
break;
case KX_BOUNDCYLINDER:
shape = DT_NewCylinder(objprop->m_radius, objprop->m_boundobject.c.m_height);
break;
case KX_BOUNDCONE:
shape = DT_NewCone(objprop->m_radius, objprop->m_boundobject.c.m_height);
break;
/* Enabling this allows you to use dynamic mesh objects. It's disabled 'cause it's really slow. */
case KX_BOUNDMESH:
if (meshobj && meshobj->NumPolygons() > 0)
{
sumoObj = new SM_Object(shape,smmaterial,smprop,NULL);
if ((shape = CreateShapeFromMesh(meshobj)))
break;
}
/* If CreateShapeFromMesh fails, fall through and use sphere */
default:
case KX_BOUNDSPHERE:
shape = DT_NewSphere(objprop->m_radius);
break;
}
double radius = objprop->m_radius;
sumoObj = new SM_Object(shape, !objprop->m_ghost?smmaterial:NULL,smprop,NULL);
MT_Scalar margin = radius;//0.5;
sumoObj->setMargin(margin);
sumoObj->setRigidBody(objprop->m_angular_rigidbody?true:false);
//if (bRigidBody)
//{
if (objprop->m_in_active_layer)
{
DT_AddObject(sumoEnv->GetSolidScene(),
sumoObj->getObjectHandle());
}
//}
if (objprop->m_angular_rigidbody)
{
sumoObj->setRigidBody(true);
} else
{
sumoObj->setRigidBody(false);
}
bool isDynamic = true;
bool isActor = true;
BL_RegisterSumoObject(gameobj,sceneptr,sumoEnv->GetSolidScene(),sumoObj,NULL,isDynamic,isActor);
objprop->m_isactor = objprop->m_dyna = true;
BL_RegisterSumoObject(gameobj,sceneptr,sumoEnv->GetSolidScene(),sumoObj,NULL,true, true);
}
else {
@ -172,20 +166,40 @@ void KX_ConvertSumoObject( class KX_GameObject* gameobj,
if (meshobj)
{
int numpolys = meshobj->NumPolygons();
{
DT_ShapeHandle complexshape=0;
if (objprop->m_implicitbox)
{
complexshape = DT_Box(objprop->m_boundingbox.m_extends[0],objprop->m_boundingbox.m_extends[1],objprop->m_boundingbox.m_extends[2]);
} else
switch (objprop->m_boundclass)
{
case KX_BOUNDBOX:
complexshape = DT_NewBox(objprop->m_boundobject.box.m_extends[0], objprop->m_boundobject.box.m_extends[1], objprop->m_boundobject.box.m_extends[2]);
break;
case KX_BOUNDSPHERE:
complexshape = DT_NewSphere(objprop->m_boundobject.c.m_radius);
break;
case KX_BOUNDCYLINDER:
complexshape = DT_NewCylinder(objprop->m_boundobject.c.m_radius, objprop->m_boundobject.c.m_height);
break;
case KX_BOUNDCONE:
complexshape = DT_NewCone(objprop->m_boundobject.c.m_radius, objprop->m_boundobject.c.m_height);
break;
default:
case KX_BOUNDMESH:
if (numpolys>0)
{
complexshape = CreateShapeFromMesh(meshobj);
//std::cout << "Convert Physics Mesh: " << meshobj->GetName() << std::endl;
/* if (!complexshape)
{
// Something has to be done here - if the object has no polygons, it will not be able to have
// sensors attached to it.
DT_Vector3 pt = {0., 0., 0.};
complexshape = DT_NewSphere(1.0);
objprop->m_ghost = evilObject = true;
} */
}
break;
}
if (complexshape)
@ -209,21 +223,7 @@ void KX_ConvertSumoObject( class KX_GameObject* gameobj,
}
if (objprop->m_ghost)
{
sumoObj = new SM_Object(complexshape,NULL,NULL, dynamicParent);
} else
{
sumoObj = new SM_Object(complexshape,smmaterial,NULL, dynamicParent);
}
if (objprop->m_in_active_layer)
{
DT_AddObject(sumoEnv->GetSolidScene(),
sumoObj->getObjectHandle());
}
sumoObj = new SM_Object(complexshape,!objprop->m_ghost?smmaterial:NULL,NULL, dynamicParent);
const STR_String& matname=meshobj->GetMaterialName(0);
@ -232,7 +232,6 @@ void KX_ConvertSumoObject( class KX_GameObject* gameobj,
matname.ReadPtr(),
objprop->m_dyna,
objprop->m_isactor);
}
}
}
@ -265,13 +264,17 @@ void BL_RegisterSumoObject(KX_GameObject* gameobj,class SM_Scene* sumoScene,DT_S
gameobj->SetPhysicsController(physicscontroller);
physicscontroller->setClientInfo(gameobj);
if (!gameobj->getClientInfo())
std::cout << "BL_RegisterSumoObject: WARNING: Object " << gameobj->GetName() << " has no client info" << std::endl;
sumoObj->setClientObject(gameobj->getClientInfo());
gameobj->GetSGNode()->AddSGController(physicscontroller);
//gameobj->GetClientInfo()->m_type = (isActor ? 1 : 0);
gameobj->getClientInfo()->m_type = (isActor ? KX_ClientObjectInfo::ACTOR : KX_ClientObjectInfo::STATIC);
//gameobj->GetClientInfo()->m_clientobject = gameobj;
// store materialname in auxinfo, needed for touchsensors
//gameobj->GetClientInfo()->m_auxilary_info = (matname? (void*)(matname+2) : NULL);
gameobj->getClientInfo()->m_auxilary_info = (matname? (void*)(matname+2) : NULL);
physicscontroller->SetObject(gameobj->GetSGNode());
@ -279,8 +282,6 @@ void BL_RegisterSumoObject(KX_GameObject* gameobj,class SM_Scene* sumoScene,DT_S
};
DT_ShapeHandle CreateShapeFromMesh(RAS_MeshObject* meshobj)
{
@ -290,9 +291,6 @@ DT_ShapeHandle CreateShapeFromMesh(RAS_MeshObject* meshobj)
return *shapeptr;
}
// todo: shared meshes
DT_ShapeHandle shape = DT_NewComplexShape();
int p=0;
int numpolys = meshobj->NumPolygons();
if (!numpolys)
{
@ -300,35 +298,77 @@ DT_ShapeHandle CreateShapeFromMesh(RAS_MeshObject* meshobj)
}
int numvalidpolys = 0;
for (p=0;p<meshobj->m_triangle_indices.size();p++)
for (int p=0; p<numpolys; p++)
{
RAS_TriangleIndex& idx = meshobj->m_triangle_indices[p];
RAS_Polygon* poly = meshobj->GetPolygon(p);
// only add polygons that have the collisionflag set
if (idx.m_collider)
if (poly->IsCollider())
{
DT_Begin();
for (int v=0;v<3;v++)
{
int num = meshobj->m_xyz_index_to_vertex_index_mapping[idx.m_index[v]].size();
if (num != 1)
{
int i=0;
numvalidpolys++;
break;
}
RAS_MatArrayIndex& vertindex = meshobj->m_xyz_index_to_vertex_index_mapping[idx.m_index[v]][0];
}
if (numvalidpolys < 1)
return NULL;
DT_ShapeHandle shape = DT_NewComplexShape(NULL);
numvalidpolys = 0;
for (int p2=0; p2<numpolys; p2++)
{
RAS_Polygon* poly = meshobj->GetPolygon(p2);
// only add polygons that have the collisionflag set
if (poly->IsCollider())
{ /* We have to tesselate here because SOLID can only raycast triangles */
DT_Begin();
DT_Vector3 pt;
/* V1 */
meshobj->GetVertex(poly->GetVertexIndexBase().m_vtxarray,
poly->GetVertexIndexBase().m_indexarray[0],
poly->GetMaterial()->GetPolyMaterial())->xyz().getValue(pt);
DT_Vertex(pt);
/* V2 */
meshobj->GetVertex(poly->GetVertexIndexBase().m_vtxarray,
poly->GetVertexIndexBase().m_indexarray[1],
poly->GetMaterial()->GetPolyMaterial())->xyz().getValue(pt);
DT_Vertex(pt);
/* V3 */
meshobj->GetVertex(poly->GetVertexIndexBase().m_vtxarray,
poly->GetVertexIndexBase().m_indexarray[2],
poly->GetMaterial()->GetPolyMaterial())->xyz().getValue(pt);
DT_Vertex(pt);
numvalidpolys++;
{
const MT_Point3& pt = meshobj->GetVertex(vertindex.m_array,
vertindex.m_index,
(RAS_IPolyMaterial*)vertindex.m_matid)->xyz();
DT_Vertex(pt[0],pt[1],pt[2]);
}
}
DT_End();
if (poly->VertexCount() == 4)
{
DT_Begin();
/* V1 */
meshobj->GetVertex(poly->GetVertexIndexBase().m_vtxarray,
poly->GetVertexIndexBase().m_indexarray[0],
poly->GetMaterial()->GetPolyMaterial())->xyz().getValue(pt);
DT_Vertex(pt);
/* V3 */
meshobj->GetVertex(poly->GetVertexIndexBase().m_vtxarray,
poly->GetVertexIndexBase().m_indexarray[2],
poly->GetMaterial()->GetPolyMaterial())->xyz().getValue(pt);
DT_Vertex(pt);
/* V4 */
meshobj->GetVertex(poly->GetVertexIndexBase().m_vtxarray,
poly->GetVertexIndexBase().m_indexarray[3],
poly->GetMaterial()->GetPolyMaterial())->xyz().getValue(pt);
DT_Vertex(pt);
numvalidpolys++;
DT_End();
}
}
}
@ -340,7 +380,7 @@ DT_ShapeHandle CreateShapeFromMesh(RAS_MeshObject* meshobj)
return shape;
}
// memleak... todo: delete shape
delete shape;
return NULL;
}

@ -113,6 +113,7 @@ bool KX_GameActuator::Update(double curtime, double deltatime)
{
STR_String exitstring = "restarting game";
m_ketsjiengine->RequestExit(KX_EXIT_REQUEST_RESTART_GAME);
m_ketsjiengine->SetNameNextGame(m_filename);
m_scene->AddDebugProperty((this)->GetParent(), exitstring);
}
break;
@ -146,7 +147,7 @@ bool KX_GameActuator::Update(double curtime, double deltatime)
PyTypeObject KX_GameActuator::Type = {
PyObject_HEAD_INIT(&PyType_Type)
0,
"KX_SceneActuator",
"KX_GameActuator",
sizeof(KX_GameActuator),
0,
PyDestructor,
@ -177,9 +178,39 @@ PyParentObject KX_GameActuator::Parents[] =
PyMethodDef KX_GameActuator::Methods[] =
{
{"getFile", (PyCFunction) KX_GameActuator::sPyGetFile, METH_VARARGS, GetFile_doc},
{"setFile", (PyCFunction) KX_GameActuator::sPySetFile, METH_VARARGS, SetFile_doc},
{NULL,NULL} //Sentinel
};
/* getFile */
char KX_GameActuator::GetFile_doc[] =
"getFile()\n"
"get the name of the file to start.\n";
PyObject* KX_GameActuator::PyGetFile(PyObject* self, PyObject* args, PyObject* kwds)
{
return PyString_FromString(m_filename);
}
/* setFile */
char KX_GameActuator::SetFile_doc[] =
"setFile(name)\n"
"set the name of the file to start.\n";
PyObject* KX_GameActuator::PySetFile(PyObject* self, PyObject* args, PyObject* kwds)
{
char* new_file;
if (!PyArg_ParseTuple(args, "s", &new_file))
{
return NULL;
}
m_filename = STR_String(new_file);
Py_Return;
}
PyObject* KX_GameActuator::_getattr(char* attr)

@ -78,7 +78,8 @@ class KX_GameActuator : public SCA_IActuator
/* --------------------------------------------------------------------- */
virtual PyObject* _getattr(char *attr);
KX_PYMETHOD_DOC(KX_GameActuator,GetFile);
KX_PYMETHOD_DOC(KX_GameActuator,SetFile);
}; /* end of class KX_GameActuator */

@ -66,14 +66,15 @@ KX_GameObject::KX_GameObject(
PyTypeObject* T
) :
SCA_IObject(T),
m_bUseObjectColor(false),
m_bDyna(false),
m_bSuspendDynamics(false),
m_pPhysicsController1(NULL),
m_bVisible(true)
m_bUseObjectColor(false),
m_bVisible(true),
m_pPhysicsController1(NULL)
{
m_ignore_activity_culling = false;
m_pClient_info = new KX_ClientObjectInfo();
m_pClient_info = new KX_ClientObjectInfo(this);
m_pClient_info->m_type = KX_ClientObjectInfo::ACTOR;
m_pSGNode = new SG_Node(this,sgReplicationInfo,callbacks);
// define the relationship between this node and it's parent.
@ -222,27 +223,26 @@ void KX_GameObject::ApplyTorque(const MT_Vector3& torque,bool local)
void KX_GameObject::ApplyMovement(const MT_Vector3& dloc,bool local)
{
if (this->IsDynamic())
if (m_pPhysicsController1) // (IsDynamic())
{
m_pPhysicsController1->RelativeTranslate(dloc,local);
}
else
{
GetSGNode()->RelativeTranslate(dloc,GetSGNode()->GetSGParent(),local);
}
}
void KX_GameObject::ApplyRotation(const MT_Vector3& drot,bool local)
{
MT_Matrix3x3 rotmat(drot);
rotmat.transpose();
if (this->IsDynamic()) //m_pPhysicsController)
m_pPhysicsController1->RelativeRotate(rotmat.transposed(),local);
else
//if (m_pPhysicsController1) // (IsDynamic())
// m_pPhysicsController1->RelativeRotate(rotmat_,local);
// in worldspace
GetSGNode()->RelativeRotate(rotmat.transposed(),local);
GetSGNode()->RelativeRotate(rotmat,local);
if (m_pPhysicsController1)
m_pPhysicsController1->setOrientation(NodeGetWorldOrientation().getRotation());
}
@ -273,7 +273,7 @@ void KX_GameObject::Bucketize()
{
double* fl = GetOpenGLMatrix();
for (int i=0;i<m_meshes.size();i++)
for (size_t i=0;i<m_meshes.size();i++)
m_meshes[i]->Bucketize(fl, this, m_bUseObjectColor, m_objectColor);
}
@ -283,7 +283,7 @@ void KX_GameObject::RemoveMeshes()
{
double* fl = GetOpenGLMatrix();
for (int i=0;i<m_meshes.size();i++)
for (size_t i=0;i<m_meshes.size();i++)
m_meshes[i]->RemoveFromBuckets(fl, this);
//note: meshes can be shared, and are deleted by KX_BlenderSceneConverter
@ -315,7 +315,7 @@ void KX_GameObject::UpdateTransform()
void KX_GameObject::SetDebugColor(unsigned int bgra)
{
for (int i=0;i<m_meshes.size();i++)
for (size_t i=0;i<m_meshes.size();i++)
m_meshes[i]->DebugColor(bgra);
}
@ -411,9 +411,9 @@ KX_GameObject::MarkVisible(
* determined on this level. Maybe change this to mesh level
* later on? */
for (int i=0;i<m_meshes.size();i++)
{
double* fl = GetOpenGLMatrix();
for (size_t i=0;i<m_meshes.size();i++)
{
m_meshes[i]->MarkVisible(fl,this,visible,m_bUseObjectColor,m_objectColor);
}
}
@ -424,10 +424,10 @@ void
KX_GameObject::MarkVisible(
void
)
{
for (int i=0;i<m_meshes.size();i++)
{
double* fl = GetOpenGLMatrix();
for (size_t i=0;i<m_meshes.size();i++)
{
m_meshes[i]->MarkVisible(fl,
this,
m_bVisible,
@ -439,8 +439,8 @@ KX_GameObject::MarkVisible(
void KX_GameObject::addLinearVelocity(const MT_Vector3& lin_vel,bool local)
{
// if (m_pPhysicsController1)
// m_pPhysicsController1->AddLinearVelocity(lin_vel,local);
if (m_pPhysicsController1)
m_pPhysicsController1->SetLinearVelocity(lin_vel + m_pPhysicsController1->GetLinearVelocity(),local);
}
@ -972,7 +972,6 @@ PyObject* KX_GameObject::PyGetOrientation(PyObject* self,
int row,col;
const MT_Matrix3x3& orient = NodeGetWorldOrientation();
int index = 0;
for (row=0;row<3;row++)
{
PyObject* veclist = PyList_New(3);

@ -217,7 +217,7 @@ public:
* instance allocated on the heap. Ownership of the new
* object belongs with the caller.
*/
CValue*
virtual CValue*
GetReplica(
);
@ -225,7 +225,7 @@ public:
* Inherited from CValue -- Makes sure any internal
* data owned by this class is deep copied. Called internally
*/
void
virtual void
ProcessReplica(
KX_GameObject* replica
);
@ -340,6 +340,9 @@ public:
m_pSGNode = node;
}
/**
* Deprecated & broken
*/
bool
IsDynamic(
) const {
@ -549,6 +552,7 @@ public:
*/
void Resume(void);
KX_ClientObjectInfo* getClientInfo() { return m_pClient_info; }
/**
* @section Python interface functions.
*/

@ -44,17 +44,18 @@
#include "KX_IPO_SGController.h"
#include "KX_ScalarInterpolator.h"
#include "KX_GameObject.h"
#include "KX_IPhysicsController.h"
// All objects should start on frame 1! Will we ever need an object to
// start on another frame, the 1.0 should change.
KX_IpoSGController::KX_IpoSGController()
: m_ipotime(1.0),
m_modify_position(false),
: m_modify_position(false),
m_modify_orientation(false),
m_modify_scaling(false),
m_modified(true),
m_ipo_as_force(false),
m_force_ipo_acts_local(false)
m_force_ipo_acts_local(false),
m_modified(true),
m_ipotime(1.0)
{
m_sumo_object = NULL;
m_game_object = NULL;
@ -121,6 +122,11 @@ bool KX_IpoSGController::Update(double currentTime)
m_sumo_object->calcXform();
}
*/
if (m_game_object && ob) {
m_game_object->GetPhysicsController()->ApplyForce(m_force_ipo_acts_local ?
ob->GetWorldOrientation() * m_ipo_xform.GetPosition() :
m_ipo_xform.GetPosition(), false);
}
} else {
ob->SetLocalPosition(m_ipo_xform.GetPosition());
@ -137,6 +143,11 @@ bool KX_IpoSGController::Update(double currentTime)
m_sumo_object->calcXform();
}
*/
if (m_game_object && ob) {
m_game_object->ApplyTorque(m_force_ipo_acts_local ?
ob->GetWorldOrientation() * m_ipo_xform.GetEulerAngles() :
m_ipo_xform.GetEulerAngles(), false);
}
} else {
ob->SetLocalOrientation(MT_Matrix3x3(m_ipo_xform.GetEulerAngles()));

@ -38,8 +38,8 @@
KX_IPhysicsController::KX_IPhysicsController(bool dyna,void* userdata)
: m_bDyna(dyna),
m_userdata(userdata),
m_suspendDynamics(false)
m_suspendDynamics(false),
m_userdata(userdata)
{
};

@ -89,7 +89,6 @@ public:
};
KX_IpoActuator::KX_IpoActuator(SCA_IObject* gameobj,
const STR_String& propname,
float starttime,
@ -100,16 +99,16 @@ KX_IpoActuator::KX_IpoActuator(SCA_IObject* gameobj,
bool force_ipo_local,
PyTypeObject* T)
: SCA_IActuator(gameobj,T),
m_bNegativeEvent(false),
m_starttime (starttime),
m_endtime(endtime),
m_localtime(starttime),
m_recurse(recurse),
m_type((IpoActType)acttype) ,
m_localtime(starttime),
m_direction(1),
m_bNegativeEvent(false),
m_propname(propname),
m_ipo_as_force(ipo_as_force),
m_force_ipo_local(force_ipo_local)
m_force_ipo_local(force_ipo_local),
m_type((IpoActType)acttype)
{
// intentionally empty
}

@ -102,9 +102,10 @@ const char KX_KetsjiEngine::m_profileLabels[tc_numCategories][15] = {
* Constructor of the Ketsji Engine
*/
KX_KetsjiEngine::KX_KetsjiEngine(KX_ISystem* system)
: m_bInitialized(false),
m_activecam(0),
m_rasterizer(NULL)
:
m_rasterizer(NULL),
m_bInitialized(false),
m_activecam(0)
{
m_kxsystem = system;
m_bFixedTime = false;
@ -587,6 +588,8 @@ void KX_KetsjiEngine::DoSound(KX_Scene* scene)
m_logger->StartLog(tc_sound, m_kxsystem->GetTimeInSeconds(), true);
KX_Camera* cam = scene->GetActiveCamera();
if (!cam)
return;
MT_Point3 listenerposition = cam->NodeGetWorldPosition();
MT_Vector3 listenervelocity = cam->GetLinearVelocity();
MT_Matrix3x3 listenerorientation = cam->NodeGetWorldOrientation();
@ -735,6 +738,9 @@ void KX_KetsjiEngine::RenderFrame(KX_Scene* scene)
float left, right, bottom, top, nearfrust, farfrust;
KX_Camera* cam = scene->GetActiveCamera();
if (!cam)
return;
m_rasterizer->DisplayFog();
if (m_overrideCam && (scene->GetName() == m_overrideSceneName) && m_overrideCamUseOrtho) {
@ -998,8 +1004,8 @@ void KX_KetsjiEngine::RemoveScene(const STR_String& scenename)
}
else
{
STR_String tmpname = scenename;
printf("warning: scene %s does not exist, not removed!\n",tmpname.Ptr());
// STR_String tmpname = scenename;
std::cout << "warning: scene " << scenename << " does not exist, not removed!" << std::endl;
}
}

@ -55,11 +55,12 @@ private:
double m_ipotime;
public:
KX_LightIpoSGController() : m_ipotime(0.0),
KX_LightIpoSGController() :
m_modify_energy(false),
m_modify_color(false),
m_modify_dist(false),
m_modified(true)
m_modified(true),
m_ipotime(0.0)
{}
virtual ~KX_LightIpoSGController();

@ -51,6 +51,11 @@
#include "KX_Camera.h"
#include "KX_MouseFocusSensor.h"
#include "KX_ClientObjectInfo.h"
#include "SM_Object.h"
#include "SM_Scene.h"
#include "SumoPhysicsEnvironment.h"
/* ------------------------------------------------------------------------- */
/* Native functions */
/* ------------------------------------------------------------------------- */
@ -233,23 +238,23 @@ bool KX_MouseFocusSensor::ParentObjectHasFocus(void)
* ignore-object. We don't ignore anything... */
KX_GameObject* thisObj = (KX_GameObject*) GetParent();
SumoPhysicsEnvironment *spe = dynamic_cast<SumoPhysicsEnvironment* > (m_kxscene->GetPhysicsEnvironment());
SM_Scene *sumoScene = spe->GetSumoScene();
//SM_Object* hitSMObj = m_sumoScene->rayTest(NULL,
// frompoint3,
// topoint3,
// resultpoint,
// resultnormal);
KX_GameObject* hitKXObj = 0;
SM_Object* hitSMObj = sumoScene->rayTest(NULL,
frompoint3,
topoint3,
resultpoint,
resultnormal);
/* all this casting makes me nervous... */
//SM_ClientObjectInfo* client_info
// = ( hitSMObj ?
// (SM_ClientObjectInfo*) ((SM_Object*)hitSMObj)->getClientObject() :
// NULL);
//KX_GameObject* hitKXObj = ( client_info ?
// (KX_GameObject*)client_info->m_clientobject :
// NULL);
KX_ClientObjectInfo* client_info
= ( hitSMObj ?
(KX_ClientObjectInfo*) ((SM_Object*)hitSMObj)->getClientObject() :
NULL);
KX_GameObject* hitKXObj = ( client_info ?
(KX_GameObject*)client_info->m_clientobject :
NULL);
/* Is this me? In the ray test, there are a lot of extra checks

@ -38,11 +38,40 @@
#include "KX_TouchEventManager.h"
#include "KX_Scene.h" // needed to create a replica
#include "SM_Object.h"
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
KX_NearSensor::KX_NearSensor(SCA_EventManager* eventmgr,
KX_GameObject* gameobj,
void *vshape,
double margin,
double resetmargin,
bool bFindMaterial,
const STR_String& touchedpropname,
class KX_Scene* scene,
PyTypeObject* T)
:KX_TouchSensor(eventmgr,
gameobj,
bFindMaterial,
touchedpropname,
/* scene, */
T),
m_Margin(margin),
m_ResetMargin(resetmargin)
#ifdef PHYSICS_NOT_YET
{
m_client_info = new KX_ClientObjectInfo(gameobj);
m_client_info->m_type = KX_ClientObjectInfo::NEAR;
DT_ShapeHandle shape = (DT_ShapeHandle) vshape;
m_sumoObj = new SM_Object(shape,NULL,NULL,NULL);
m_sumoObj->setMargin(m_Margin);
m_sumoObj->setClientObject(m_client_info);
SynchronizeTransform();
}
KX_NearSensor::KX_NearSensor(SCA_EventManager* eventmgr,
KX_GameObject* gameobj,
@ -56,20 +85,27 @@ KX_NearSensor::KX_NearSensor(SCA_EventManager* eventmgr,
gameobj,
bFindMaterial,
touchedpropname,
scene,
/* scene, */
T),
m_Margin(margin),
m_ResetMargin(resetmargin),
m_sumoScene(sumoscene)
m_ResetMargin(resetmargin)
{
m_client_info.m_type = 4;
m_client_info.m_clientobject = gameobj;
m_client_info.m_auxilary_info = NULL;
sumoObj->setClientObject(&m_client_info);
m_client_info = new KX_ClientObjectInfo(gameobj);
m_client_info->m_type = KX_ClientObjectInfo::NEAR;
m_client_info->m_auxilary_info = NULL;
m_sumoObj = new SM_Object(DT_NewSphere(0.0),NULL,NULL,NULL);
m_sumoObj->setMargin(m_Margin);
m_sumoObj->setClientObject(m_client_info);
SynchronizeTransform();
}
void KX_NearSensor::RegisterSumo(KX_TouchEventManager *touchman)
{
touchman->GetSumoScene()->addSensor(*m_sumoObj);
}
CValue* KX_NearSensor::GetReplica()
{
@ -82,6 +118,16 @@ CValue* KX_NearSensor::GetReplica()
// this will copy properties and so on...
CValue::AddDataToReplica(replica);
replica->m_client_info = new KX_ClientObjectInfo(m_client_info->m_clientobject);
replica->m_client_info->m_type = KX_ClientObjectInfo::NEAR;
replica->m_client_info->m_auxilary_info = NULL;
replica->m_sumoObj = new SM_Object(DT_NewSphere(0.0),NULL,NULL,NULL);
replica->m_sumoObj->setMargin(m_Margin);
replica->m_sumoObj->setClientObject(replica->m_client_info);
replica->SynchronizeTransform();
return replica;
}
@ -89,42 +135,11 @@ CValue* KX_NearSensor::GetReplica()
void KX_NearSensor::ReParent(SCA_IObject* parent)
{
DT_ShapeHandle shape = DT_Sphere(0.0);
// this sumoObject is not deleted by a gameobj, so delete it ourself
// later (memleaks)!
SM_Object* sumoObj = new SM_Object(shape,NULL,NULL,NULL);
sumoObj->setMargin(m_Margin);
//sumoObj->setPosition(gameobj->NodeGetWorldPosition());
//sumoobj->setPosition(m_sumoObj->getPosition());
//sumoobj->setOrientation(m_sumoObj->getOrientation());
//newobj->setRigidBody(this->m_sumoObj->isRigidBody());
m_sumoObj = sumoObj;
m_solidHandle = m_sumoObj->getObjectHandle();
double radius = m_sumoObj->getMargin();
sumoObj->setMargin(m_sumoObj->getMargin());
m_client_info.m_type = 4;
m_client_info.m_clientobject = parent;
m_client_info.m_auxilary_info = NULL;
sumoObj->setClientObject(&m_client_info);
//m_sumoScene->add(*newobj);
if (m_sumoObj)
{
DT_SetObjectResponse(m_resptable,
m_sumoObj->getObjectHandle(),
collisionResponse,
DT_SIMPLE_RESPONSE,
this);
}
SCA_ISensor::ReParent(parent);
m_client_info->m_clientobject = static_cast<KX_GameObject*>(parent);
SynchronizeTransform();
}
@ -133,19 +148,20 @@ KX_NearSensor::~KX_NearSensor()
{
// for nearsensor, the sensor is the 'owner' of sumoobj
// for touchsensor, it's the parent
m_sumoScene->remove(*m_sumoObj);
static_cast<KX_TouchEventManager*>(m_eventmgr)->GetSumoScene()->remove(*m_sumoObj);
if (m_sumoObj)
delete m_sumoObj;
}
if (m_client_info)
delete m_client_info;
}
bool KX_NearSensor::Evaluate(CValue* event)
{
bool result = false;
KX_GameObject* parent = (KX_GameObject*)GetParent();
KX_GameObject* parent = static_cast<KX_GameObject*>(GetParent());
if (m_bTriggered != m_bLastTriggered)
{
@ -172,28 +188,27 @@ bool KX_NearSensor::Evaluate(CValue* event)
void KX_NearSensor::HandleCollision(void* obj1,void* obj2,const DT_CollData * coll_data)
DT_Bool KX_NearSensor::HandleCollision(void* obj1,void* obj2,const DT_CollData * coll_data)
{
KX_TouchEventManager* toucheventmgr = (KX_TouchEventManager*)m_eventmgr;
KX_GameObject* parent = (KX_GameObject*)GetParent();
KX_TouchEventManager* toucheventmgr = static_cast<KX_TouchEventManager*>(m_eventmgr);
KX_GameObject* parent = static_cast<KX_GameObject*>(GetParent());
// need the mapping from SM_Objects to gameobjects now
SM_ClientObjectInfo* client_info =(SM_ClientObjectInfo*) (obj1 == m_sumoObj?
KX_ClientObjectInfo* client_info =static_cast<KX_ClientObjectInfo*> (obj1 == m_sumoObj?
((SM_Object*)obj2)->getClientObject() :
((SM_Object*)obj1)->getClientObject());
KX_GameObject* gameobj = ( client_info ?
(KX_GameObject*)client_info->m_clientobject :
static_cast<KX_GameObject*>(client_info->m_clientobject) :
NULL);
if (gameobj && (gameobj != parent))
{
if (!m_colliders->SearchValue(gameobj))
m_colliders->Add(gameobj->AddRef());
// only take valid colliders
if (client_info->m_type == 1)
if (client_info->m_type == KX_ClientObjectInfo::ACTOR)
{
if ((m_touchedpropname.Length() == 0) ||
(gameobj->GetProperty(m_touchedpropname)))
@ -202,10 +217,9 @@ void KX_NearSensor::HandleCollision(void* obj1,void* obj2,const DT_CollData * co
m_hitObject = gameobj;
}
}
} else
{
}
return DT_CONTINUE;
}
@ -262,4 +276,3 @@ KX_NearSensor::_getattr(char* attr)
_getattr_up(KX_TouchSensor);
}
#endif //PHYSICS_NOT_YET

@ -36,8 +36,10 @@
#define KX_NEARSENSOR_H
#include "KX_TouchSensor.h"
#include "KX_ClientObjectInfo.h"
class KX_Scene;
class KX_ClientObjectInfo;
class KX_NearSensor : public KX_TouchSensor
{
@ -45,16 +47,35 @@ class KX_NearSensor : public KX_TouchSensor
double m_Margin;
double m_ResetMargin;
KX_Scene* m_scene;
KX_ClientObjectInfo* m_client_info;
protected:
KX_NearSensor(class SCA_EventManager* eventmgr,
class KX_GameObject* gameobj,
void *shape,
double margin,
double resetmargin,
bool bFindMaterial,
const STR_String& touchedpropname,
class KX_Scene* scene,
PyTypeObject* T=&Type);
public:
KX_NearSensor(class SCA_EventManager* eventmgr,class KX_GameObject* gameobj,double margin,double resetmargin,bool bFindMaterial,const STR_String& touchedpropname,class KM_Scene* scene,PyTypeObject* T=&Type);
KX_NearSensor(class SCA_EventManager* eventmgr,
class KX_GameObject* gameobj,
double margin,
double resetmargin,
bool bFindMaterial,
const STR_String& touchedpropname,
class KX_Scene* scene,
PyTypeObject* T=&Type);
virtual ~KX_NearSensor();
virtual CValue* GetReplica();
virtual bool Evaluate(CValue* event);
virtual void ReParent(SCA_IObject* parent);
//virtual void HandleCollision(void* obj1,void* obj2,
// const DT_CollData * coll_data);
virtual DT_Bool HandleCollision(void* obj1,void* obj2,
const DT_CollData * coll_data);
virtual void RegisterSumo(KX_TouchEventManager *touchman);
virtual PyObject* _getattr(char *attr);

@ -48,9 +48,9 @@ private:
double m_ipotime;
public:
KX_ObColorIpoSGController() : m_ipotime(0.0),
m_modified(true)
KX_ObColorIpoSGController() :
m_modified(true),
m_ipotime(0.0)
{}
virtual ~KX_ObColorIpoSGController();
virtual SG_Controller* GetReplica(class SG_Node* destnode);

@ -44,7 +44,6 @@
/* Native functions */
/* ------------------------------------------------------------------------- */
KX_ObjectActuator::
KX_ObjectActuator(
SCA_IObject* gameobj,
@ -64,8 +63,8 @@ KX_ObjectActuator(
m_drot(drot),
m_linear_velocity(linV),
m_angular_velocity(angV),
m_active_combined_velocity (false),
m_bitLocalFlag (flag)
m_bitLocalFlag (flag),
m_active_combined_velocity (false)
{
}
@ -83,6 +82,11 @@ bool KX_ObjectActuator::Update(double curtime,double deltatime)
// it should reconcile the externally set velocity with it's
// own velocity.
if (m_active_combined_velocity) {
static bool update_resolve_warning = 0;
if (!update_resolve_warning) {
update_resolve_warning = 1;
std::cout << "FIXME: KX_ObjectActuator::Update ResolveCombinedVelocities undefined!" << std::endl;
}
//if (parent->GetSumoObject()) {
//parent->GetPhysicsController()->ResolveCombinedVelocities(
// m_linear_velocity,

@ -34,11 +34,12 @@
enum e_PhysicsEngine
{
UseNone=1,
UseSumo,
UseODE,
UseDynamo,
NoSelection
NoSelection = -1,
UseNone = 0,
UseEnji = 1,
UseSumo = 2,
UseDynamo = 3,
UseODE = 4
};
#endif //__KX_PHYSICSENGINEENUMS

@ -40,8 +40,10 @@
KX_PhysicsObjectWrapper::KX_PhysicsObjectWrapper(
PHY_IPhysicsController* ctrl,
PHY_IPhysicsEnvironment* physenv,PyTypeObject *T)
: m_ctrl(ctrl),m_physenv(physenv),PyObjectPlus(T)
PHY_IPhysicsEnvironment* physenv,PyTypeObject *T) :
PyObjectPlus(T),
m_ctrl(ctrl),
m_physenv(physenv)
{
}

@ -39,11 +39,8 @@
/**
* RadarSensor constructor. Creates a near-sensor derived class, with a cone collision shape.
*/
#ifdef PHYSICS_NOT_YET
KX_RadarSensor::KX_RadarSensor(class SCA_EventManager* eventmgr,
class KX_GameObject* gameobj,
KX_RadarSensor::KX_RadarSensor(SCA_EventManager* eventmgr,
KX_GameObject* gameobj,
double coneradius,
double coneheight,
int axis,
@ -57,20 +54,21 @@ KX_RadarSensor::KX_RadarSensor(class SCA_EventManager* eventmgr,
: KX_NearSensor(
eventmgr,
gameobj,
DT_NewCone(coneradius,coneheight),
margin,
resetmargin,
bFindMaterial,
touchedpropname,
kxscene,
T),
m_coneheight(coneheight),
m_coneradius(coneradius),
m_coneheight(coneheight),
m_axis(axis)
{
m_client_info.m_type = 3;
m_client_info.m_clientobject = gameobj;
m_client_info.m_auxilary_info = NULL;
sumoObj->setClientObject(&m_client_info);
m_client_info->m_type = KX_ClientObjectInfo::RADAR;
//m_client_info->m_clientobject = gameobj;
//m_client_info->m_auxilary_info = NULL;
//sumoObj->setClientObject(&m_client_info);
}
@ -221,4 +219,3 @@ PyObject* KX_RadarSensor::PyGetConeHeight(PyObject* self,
}
#endif //PHYSICS_NOT_YET

@ -62,17 +62,17 @@ class KX_RadarSensor : public KX_NearSensor
MT_Point3 m_cone_target;
public:
KX_RadarSensor(class SCA_EventManager* eventmgr,
class KX_GameObject* gameobj,
KX_RadarSensor(SCA_EventManager* eventmgr,
KX_GameObject* gameobj,
double coneradius,
double coneheight,
int axis,
double margin,
double resetmargin,
class SM_Object* sumoObj,
bool bFindMaterial,
const STR_String& touchedpropname,
class SM_Scene* sumoscene,
class KX_Scene* kxscene,
PyTypeObject* T = &Type);
KX_RadarSensor();
virtual ~KX_RadarSensor();

@ -44,8 +44,8 @@ class KX_RayEventManager : public SCA_EventManager
class SCA_LogicManager* m_logicmgr;
public:
KX_RayEventManager(class SCA_LogicManager* logicmgr)
: m_logicmgr(logicmgr),
SCA_EventManager(RAY_EVENTMGR)
: SCA_EventManager(RAY_EVENTMGR),
m_logicmgr(logicmgr)
{}
virtual void NextFrame(double curtime,double deltatime);
virtual void RegisterSensor(SCA_ISensor* sensor);

@ -41,6 +41,9 @@
#include "KX_GameObject.h"
#include "KX_Scene.h"
#include "SumoPhysicsEnvironment.h"
#include "KX_SumoPhysicsController.h"
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
@ -57,10 +60,10 @@ KX_RaySensor::KX_RaySensor(class SCA_EventManager* eventmgr,
m_propertyname(propname),
m_bFindMaterial(bFindMaterial),
m_distance(distance),
m_axis(axis),
m_ketsjiScene(ketsjiScene),
m_rayHit(false),
m_scene(ketsjiScene),
m_bTriggered(false),
m_axis(axis),
m_rayHit(false),
m_hitObject(NULL)
@ -139,56 +142,78 @@ bool KX_RaySensor::Evaluate(CValue* event)
}
case 3: // -X
{
todir[0] = invmat[0][0] * -1;
todir[1] = invmat[0][1] * -1;
todir[2] = invmat[0][2] * -1;
todir[0] = -invmat[0][0];
todir[1] = -invmat[0][1];
todir[2] = -invmat[0][2];
break;
}
case 4: // -Y
{
todir[0] = invmat[1][0] * -1;
todir[1] = invmat[1][1] * -1;
todir[2] = invmat[1][2] * -1;
todir[0] = -invmat[1][0];
todir[1] = -invmat[1][1];
todir[2] = -invmat[1][2];
break;
}
case 5: // -Z
{
todir[0] = invmat[2][0] * -1;
todir[1] = invmat[2][1] * -1;
todir[2] = invmat[2][2] * -1;
todir[0] = -invmat[2][0];
todir[1] = -invmat[2][1];
todir[2] = -invmat[2][2];
break;
}
}
todir.normalize();
m_rayDirection = todir;
MT_Point3 topoint = frompoint + (m_distance) * todir;
MT_Point3 resultpoint;
MT_Vector3 resultnormal;
bool ready = false;
/*
SumoPhysicsEnvironment *spe = dynamic_cast<SumoPhysicsEnvironment *>(m_scene->GetPhysicsEnvironment());
SM_Scene *scene = spe->GetSumoScene();
KX_SumoPhysicsController *spc = dynamic_cast<KX_SumoPhysicsController *>(obj->GetPhysicsController());
KX_GameObject *parent = obj->GetParent();
if (!spc && parent)
spc = dynamic_cast<KX_SumoPhysicsController *>(parent->GetPhysicsController());
if (parent)
parent->Release();
SM_Object *thisObj = spc?spc->GetSumoObject():NULL;
do {
SM_Object* hitObj = m_sumoScene->rayTest(obj->GetSumoObject(),
SM_Object* hitObj = scene->rayTest(thisObj,
frompoint,
topoint,
resultpoint,
resultnormal);
if (hitObj)
{
KX_ClientObjectInfo* info = (SM_ClientObjectInfo*)hitObj->getClientObject();
SCA_IObject* hitgameobj = (SCA_IObject*)info->m_clientobject;
KX_ClientObjectInfo* info = (KX_ClientObjectInfo*)hitObj->getClientObject();
bool bFound = false;
if (hitgameobj == obj)
if (!info)
{
std::cout<< "WARNING: Ray sensor " << GetName() << " cannot sense SM_Object " << hitObj << " - no client info.\n" << std::endl;
ready = true;
break;
}
SCA_IObject *hitgameobj = (SCA_IObject*)info->m_clientobject;
if (hitgameobj == obj || info->m_type > KX_ClientObjectInfo::ACTOR)
{
// false hit
MT_Scalar marg = obj->GetSumoObject()->getMargin() ;
KX_SumoPhysicsController *hitspc = dynamic_cast<KX_SumoPhysicsController *> (static_cast<KX_GameObject*> (hitgameobj) ->GetPhysicsController());
if (hitspc)
{
MT_Scalar marg = hitspc->GetSumoObject()->getMargin();
if (hitspc->GetSumoObject()->getShapeProps())
marg += hitspc->GetSumoObject()->getShapeProps()->m_radius;
frompoint = resultpoint + marg * todir;
} else {
ready = true;
}
}
else
{
@ -208,10 +233,7 @@ bool KX_RaySensor::Evaluate(CValue* event)
}
else
{
if (hitgameobj->GetProperty(m_propertyname) != NULL)
{
bFound = true;
}
bFound = hitgameobj->GetProperty(m_propertyname) != NULL;
}
}
@ -231,7 +253,7 @@ bool KX_RaySensor::Evaluate(CValue* event)
}
}
while (!ready);
*/
/* now pass this result to some controller */

@ -44,7 +44,7 @@ class KX_RaySensor : public SCA_ISensor
STR_String m_propertyname;
bool m_bFindMaterial;
double m_distance;
class KX_Scene* m_ketsjiScene;
class KX_Scene* m_scene;
bool m_bTriggered;
int m_axis;
bool m_rayHit;

@ -135,8 +135,8 @@ KX_SCA_ReplaceMeshActuator::KX_SCA_ReplaceMeshActuator(SCA_IObject *gameobj,
PyTypeObject* T) :
SCA_IActuator(gameobj, T),
m_scene(scene),
m_mesh(mesh)
m_mesh(mesh),
m_scene(scene)
{
} /* End of constructor */

@ -73,6 +73,8 @@
#include "PHY_IPhysicsEnvironment.h"
#include "KX_IPhysicsController.h"
#include "SM_Scene.h"
#include "SumoPhysicsEnvironment.h"
void* KX_SceneReplicationFunc(SG_IObject* node,void* gameobj,void* scene)
{
@ -95,23 +97,20 @@ SG_Callbacks KX_Scene::m_callbacks = SG_Callbacks(KX_SceneReplicationFunc,KX_Sce
// (defined in KX_PythonInit.cpp)
extern bool gUseVisibilityTemp;
KX_Scene::KX_Scene(class SCA_IInputDevice* keyboarddevice,
class SCA_IInputDevice* mousedevice,
class NG_NetworkDeviceInterface *ndi,
class SND_IAudioDevice* adi,
const STR_String& sceneName):
m_mousemgr(NULL),
m_keyboardmgr(NULL),
m_active_camera(NULL),
m_ueberExecutionPriority(0),
m_adi(adi),
m_mousemgr(NULL),
m_physicsEnvironment(0),
m_sceneName(sceneName),
m_adi(adi),
m_networkDeviceInterface(ndi),
m_physicsEnvironment(0)
m_active_camera(NULL),
m_ueberExecutionPriority(0)
{
@ -130,11 +129,7 @@ KX_Scene::KX_Scene(class SCA_IInputDevice* keyboarddevice,
m_keyboardmgr = new SCA_KeyboardManager(m_logicmgr,keyboarddevice);
m_mousemgr = new SCA_MouseManager(m_logicmgr,mousedevice);
// m_solidScene = DT_CreateScene();
// m_respTable = DT_CreateRespTable();
SCA_AlwaysEventManager* alwaysmgr = new SCA_AlwaysEventManager(m_logicmgr);
//KX_TouchEventManager* touchmgr = new KX_TouchEventManager(m_logicmgr, m_respTable, m_solidScene);
SCA_PropertyEventManager* propmgr = new SCA_PropertyEventManager(m_logicmgr);
SCA_RandomEventManager* rndmgr = new SCA_RandomEventManager(m_logicmgr);
KX_RayEventManager* raymgr = new KX_RayEventManager(m_logicmgr);
@ -145,14 +140,11 @@ KX_Scene::KX_Scene(class SCA_IInputDevice* keyboarddevice,
m_logicmgr->RegisterEventManager(propmgr);
m_logicmgr->RegisterEventManager(m_keyboardmgr);
m_logicmgr->RegisterEventManager(m_mousemgr);
//m_logicmgr->RegisterEventManager(touchmgr);
m_logicmgr->RegisterEventManager(m_timemgr);
m_logicmgr->RegisterEventManager(rndmgr);
m_logicmgr->RegisterEventManager(raymgr);
m_logicmgr->RegisterEventManager(netmgr);
//m_sumoScene = new SM_Scene();
//m_sumoScene->setSecondaryRespTable(m_respTable);
m_soundScene = new SND_Scene(adi);
assert (m_networkDeviceInterface != NULL);
m_networkScene = new NG_NetworkScene(m_networkDeviceInterface);
@ -169,6 +161,7 @@ KX_Scene::KX_Scene(class SCA_IInputDevice* keyboarddevice,
KX_Scene::~KX_Scene()
{
// int numobj = m_objectlist->GetCount();
//int numrootobjects = GetRootParentList()->GetCount();
@ -708,6 +701,11 @@ void KX_Scene::NewRemoveObject(class CValue* gameobj)
newobj->Release();
if (m_euthanasyobjects->RemoveValue(newobj))
newobj->Release();
if (newobj == m_active_camera)
{
m_active_camera = NULL;
}
}
@ -979,3 +977,15 @@ void KX_Scene::SetGravity(const MT_Vector3& gravity)
{
GetPhysicsEnvironment()->setGravity(gravity[0],gravity[1],gravity[2]);
}
void KX_Scene::SetPhysicsEnvironment(class PHY_IPhysicsEnvironment* physEnv)
{
SumoPhysicsEnvironment *sme = dynamic_cast<SumoPhysicsEnvironment *>(physEnv);
m_physicsEnvironment = physEnv;
if (sme)
{
KX_TouchEventManager* touchmgr = new KX_TouchEventManager(m_logicmgr, sme->GetSumoScene());
m_logicmgr->RegisterEventManager(touchmgr);
return;
}
}

@ -466,10 +466,7 @@ public:
return m_physicsEnvironment;
}
void SetPhysicsEnvironment(class PHY_IPhysicsEnvironment* physEnv)
{
m_physicsEnvironment = physEnv;
}
void SetPhysicsEnvironment(class PHY_IPhysicsEnvironment* physEnv);
void SetGravity(const MT_Vector3& gravity);
};

@ -295,11 +295,8 @@ PyObject* KX_SceneActuator::PySetScene(PyObject* self,
return NULL;
}
if (m_KetsjiEngine->FindScene(scene_name))
{
/* Scene switch is done by name. */
m_nextSceneName = scene_name;
}
Py_Return;
}

@ -1,4 +1,7 @@
#ifdef WIN32
#pragma warning (disable : 4786)
#endif
#include "KX_SumoPhysicsController.h"
#include "SG_Spatial.h"
@ -145,8 +148,7 @@ void KX_SumoPhysicsController::SetObject (SG_IObject* object)
// cheating here...
KX_GameObject* gameobj = (KX_GameObject*) object->GetSGClientObject();
gameobj->SetPhysicsController(this);
GetSumoObject()->setClientObject(gameobj->getClientInfo());
}

@ -1,3 +1,34 @@
/**
* $Id$
*
* ***** BEGIN GPL/BL DUAL 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. The Blender
* Foundation also sells licenses for use in proprietary software under
* the Blender License. See http://www.blender.org/BL/ for information
* about this.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
* All rights reserved.
*
* The Original Code is: all of this file.
*
* Contributor(s): none yet.
*
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
#ifndef __KX_SUMOPHYSICSCONTROLLER_H
#define __KX_SUMOPHYSICSCONTROLLER_H
@ -27,8 +58,8 @@ public:
class SM_Object* sumoObj,
class PHY_IMotionState* motionstate
,bool dyna)
: SumoPhysicsController(sumoScene,solidscene,sumoObj,motionstate,dyna),
KX_IPhysicsController(dyna,NULL)
: KX_IPhysicsController(dyna,NULL) ,
SumoPhysicsController(sumoScene,solidscene,sumoObj,motionstate,dyna)
{
};
virtual ~KX_SumoPhysicsController();

@ -36,8 +36,10 @@
#include <config.h>
#endif
KX_TimeLogger::KX_TimeLogger(unsigned int maxNumMeasurements)
: m_maxNumMeasurements(maxNumMeasurements), m_logging(false), m_logStart(0)
KX_TimeLogger::KX_TimeLogger(unsigned int maxNumMeasurements) :
m_maxNumMeasurements(maxNumMeasurements),
m_logStart(0),
m_logging(false)
{
}
@ -108,7 +110,7 @@ double KX_TimeLogger::GetAverage(void) const
unsigned int numMeasurements = m_measurements.size();
if (numMeasurements > 1) {
for (int i = 1; i < numMeasurements; i++) {
for (unsigned int i = 1; i < numMeasurements; i++) {
avg += m_measurements[i];
}
avg /= (float)numMeasurements - 1;

@ -38,33 +38,60 @@
#include <config.h>
#endif
#ifdef PHYSICS_NOT_YET
#include "SM_Object.h"
KX_TouchEventManager::KX_TouchEventManager(class SCA_LogicManager* logicmgr,
DT_RespTableHandle resphandle,
DT_SceneHandle scenehandle)
SM_Scene *scene)
: SCA_EventManager(TOUCH_EVENTMGR),
m_resphandle(resphandle),
m_scenehandle(scenehandle),
m_logicmgr(logicmgr) {}
m_logicmgr(logicmgr),
m_scene(scene)
{
//m_scene->addTouchCallback(STATIC_RESPONSE, KX_TouchEventManager::collisionResponse, this);
m_scene->addTouchCallback(OBJECT_RESPONSE, KX_TouchEventManager::collisionResponse, this);
m_scene->addTouchCallback(SENSOR_RESPONSE, KX_TouchEventManager::collisionResponse, this);
}
DT_Bool KX_TouchEventManager::HandleCollision(void* object1,void* object2,
const DT_CollData * coll_data)
{
SM_Object * obj1 = (SM_Object *) object1;
SM_Object * obj2 = (SM_Object *) object2;
for ( vector<SCA_ISensor*>::iterator it = m_sensors.begin(); !(it==m_sensors.end()); it++)
{
KX_GameObject* gameobj = ((KX_GameObject*)((KX_TouchSensor*)*it)->GetParent());
KX_ClientObjectInfo *client_info = (KX_ClientObjectInfo *) obj1->getClientObject();
// Enable these printfs to create excesive debug info
// printf("KX_TEM::HC: Sensor %s\tGO: %p o1: %s (%p)", (const char *) (*it)->GetName(), gameobj, (const char *) ((KX_GameObject *) client_info->m_clientobject)->GetName(), client_info->m_clientobject);
if (client_info && client_info->m_clientobject == gameobj)
((KX_TouchSensor*)*it)->HandleCollision(object1,object2,coll_data);
client_info = (KX_ClientObjectInfo *) obj2->getClientObject();
// printf(" o2: %s (%p)\n", (const char *) ((KX_GameObject *) client_info->m_clientobject)->GetName(), client_info->m_clientobject);
if (client_info && client_info->m_clientobject == gameobj)
((KX_TouchSensor*)*it)->HandleCollision(object1,object2,coll_data);
}
return DT_CONTINUE;
}
DT_Bool KX_TouchEventManager::collisionResponse(void *client_data,
void *object1,
void *object2,
const DT_CollData *coll_data)
{
KX_TouchEventManager *touchmgr = (KX_TouchEventManager *) client_data;
touchmgr->HandleCollision(object1, object2, coll_data);
return DT_CONTINUE;
}
void KX_TouchEventManager::RegisterSensor(SCA_ISensor* sensor)
{
KX_TouchSensor* touchsensor = static_cast<KX_TouchSensor*>(sensor);
m_sensors.push_back(touchsensor);
touchsensor->RegisterSumo();//this,m_resphandle);
//KX_GameObject* gameobj = ((KX_GameObject*)sensor->GetParent());
// SM_Object* smobj = touchsensor->GetSumoObject();//gameobj->GetSumoObject();
// if (smobj)
// {
// smobj->calcXform();
// DT_AddObject(m_scenehandle,
// smobj->getObjectHandle());
// }
touchsensor->RegisterSumo(this);
}
@ -89,10 +116,7 @@ void KX_TouchEventManager::NextFrame(double curtime,double deltatime)
vector<SCA_ISensor*>::iterator it;
for (it = m_sensors.begin();!(it==m_sensors.end());it++)
((KX_TouchSensor*)*it)->SynchronizeTransform();
if (DT_Test(m_scenehandle,m_resphandle))
int i = 0;
static_cast<KX_TouchSensor*>(*it)->SynchronizeTransform();
for (it = m_sensors.begin();!(it==m_sensors.end());it++)
(*it)->Activate(m_logicmgr,NULL);
@ -107,14 +131,10 @@ void KX_TouchEventManager::RemoveSensor(class SCA_ISensor* sensor)
std::find(m_sensors.begin(), m_sensors.end(), sensor);
if (!(i == m_sensors.end()))
{
//std::swap(*i, m_sensors.back());
//m_sensors.pop_back();
//SM_Object* smobj = ((KX_TouchSensor*)*i)->GetSumoObject();
//DT_RemoveObject(m_scenehandle,
// smobj->getObjectHandle());
std::swap(*i, m_sensors.back());
m_sensors.pop_back();
}
// remove the sensor forever :)
SCA_EventManager::RemoveSensor(sensor);
}
#endif

@ -37,19 +37,30 @@
#include "KX_GameObject.h"
#include <vector>
using namespace std;
class KX_TouchEventManager : public SCA_EventManager
{
class SCA_LogicManager* m_logicmgr;
SM_Scene *m_scene;
static DT_Bool KX_TouchEventManager::collisionResponse(void *client_data,
void *object1,
void *object2,
const DT_CollData *coll_data);
virtual DT_Bool HandleCollision(void* obj1,void* obj2,
const DT_CollData * coll_data);
public:
KX_TouchEventManager(class SCA_LogicManager* logicmgr);
KX_TouchEventManager(class SCA_LogicManager* logicmgr,
SM_Scene *scene);
virtual void NextFrame(double curtime,double deltatime);
virtual void EndFrame();
virtual void RemoveSensor(class SCA_ISensor* sensor);
virtual void RegisterSensor(SCA_ISensor* sensor);
SCA_LogicManager* GetLogicManager() { return m_logicmgr;}
SM_Scene *GetSumoScene() { return m_scene; }
};
#endif //__KX_TOUCHEVENTMANAGER

@ -37,14 +37,14 @@
#include "SCA_LogicManager.h"
#include "KX_GameObject.h"
#include "KX_TouchEventManager.h"
#include "SM_Object.h"
#include "KX_SumoPhysicsController.h"
#include <iostream>
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#ifdef PHYSICS_NOT_YET
/* ------------------------------------------------------------------------- */
/* Native functions */
/* ------------------------------------------------------------------------- */
@ -84,74 +84,77 @@ bool KX_TouchSensor::Evaluate(CValue* event)
return result;
}
KX_TouchSensor::KX_TouchSensor(SCA_EventManager* eventmgr,KX_GameObject* gameobj,SM_Object* sumoObj,bool bFindMaterial,const STR_String& touchedpropname,PyTypeObject* T)
KX_TouchSensor::KX_TouchSensor(SCA_EventManager* eventmgr,KX_GameObject* gameobj,/*SM_Object* sumoObj,*/bool bFindMaterial,const STR_String& touchedpropname,PyTypeObject* T)
:SCA_ISensor(gameobj,eventmgr,T),
m_touchedpropname(touchedpropname),
m_bFindMaterial(bFindMaterial),
m_sumoObj(sumoObj),
m_eventmgr(eventmgr),
/*m_sumoObj(sumoObj),*/
m_bCollision(false),
m_bTriggered(false),
m_bLastTriggered(false)
{
m_eventmgr = eventmgr;
KX_TouchEventManager* touchmgr = (KX_TouchEventManager*) eventmgr;
// m_resptable = touchmgr->GetResponseTable();
m_resptable = touchmgr->GetResponseTable();
m_solidHandle = m_sumoObj->getObjectHandle();
// m_solidHandle = m_sumoObj->getObjectHandle();
m_hitObject = NULL;
m_colliders = new CListValue();
KX_ClientObjectInfo *client_info = gameobj->getClientInfo();
client_info->m_clientobject = gameobj;
client_info->m_auxilary_info = NULL;
KX_SumoPhysicsController *sphy = dynamic_cast<KX_SumoPhysicsController *>(gameobj->GetPhysicsController());
if (sphy)
m_sumoObj = sphy->GetSumoObject();
}
KX_TouchSensor::~KX_TouchSensor()
{
DT_ClearObjectResponse(m_resptable,m_solidHandle);
//DT_ClearObjectResponse(m_resptable,m_solidHandle);
m_colliders->Release();
}
void KX_TouchSensor::ReParent(SCA_IObject* parent)
{
KX_GameObject *gameobj = static_cast<KX_GameObject *>(parent);
KX_SumoPhysicsController *sphy = dynamic_cast<KX_SumoPhysicsController *>(((KX_GameObject*)parent)->GetPhysicsController());
if (sphy)
m_sumoObj = sphy->GetSumoObject();
m_sumoObj = ((KX_GameObject*)parent)->GetSumoObject();
m_solidHandle = m_sumoObj->getObjectHandle();
m_client_info.m_clientobject = NULL;//parent;
m_client_info.m_auxilary_info = NULL;
// m_solidHandle = m_sumoObj->getObjectHandle();
KX_ClientObjectInfo *client_info = gameobj->getClientInfo();
client_info->m_clientobject = parent;
client_info->m_auxilary_info = NULL;
SCA_ISensor::ReParent(parent);
}
void KX_TouchSensor::RegisterSumo()
void KX_TouchSensor::RegisterSumo(KX_TouchEventManager *touchman)
{
if (m_sumoObj)
{
touchman->GetSumoScene()->requestCollisionCallback(*m_sumoObj);
// collision
DT_SetObjectResponse(
m_resptable,
m_solidHandle,
collisionResponse,
DT_SIMPLE_RESPONSE,
this);
// Deprecated
}
}
void KX_TouchSensor::HandleCollision(void* obj1,void* obj2,const DT_CollData * coll_data)
DT_Bool KX_TouchSensor::HandleCollision(void* obj1,void* obj2,const DT_CollData * coll_data)
{
KX_TouchEventManager* toucheventmgr = (KX_TouchEventManager*)m_eventmgr;
KX_GameObject* parent = (KX_GameObject*)GetParent();
// need the mapping from SM_Objects to gameobjects now
SM_ClientObjectInfo* client_info =(SM_ClientObjectInfo*) (obj1 == m_sumoObj?
KX_ClientObjectInfo* client_info =(KX_ClientObjectInfo*) (obj1 == m_sumoObj?
((SM_Object*)obj2)->getClientObject() :
((SM_Object*)obj1)->getClientObject());
KX_GameObject* gameobj = ( client_info ?
(KX_GameObject*)client_info->m_clientobject :
NULL);
@ -185,12 +188,14 @@ void KX_TouchSensor::HandleCollision(void* obj1,void* obj2,const DT_CollData
{
m_bTriggered = true;
m_hitObject = gameobj;
//printf("KX_TouchSensor::HandleCollision\n");
}
}
return DT_CONTINUE;
}
/* ------------------------------------------------------------------------- */
/* Python functions */
/* ------------------------------------------------------------------------- */
@ -322,10 +327,11 @@ PyObject* KX_TouchSensor::PyGetHitObjectList(PyObject* self,
* - this also doesn't work (obviously) for multi-materials...
*/
KX_GameObject* gameob = (KX_GameObject*) m_colliders->GetValue(i);
SM_Object* smob = (SM_Object*) gameob->GetSumoObject();
KX_SumoPhysicsController* spc = dynamic_cast<KX_SumoPhysicsController*>(gameob->GetPhysicsController());
SM_Object* smob = spc?spc->GetSumoObject():NULL;
if (smob) {
SM_ClientObjectInfo* cl_inf = (SM_ClientObjectInfo*) smob->getClientObject();
KX_ClientObjectInfo* cl_inf = (KX_ClientObjectInfo*) smob->getClientObject();
if (m_touchedpropname == ((char*)cl_inf->m_auxilary_info)) {
newList->Add(m_colliders->GetValue(i)->AddRef());
@ -392,6 +398,5 @@ PyObject* KX_TouchSensor::PySetTouchMaterial(PyObject* self, PyObject* args, PyO
Py_Return;
}
#endif //#ifdef PHYSICS_NOT_YET
/* eof */

@ -38,8 +38,13 @@
#include "SCA_ISensor.h"
#include "ListValue.h"
#include <SOLID/SOLID.h>
#include "SM_Scene.h"
#include "KX_ClientObjectInfo.h"
class KX_TouchEventManager;
class KX_TouchSensor : public SCA_ISensor
{
protected:
@ -52,10 +57,9 @@ protected:
bool m_bFindMaterial;
class SCA_EventManager* m_eventmgr;
//class SM_Object* m_sumoObj;
//DT_ObjectHandle m_solidHandle;
//SM_ClientObjectInfo m_client_info;
//DT_RespTableHandle m_resptable;
class SM_Object* m_sumoObj;
DT_ObjectHandle m_solidHandle;
DT_RespTableHandle m_resptable;
bool m_bCollision;
@ -67,7 +71,7 @@ protected:
public:
KX_TouchSensor(class SCA_EventManager* eventmgr,
class KX_GameObject* gameobj,
class SM_Object* sumoObj,
/*class SM_Object* sumoObj,*/
bool fFindMaterial,
const STR_String& touchedpropname,
PyTypeObject* T=&Type) ;
@ -88,25 +92,15 @@ public:
virtual bool Evaluate(CValue* event);
virtual void ReParent(SCA_IObject* parent);
/* static void collisionResponse(void *client_data,
void *object1,
void *object2,
const DT_CollData *coll_data) {
class KX_TouchSensor* sensor = (class KX_TouchSensor*) client_data;
sensor->HandleCollision(object1,object2,coll_data);
}
virtual void RegisterSumo(KX_TouchEventManager* touchman);
void RegisterSumo();
virtual void HandleCollision(void* obj1,void* obj2,
virtual DT_Bool HandleCollision(void* obj1,void* obj2,
const DT_CollData * coll_data);
// SM_Object* GetSumoObject() { return m_sumoObj; };
SM_Object* GetSumoObject() { return m_sumoObj; };
*/
virtual bool IsPositiveTrigger() {
bool result = m_bTriggered;
@ -115,7 +109,7 @@ public:
}
void EndFrame();
virtual void EndFrame();
// todo: put some info for collision maybe

@ -53,11 +53,12 @@ private:
double m_ipotime;
public:
KX_WorldIpoController() : m_ipotime(0.0),
KX_WorldIpoController() :
m_modify_mist_color(false),
m_modify_mist_start(false),
m_modify_mist_dist(false),
m_modified(true)
m_modified(true),
m_ipotime(0.0)
{}
virtual ~KX_WorldIpoController();

@ -42,7 +42,8 @@ CPPFLAGS += $(OGL_CPPFLAGS)
CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
CPPFLAGS += -I$(NAN_STRING)/include
CPPFLAGS += -I$(NAN_SOUNDSYSTEM)/include
CPPFLAGS += -I$(NAN_FUZZICS)/include -I$(NAN_SUMO)/include -I$(NAN_MOTO)/include
CPPFLAGS += -I$(NAN_FUZZICS)/include -I$(NAN_SUMO) -I$(NAN_MOTO)/include
CPPFLAGS += -I$(NAN_SOLID)/include
CPPFLAGS += -I../Rasterizer -I../GameLogic -I../SceneGraph
CPPFLAGS += -I../BlenderRoutines -I../Expressions
CPPFLAGS += -I../../kernel/gen_system

@ -1,3 +1,5 @@
import sys
Import ('user_options_dict')
Import ('library_env')
@ -59,6 +61,7 @@ if user_options_dict['USE_PHYSICS'] == 'solid':
if user_options_dict['USE_PHYSICS'] == 'ode':
source_files += ['KX_OdePhysicsController.cpp']
ketsji_env.Append (CPPPATH = user_options_dict['SOLID_INCLUDE'])
ketsji_env.Append (CPPPATH = ['.',
'#source/kernel/gen_system',
@ -90,7 +93,7 @@ ketsji_env.Append (CPPPATH = ['.',
'#source/gameengine/Physics/common',
'#source/gameengine/Physics/BlOde',
'#source/gameengine/Physics/Dummy',
'#source/gameengine/Physics/Sumo/',
'#source/gameengine/Physics/Sumo',
'#source/gameengine/Physics/Sumo/include',
'#source/gameengine/Physics/Sumo/Fuzzics/include',
'#source/gameengine/Network/LoopBackNetwork',
@ -98,6 +101,8 @@ ketsji_env.Append (CPPPATH = ['.',
'#source/blender/blenloader'
])
if sys.platform == 'win32':
ketsji_env.Append (CXXFLAGS = ['/GR'])
ketsji_env.Append (CPPPATH = user_options_dict['PYTHON_INCLUDE'])
ketsji_env.Library (target='#'+user_options_dict['BUILD_DIR']+'/lib/KX_ketsji', source=source_files)

@ -0,0 +1,26 @@
#ifndef __SM_DEBUG_H__
#define __SM_DEBUG_H__
/* Comment this to disable all SUMO debugging printfs */
#define SM_DEBUG
#ifdef SM_DEBUG
#include <stdio.h>
/* Uncomment this to printf all ray casts */
//#define SM_DEBUG_RAYCAST
/* Uncomment this to printf collision callbacks */
//#define SM_DEBUG_BOING
/* Uncomment this to printf Xform matrix calculations */
//#define SM_DEBUG_XFORM
#endif /* SM_DEBUG */
#endif /* __SM_DEBUG_H__ */

@ -1,3 +1,34 @@
/**
* $Id$
*
* ***** BEGIN GPL/BL DUAL 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. The Blender
* Foundation also sells licenses for use in proprietary software under
* the Blender License. See http://www.blender.org/BL/ for information
* about this.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
* All rights reserved.
*
* The Original Code is: all of this file.
*
* Contributor(s): none yet.
*
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
#ifndef SM_FHOBJECT_H
#define SM_FHOBJECT_H
@ -5,19 +36,15 @@
class SM_FhObject : public SM_Object {
public:
SM_FhObject() {}
SM_FhObject(const MT_Vector3& ray, SM_Object *client_object) :
SM_Object(DT_Ray(ray[0], ray[1], ray[2]), 0, 0, 0),
m_ray(ray),
m_ray_direction(ray.normalized()),
m_client_object(client_object) {}
virtual ~SM_FhObject();
SM_FhObject(DT_ShapeHandle rayshape, MT_Vector3 ray, SM_Object *parent_object);
const MT_Vector3& getRay() const { return m_ray; }
MT_Point3 getSpot() const { return m_pos + m_ray; }
const MT_Vector3& getRayDirection() const { return m_ray_direction; }
SM_Object *getClientObject() const { return m_client_object; }
SM_Object *getParentObject() const { return m_parent_object; }
static void ray_hit(void *client_data,
static DT_Bool ray_hit(void *client_data,
void *object1,
void *object2,
const DT_CollData *coll_data);
@ -25,7 +52,7 @@ public:
private:
MT_Vector3 m_ray;
MT_Vector3 m_ray_direction;
SM_Object *m_client_object;
SM_Object *m_parent_object;
};
#endif

@ -1,9 +1,40 @@
/**
* $Id$
*
* ***** BEGIN GPL/BL DUAL 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. The Blender
* Foundation also sells licenses for use in proprietary software under
* the Blender License. See http://www.blender.org/BL/ for information
* about this.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
* All rights reserved.
*
* The Original Code is: all of this file.
*
* Contributor(s): none yet.
*
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
#ifndef SM_OBJECT_H
#define SM_OBJECT_H
#include <vector>
#include "solid.h"
#include <SOLID/SOLID.h>
#include "SM_Callback.h"
#include "SM_MotionState.h"
@ -15,6 +46,7 @@ class SM_FhObject;
// Properties of dynamic objects
struct SM_ShapeProps {
MT_Scalar m_mass; // Total mass
MT_Scalar m_radius; // Bound sphere size
MT_Scalar m_inertia; // Inertia, should be a tensor some time
MT_Scalar m_lin_drag; // Linear drag (air, water) 0 = concrete, 1 = vacuum
MT_Scalar m_ang_drag; // Angular drag
@ -36,6 +68,7 @@ struct SM_MaterialProps {
};
class SM_Object : public SM_MotionState {
public:
SM_Object() ;
@ -45,7 +78,6 @@ public:
const SM_ShapeProps *shapeProps,
SM_Object *dynamicParent
);
virtual ~SM_Object();
bool isDynamic() const;
@ -164,6 +196,7 @@ public:
void applyAngularImpulse(const MT_Vector3& impulse);
MT_Point3 getWorldCoord(const MT_Point3& local) const;
MT_Point3 getLocalCoord(const MT_Point3& world) const;
MT_Vector3 getVelocity(const MT_Point3& local) const;
@ -180,9 +213,6 @@ public:
DT_ObjectHandle getObjectHandle() const ;
DT_ShapeHandle getShapeHandle() const ;
void setClientObject(void *clientobj) ;
void *getClientObject() ;
SM_Object *getDynamicParent() ;
void integrateForces(MT_Scalar timeStep);
@ -192,10 +222,9 @@ public:
bool isRigidBody() const ;
// This is the callback for handling collisions of dynamic objects
static
void
DT_Bool
boing(
void *client_data,
void *object1,
@ -203,6 +232,26 @@ public:
const DT_CollData *coll_data
);
static
DT_Bool
fix(
void *client_data,
void *object1,
void *object2,
const DT_CollData *coll_data
);
void *getClientObject() { return m_client_object; }
void setClientObject(void *client_object) { m_client_object = client_object; }
void relax();
void backup() {
m_pos = m_prev_state.getPosition();
m_orn = m_prev_state.getOrientation();
m_xform = m_prev_xform;
}
private:
// return the actual linear_velocity of this object this
@ -218,6 +267,15 @@ private:
actualAngVelocity(
) const ;
void dynamicCollision(MT_Point3 local2,
MT_Vector3 normal,
MT_Scalar dist,
MT_Vector3 rel_vel,
MT_Scalar restitution,
MT_Scalar friction_factor,
MT_Scalar invMass
);
typedef std::vector<SM_Callback *> T_CallbackList;
@ -259,6 +317,8 @@ private:
MT_Vector3 m_force; // Force on center of mass (afffects linear momentum)
MT_Vector3 m_torque; // Torque around center of mass (affects angualr momentum)
MT_Vector3 m_error; // Error in position:- amount object must be moved to prevent intersection with scene
// Here are the values of externally set linear and angular
// velocity. These are updated from the outside
// (actuators and python) each frame and combined with the

@ -2,37 +2,69 @@
* $Id$
* Copyright (C) 2001 NaN Technologies B.V.
* The physics scene.
*
* ***** BEGIN GPL/BL DUAL 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. The Blender
* Foundation also sells licenses for use in proprietary software under
* the Blender License. See http://www.blender.org/BL/ for information
* about this.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
* All rights reserved.
*
* The Original Code is: all of this file.
*
* Contributor(s): none yet.
*
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
#ifndef SM_SCENE_H
#define SM_SCENE_H
#ifdef WIN32
#pragma warning (disable : 4786)
#endif
#include <vector>
#include <set>
#include <utility> //needed for pair
#include "solid.h"
#include <SOLID/SOLID.h>
#include "MT_Vector3.h"
#include "MT_Point3.h"
class SM_Object;
#include "SM_Object.h"
typedef enum
{
FH_RESPONSE,
SENSOR_RESPONSE, /* Touch Sensors */
CAMERA_RESPONSE, /* Visibility Culling */
OBJECT_RESPONSE, /* Object Dynamic Geometry Response */
STATIC_RESPONSE, /* Static Geometry Response */
NUM_RESPONSE
};
class SM_Scene {
public:
SM_Scene() :
m_scene(DT_CreateScene()),
m_respTable(DT_CreateRespTable()),
m_secondaryRespTable(0),
m_forceField(0.0, 0.0, 0.0)
{}
SM_Scene();
~SM_Scene() {
DT_DeleteRespTable(m_respTable);
DT_DeleteScene(m_scene);
}
~SM_Scene();
DT_RespTableHandle getRespTableHandle() const {
return m_respTable;
@ -50,6 +82,9 @@ public:
m_forceField = forceField;
}
void addTouchCallback(int response_class, DT_ResponseCallback callback, void *user);
void addSensor(SM_Object& object);
void add(SM_Object& object);
void remove(SM_Object& object);
@ -61,9 +96,10 @@ public:
m_pairList.clear();
}
void setSecondaryRespTable(DT_RespTableHandle secondaryRespTable) {
m_secondaryRespTable = secondaryRespTable;
}
void setSecondaryRespTable(DT_RespTableHandle secondaryRespTable);
DT_RespTableHandle getSecondaryRespTable() { return m_secondaryRespTable; }
void requestCollisionCallback(SM_Object &object);
// Perform an integration step of duration 'timeStep'.
@ -96,6 +132,15 @@ private:
// Clear the user set velocities.
void clearObjectCombinedVelocities();
// This is the callback for handling collisions of dynamic objects
static
DT_Bool
boing(
void *client_data,
void *object1,
void *object2,
const DT_CollData *coll_data
);
/** internal type */
typedef std::vector<SM_Object *> T_ObjectList;
@ -106,10 +151,19 @@ private:
DT_SceneHandle m_scene;
/** Following response table contains the callbacks for the dynmics */
DT_RespTableHandle m_respTable;
DT_ResponseClass m_ResponseClass[NUM_RESPONSE];
/**
* Following response table contains callbacks for the client (=
* game engine) */
DT_RespTableHandle m_secondaryRespTable; // Handle
DT_ResponseClass m_secondaryResponseClass[NUM_RESPONSE];
/**
* Following resposne table contains callbacks for fixing the simulation
* ie making sure colliding objects do not intersect.
*/
DT_RespTableHandle m_fixRespTable;
DT_ResponseClass m_fixResponseClass[NUM_RESPONSE];
/** The acceleration from the force field */
MT_Vector3 m_forceField;

Some files were not shown because too many files have changed in this diff Show More