Browse Source

Merge pull request #67 from blitz-research/develop

Develop up
abakobo 8 years ago
parent
commit
24e9882d66

+ 5 - 5
modules/assimp/assimp/include/assimp/config.h

@@ -74,16 +74,16 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 //#define ASSIMP_BUILD_NO_X_IMPORTER 1
 #define ASSIMP_BUILD_NO_AMF_IMPORTER 1
 //#define ASSIMP_BUILD_NO_3DS_IMPORTER 1
-#define ASSIMP_BUILD_NO_MD3_IMPORTER 1
-#define ASSIMP_BUILD_NO_MDL_IMPORTER 1
-#define ASSIMP_BUILD_NO_MD2_IMPORTER 1
-#define ASSIMP_BUILD_NO_PLY_IMPORTER 1
+//#define ASSIMP_BUILD_NO_MD3_IMPORTER 1
+//#define ASSIMP_BUILD_NO_MDL_IMPORTER 1
+//#define ASSIMP_BUILD_NO_MD2_IMPORTER 1
+//#define ASSIMP_BUILD_NO_PLY_IMPORTER 1
 #define ASSIMP_BUILD_NO_ASE_IMPORTER 1
 //#define ASSIMP_BUILD_NO_OBJ_IMPORTER 1
 #define ASSIMP_BUILD_NO_HMP_IMPORTER 1
 #define ASSIMP_BUILD_NO_SMD_IMPORTER 1
 #define ASSIMP_BUILD_NO_MDC_IMPORTER 1
-#define ASSIMP_BUILD_NO_MD5_IMPORTER 1
+//#define ASSIMP_BUILD_NO_MD5_IMPORTER 1
 #define ASSIMP_BUILD_NO_STL_IMPORTER 1
 #define ASSIMP_BUILD_NO_LWO_IMPORTER 1
 #define ASSIMP_BUILD_NO_DXF_IMPORTER 1

+ 13 - 2
modules/assimp/makefile.monkey2

@@ -89,6 +89,19 @@ Namespace assimp
 #Import "assimp/code/ColladaParser.cpp"
 #Import "assimp/code/ColladaExporter.cpp"
 
+#Import "assimp/code/PlyLoader.cpp"
+#Import "assimp/code/PlyParser.cpp"
+
+#Import "assimp/code/MDLLoader.cpp"
+#Import "assimp/code/MDLMaterialLoader.cpp"
+#Import "assimp/code/MD2Loader.cpp"
+#Import "assimp/code/MD3Loader.cpp"
+#Import "assimp/code/MD5Loader.cpp"
+#Import "assimp/code/MD5Loader.cpp"
+#Import "assimp/code/MD5Parser.cpp"
+
+#Import "assimp/code/MS3DLoader.cpp"
+
 #rem
 #Import "assimp/code/StepExporter.cpp"
 #Import "assimp/code/AMFImporter.cpp"
@@ -118,8 +131,6 @@ Namespace assimp
 #Import "assimp/code/MD5Loader.cpp"
 #Import "assimp/code/MD5Parser.cpp"
 #Import "assimp/code/MDCLoader.cpp"
-#Import "assimp/code/MDLLoader.cpp"
-#Import "assimp/code/MDLMaterialLoader.cpp"
 #Import "assimp/code/NFFLoader.cpp"
 #Import "assimp/code/NDOLoader.cpp"
 #Import "assimp/code/OFFLoader.cpp"

+ 105 - 3
modules/bullet/bullet.monkey2

@@ -92,7 +92,6 @@ Struct btTransform
 	Function getIdentity:btTransform()
 End
 
-
 Class btObject Extends Void
 	
 	Method destroy() Extension="delete"
@@ -130,7 +129,85 @@ Class btCollisionDispatcher Extends btDispatcher
 	Method New( collisionConfiguration:btCollisionConfiguration )
 End
 
+Class btBroadphaseProxy Extends btObject
+End
+
 Class btCollisionWorld Extends btObject
+	
+	Struct LocalShapeInfo
+		
+		Field m_shapePart:Int
+		Field m_triangleIndex:int
+	End
+	
+	Struct LocalRayResult
+		
+		Field m_collisionObject:btCollisionObject
+		Field m_localShapeInfo:LocalShapeInfo Ptr
+		Field m_hitNormalLocal:btVector3
+		Field m_hitFraction:btScalar
+	End
+
+	Struct RayResultCallback
+		
+		Field m_closestHitFraction:btScalar
+		Field m_collisionObject:btCollisionObject
+		Field m_collisionFilterGroup:Short
+		Field m_collisionFilterMask:Short
+		Field m_flags:UInt
+		
+		Method hasHit:Bool()
+'		Method needsCollision:Bool( proxy0:btBroadphaseProxy ) Virtual
+'		Method addSingleResult:btScalar( rayResult:LocalRayResult Ptr,normalInWorldSpace:Bool ) Virtual
+	End
+	
+	Struct ClosestRayResultCallback
+
+		Field m_closestHitFraction:btScalar
+		Field m_collisionObject:btCollisionObject
+		Field m_collisionFilterGroup:Short
+		Field m_collisionFilterMask:Short
+		Field m_flags:UInt
+		
+		Field m_rayFromWorld:btVector3
+  		Field m_rayToWorld:btVector3
+  		Field m_hitNormalWorld:btVector3
+		Field m_hitPointWorld:btVector3
+		
+		Method New( rayFromWorld:btVector3,rayToWorld:btVector3 )
+
+		Method hasHit:Bool()
+	End
+
+	Struct ConvexResultCallback
+		
+		Field m_closestHitFraction:btScalar
+		Field m_collisionFilterGroup:Short
+		Field m_collisionFilterMask:Short
+
+		Method hasHit:Bool()
+	End
+	
+	Struct ClosestConvexResultCallback
+
+		Field m_closestHitFraction:btScalar
+		Field m_collisionFilterGroup:Short
+		Field m_collisionFilterMask:Short
+		
+		Field m_convexFromWorld:btVector3
+		Field m_convexToWorld:btVector3
+		Field m_hitNormalWorld:btVector3
+		Field m_hitPointWorld:btVector3
+		Field m_hitCollisionObject:btCollisionObject
+		
+		Method New( castFrom:btVector3,castTo:btVector3 )
+
+		Method hasHit:Bool()
+	End
+			
+	Method rayTest( rayFromWorld:btVector3,rayToWorld:btVector3,resultCallback:RayResultCallback Ptr ) Extension="bbBullet::rayTest"
+	
+	Method convexSweepTest( castShape:btConvexShape,castFrom:btTransform,castTo:btTransform,resultCallback:ConvexResultCallback ptr,allowedCcdPenetration:btScalar=0 ) Extension="bbBullet::convexSweepTest"
 End
 
 Class btDynamicsWorld Extends btCollisionWorld
@@ -156,11 +233,19 @@ Class btDiscreteDynamicsWorld Extends btDynamicsWorld
 End
 
 Class btCollisionShape Extends btObject
-
+	
 	Method setLocalScaling( scaling:btVector3 )
 	
 	Method getLocalScaling:btVector3()
 	
+	Method setMargin( margin:btScalar )
+		
+	Method getMargin:btScalar()
+		
+	Method setUserPointer( p:Void Ptr )
+	
+	Method getUserPointer:Void Ptr()
+
 	Method calculateLocalInertia:btVector3( mass:btScalar ) Extension="bbBullet::calculateLocalInertia"
 End
 
@@ -334,7 +419,7 @@ Class btCollisionObject Extends btObject
 	Const CF_CHARACTER_OBJECT:Int="btCollisionObject::CF_CHARACTER_OBJECT"
 	Const CF_DISABLE_VISUALIZE_OBJECT:Int="btCollisionObject::CF_DISABLE_VISUALIZE_OBJECT"
 	Const CF_DISABLE_SPU_COLLISION_PROCESSING:Int="btCollisionObject::CF_DISABLE_SPU_COLLISION_PROCESSING"
-
+	
 	Method setWorldTransform( transform:btTransform )
 	
 	Method getWorldTransform:btTransform()
@@ -367,6 +452,10 @@ Class btCollisionObject Extends btObject
 	
 	Method getActivationState:Int()
 		
+	Method setUserPointer( p:Void Ptr )
+		
+	Method getUserPointer:void ptr()
+
 End
 
 Struct btRigidBodyConstructionInfo
@@ -402,5 +491,18 @@ Class btRigidBody Extends btCollisionObject
 	Method setLinearVelocity( lin_vel:btVector3 )
 	
 	Method getLinearVelocity:btVector3()
+		
+	Method applyForce( force:btVector3,rel_pos:btVector3 )
+		
+	Method applyCentralForce( force:btVector3 )
+		
+	Method applyImpulse( impulse:btVector3,rel_pos:btVector3 )
+		
+	Method applyCentralImpulse( impulse:btVector3 )
+		
+	Method applyTorque( torque:btVector3 )
+		
+	Method applyTorqueImpulse( torque:btVector3 )
+		
 End
 

+ 18 - 0
modules/bullet/bullet_glue.cpp

@@ -14,4 +14,22 @@ namespace bbBullet{
 		self->getWorldTransform( t );
 		return t;
 	}
+
+	void rayTest( btCollisionWorld *self,
+		const btVector3 &rayFromWorld,
+		const btVector3 &rayToWorld,
+		btCollisionWorld::RayResultCallback *result ){
+	
+		self->rayTest( rayFromWorld,rayToWorld,*result );
+	}
+	
+	void convexSweepTest( btCollisionWorld *self,
+		const btConvexShape *castShape,
+		const btTransform &castFrom,
+		const btTransform &castTo,
+		btCollisionWorld::ConvexResultCallback *result,
+		btScalar allowedCcdPenetration ){
+		
+		self->convexSweepTest( castShape,castFrom,castTo,*result,allowedCcdPenetration );
+	}
 }

+ 12 - 0
modules/bullet/bullet_glue.h

@@ -9,6 +9,18 @@ namespace bbBullet{
 	btVector3 calculateLocalInertia( btCollisionShape *self,btScalar mass );
 	
 	btTransform getWorldTransform( btMotionState *self );
+	
+	void rayTest( btCollisionWorld *self,
+		const btVector3 &rayFromWorld,
+		const btVector3 &rayToWorld,
+		btCollisionWorld::RayResultCallback *result );
+
+	void convexSweepTest( btCollisionWorld *self,
+		const btConvexShape *castShape,
+		const btTransform &castFrom,
+		const btTransform &castTo,
+		btCollisionWorld::ConvexResultCallback *result,
+		btScalar allowedCcdPenetration );
 }
 
 #endif

+ 5 - 9
modules/mojo/graphics/image.monkey2

@@ -333,18 +333,14 @@ Class Image Extends Resource
 	`specular` can be null, in which case `specularScale` is used for the specular component. Otherwise, `specularScale` is used to modulate the red component of the specular texture.
 	
 	#end
-	Function LoadBump:Image( diffuse:String,normal:String,specular:String,specularScale:Float=1,flipNormalY:Bool=True,shader:Shader=Null )
+	Function LoadBump:Image( diffuse:String,normal:String,specular:String,specularScale:Float=1,flipNormalY:Bool=True,shader:Shader=Null,textureFlags:TextureFlags=TextureFlags.FilterMipmap )
 	
 		Local texture1:=graphics.Texture.LoadNormal( normal,Null,specular,specularScale,flipNormalY )
 		If Not texture1 Return Null
 		
-		Local texture0:=graphics.Texture.Load( diffuse,Null )
+		Local texture0:=graphics.Texture.Load( diffuse,textureFlags )
 		
-		If Not texture0
-			Local pdiff:=New Pixmap( texture1.Width,texture1.Height,PixelFormat.I8 )
-			pdiff.Clear( std.graphics.Color.White )
-			texture0=New graphics.Texture( pdiff,Null )
-		Endif
+		If Not texture0 texture0=graphics.Texture.ColorTexture( std.graphics.Color.White )
 		
 		If Not shader shader=graphics.Shader.GetShader( "bump" )
 		
@@ -357,7 +353,7 @@ Class Image Extends Resource
 
 	#rem monkeydoc Loads a light image from file.
 	#end
-	Function LoadLight:Image( path:String,shader:Shader=Null )
+	Function LoadLight:Image( path:String,shader:Shader=Null,textureFlags:TextureFlags=TextureFlags.FilterMipmap )
 	
 		Local pixmap:=Pixmap.Load( path )
 		If Not pixmap Return Null
@@ -410,7 +406,7 @@ Class Image Extends Resource
 		
 		End
 		
-		Local texture:=New Texture( pixmap,Null )
+		Local texture:=New Texture( pixmap,textureFlags )
 		
 		Local image:=New Image( texture,shader )
 		

+ 2 - 5
modules/mojo3d-loaders/loaders/assimp.monkey2

@@ -94,8 +94,9 @@ Class AssimpLoader
 		Endif
 			
 		aiGetMaterialColor( aimaterial,AI_MATKEY_COLOR_DIFFUSE,0,0,Varptr aicolor )
-		material.ColorFactor=New Color( aicolor.r,aicolor.g,aicolor.b,aicolor.a )
 		
+		material.ColorFactor=New Color( aicolor.r,aicolor.g,aicolor.b,aicolor.a )
+
 		Return material
 	End
 	
@@ -121,8 +122,6 @@ Class AssimpLoader
 		
 			bones=bones.Resize( i0+n )
 			
-			Print "numBones="+n
-			
 			For Local i:=0 Until n
 		
 				Local aibone:=aimesh.mBones[i]
@@ -262,8 +261,6 @@ Class AssimpLoader
 			
 			Local id:=_entityIds[ aichan.mNodeName.data ]
 			
-			Print "i="+i+", id="+id
-			
 			channels[id]=LoadAnimationChannel( aichan )
 		
 		Next

+ 1 - 1
modules/mojo3d-loaders/tests/turtle.monkey2

@@ -4,7 +4,7 @@ Namespace myapp
 #Import "<std>"
 #Import "<mojo>"
 #Import "<mojo3d>"
-#Import "<mojo3d-assimp>"
+#Import "<mojo3d-loaders>"
 
 #Import "../mojo3d"
 

+ 23 - 7
modules/mojo3d-physics/physics/collider.monkey2

@@ -11,6 +11,15 @@ Function CreateInternalEdgeInfo( mesh:btBvhTriangleMeshShape )="bbBullet::create
 Public
 
 Class Collider
+	
+	Property Margin:Float()
+		
+		Return _btshape.getMargin()
+	
+	Setter( margin:Float )
+		
+		_btshape.setMargin( margin )
+	End
 
 	Property btShape:btCollisionShape()
 	
@@ -34,7 +43,11 @@ Protected
 	
 End
 
-Class BoxCollider Extends Collider
+Class ConvexCollider Extends Collider
+	
+End
+
+Class BoxCollider Extends ConvexCollider
 	
 	Method New( box:Boxf )
 	
@@ -45,7 +58,7 @@ Class BoxCollider Extends Collider
 	
 End
 
-Class SphereCollider Extends Collider
+Class SphereCollider Extends ConvexCollider
 	
 	Method New( radius:Float,origin:Vec3f=Null )
 		
@@ -56,7 +69,7 @@ Class SphereCollider Extends Collider
 	
 End
 
-Class CylinderCollider Extends Collider
+Class CylinderCollider Extends ConvexCollider
 	
 	Method New( radius:Float,length:Float,axis:Axis,origin:Vec3f=Null )
 		
@@ -76,7 +89,7 @@ Class CylinderCollider Extends Collider
 
 End
 
-Class CapsuleCollider Extends Collider
+Class CapsuleCollider Extends ConvexCollider
 	
 	Method New( radius:Float,length:Float,axis:Axis,origin:Vec3f=Null )
 		
@@ -96,7 +109,7 @@ Class CapsuleCollider Extends Collider
 	
 End
 
-Class ConeCollider Extends Collider
+Class ConeCollider Extends ConvexCollider
 	
 	Method New( radius:Float,length:Float,axis:Axis,origin:Vec3f=Null )
 		
@@ -116,7 +129,10 @@ Class ConeCollider Extends Collider
 
 End
 
-Class MeshCollider Extends Collider
+Class ConcaveCollider Extends Collider
+End
+
+Class MeshCollider Extends ConcaveCollider
 
 	Method New( mesh:Mesh )
 	
@@ -153,7 +169,7 @@ Class MeshCollider Extends Collider
 	
 End
 
-Class TerrainCollider Extends Collider
+Class TerrainCollider Extends ConcaveCollider
 
 	Method New( box:Boxf,data:Pixmap )
 	

+ 11 - 0
modules/mojo3d-physics/physics/native/objecthandle.h

@@ -0,0 +1,11 @@
+
+#ifndef BB_OBJECT_HANDLE_H
+#define BB_OBJECT_HANDLE_H
+
+#include <bbmonkey.h>
+
+inline void *bb_object_to_handle( bbObject *object ){ return object; }
+
+inline bbObject *bb_handle_to_object( void *handle ){ return static_cast<bbObject*>( handle ); }
+
+#endif

+ 56 - 4
modules/mojo3d-physics/physics/rigidbody.monkey2

@@ -36,12 +36,15 @@ Class RigidBody
 	
 	#rem monkeydoc Creates a new rigid body.
 	#end
-	Method New( mass:Float,collider:Collider,entity:Entity,kinematic:Bool=False )
+	Method New( mass:Float,collider:Collider,entity:Entity,kinematic:Bool=False,collGroup:Int=1,collMask:Int=1 )
 		
 		_mass=mass
 		_collider=collider
 		_entity=entity
 		_kinematic=kinematic
+		_collGroup=collGroup
+		_collMask=collMask
+		
 		_world=World.GetDefault()
 		
 		If _kinematic
@@ -53,7 +56,7 @@ Class RigidBody
 		Local inertia:btVector3=_collider ? _collider.btShape.calculateLocalInertia( _mass ) Else New btVector3( 0,0,0 )
 		
 		_btbody=New btRigidBody( _mass,_btmotion,_collider.btShape,inertia )
-			
+		
 		If _kinematic 
 			_btbody.setCollisionFlags( _btbody.getCollisionFlags() | btCollisionObject.CF_KINEMATIC_OBJECT )
 			_btbody.setActivationState( DISABLE_DEACTIVATION )
@@ -98,6 +101,16 @@ Class RigidBody
 		Return _collider
 	End
 	
+	Property CollisionGroup:Short()
+		
+		Return _collGroup
+	End
+	
+	Property CollisionMask:Short()
+		
+		Return _collMask
+	End
+	
 	Property Entity:Entity()
 	
 		Return _entity
@@ -139,7 +152,42 @@ Class RigidBody
 		_btbody.setRollingFriction( friction )
 	End
 	
-	'***** INTERNAL *****
+	Method ApplyForce( force:Vec3f,relativePos:Vec3f )
+		
+		_btbody.applyForce( force,relativePos )
+	End
+	
+	Method ApplyCentralForce( force:Vec3f )
+		
+		_btbody.applyCentralForce( force )
+	End
+	
+	Method ApplyTorque( torque:Vec3f )
+		
+		_btbody.applyTorque( torque )
+	End
+	
+	Method ApplyImpulse( impulse:Vec3f,relativePos:Vec3f )
+		
+		_btbody.applyImpulse( impulse,relativePos )
+	End
+	
+	Method ApplyTorqueImpulse( torque:Vec3f )
+		
+		_btbody.applyTorqueImpulse( torque )
+	End
+	
+	Method ApplyCentralImpulse( impulse:Vec3f )
+		
+		_btbody.applyCentralImpulse( impulse )
+	End
+	
+	Function Get:RigidBody( btobject:btCollisionObject )
+		
+		Return Cast<RigidBody>( handle_to_object( btobject.getUserPointer() ) )
+	End
+
+	Internal
 	
 	Property btBody:btRigidBody()
 	
@@ -167,13 +215,17 @@ Class RigidBody
 		
 		_seq=_entity.Seq
 	End
-
+	
 Private
 
+	Field _self:RigidBody
+
 	Field _mass:Float	
 	Field _collider:Collider
 	Field _entity:Entity
 	Field _kinematic:Bool
+	Field _collGroup:Int
+	Field _collMask:Int
 	Field _world:World
 	Field _seq:Int
 	

+ 78 - 5
modules/mojo3d-physics/physics/world.monkey2

@@ -1,6 +1,46 @@
 
 Namespace mojo3d.physics
 
+#Import "native/objecthandle.h"
+
+Extern
+
+Function object_to_handle:Void Ptr( obj:Object )="bb_object_to_handle"
+
+Function handle_to_object:Object( handle:Void Ptr )="bb_handle_to_object"
+
+Public
+
+Class RaycastResult
+
+	Field time:Float
+	Field body:RigidBody
+	Field point:Vec3f
+	Field normal:Vec3f
+	
+	Method New()
+	End
+	
+	Method New( btresult:btCollisionWorld.ClosestRayResultCallback )
+		time=btresult.m_closestHitFraction
+		body=Cast<RigidBody>( handle_to_object( btresult.m_collisionObject.getUserPointer() ) )
+		point=btresult.m_hitPointWorld
+		normal=btresult.m_hitNormalWorld
+	End
+	
+	Method New( btresult:btCollisionWorld.ClosestConvexResultCallback )
+		
+		Local castFrom:=Cast<Vec3f>( btresult.m_convexFromWorld )
+		Local castTo:=Cast<Vec3f>( btresult.m_convexToWorld )
+		
+		time=btresult.m_closestHitFraction
+		body=Cast<RigidBody>( handle_to_object( btresult.m_hitCollisionObject.getUserPointer() ) )
+		point=(castTo-castFrom) * btresult.m_closestHitFraction + castFrom
+		normal=btresult.m_hitNormalWorld
+	End
+	
+End
+
 Class World
 	
 	Method New()
@@ -14,7 +54,7 @@ Class World
 		Local solver:=New btSequentialImpulseConstraintSolver()
 		
 		_btworld=New btDiscreteDynamicsWorld( dispatcher,broadphase,solver,config )
-		
+
 		Gravity=New Vec3f( 0,-9.81,0 )
 		
 	End
@@ -44,6 +84,35 @@ Class World
 		
 	End
 	
+	Method RayCast:RaycastResult( rayFrom:Vec3f,rayTo:Vec3f )
+		
+		Local btresult:=New btCollisionWorld.ClosestRayResultCallback( rayFrom,rayTo )
+		
+		_btworld.rayTest( rayFrom,rayTo,Cast<btCollisionWorld.RayResultCallback Ptr>( Varptr btresult ) )
+		
+		If Not btresult.hasHit() Return Null
+		
+		Return New RaycastResult( btresult )
+	End
+	
+	Method ConvexSweep:RaycastResult( collider:ConvexCollider,castFrom:AffineMat4f,castTo:AffineMat4f )
+		
+		Local btresult:=New btCollisionWorld.ClosestConvexResultCallback( castFrom.t,castTo.t )
+		
+		_btworld.convexSweepTest( Cast<btConvexShape>( collider.btShape ),castFrom,castTo,Cast<btCollisionWorld.ConvexResultCallback Ptr>( Varptr btresult ),0 )
+		
+		If Not btresult.hasHit() Return Null
+		
+		Return New RaycastResult( btresult )
+		
+	End
+	
+	Method ConvexSweep:RaycastResult( collider:ConvexCollider,castFrom:Vec3f,castTo:Vec3f )
+		
+		Return ConvexSweep( collider,AffineMat4f.Translation( castFrom ),AffineMat4f.Translation( castTo ) )
+
+	End
+	
 	Function GetDefault:World()
 	
 		Global _default:=New World
@@ -51,13 +120,15 @@ Class World
 		Return _default
 	End
 
-	'***** INTERNAL *****
-		
+	Internal
+	
 	Method Add( body:RigidBody )
 		
 		_bodies.Add( body )
 		
-		_btworld.addRigidBody( body.btBody )
+		_btworld.addRigidBody( body.btBody,body.CollisionGroup,body.CollisionMask )
+		
+		body.btBody.setUserPointer( object_to_handle( body ) )
 	End
 	
 	Method Remove( body:RigidBody )
@@ -65,8 +136,10 @@ Class World
 		_bodies.Remove( body )
 
 		_btworld.removeRigidBody( body.btBody )
+
+		body.btBody.setUserPointer( Null )
 	End
-		
+	
 	Private
 	
 	Field _btworld:btDynamicsWorld

+ 22 - 3
modules/mojo3d-physics/tests/shapes.monkey2

@@ -1,3 +1,4 @@
+
 Namespace myapp
 
 #Import "<std>"
@@ -56,6 +57,8 @@ Class MyWindow Extends Window
 	
 	Field _sphere:Model
 	
+	Field _collider:SphereCollider
+	
 	Method New( title:String="Simple mojo app",width:Int=640,height:Int=480,flags:WindowFlags=WindowFlags.Resizable )
 
 		Super.New( title,width,height,flags )
@@ -97,6 +100,12 @@ Class MyWindow Extends Window
 		Local collider:Collider=New BoxCollider( groundBox )
 		
 		Local body:=New RigidBody( 0,collider,_ground )
+
+		_sphere=Model.CreateSphere( .5,24,12,New PbrMaterial( Color.White ) )
+		
+		_collider=New SphereCollider( .5 )
+		
+'		Return
 		
 		'create some meshes/colliders
 		
@@ -129,7 +138,6 @@ Class MyWindow Extends Window
 				
 				Local model:=New Model( mesh,material )
 				model.Move( x,10,z )
-'				model.RotateZ( Rnd(-.1,.1) )
 				
 				Local body:=New RigidBody( 1,colliders[i],model )
 				
@@ -140,16 +148,27 @@ Class MyWindow Extends Window
 	End
 	
 	Method OnRender( canvas:Canvas ) Override
-	
+		
 		RequestRender()
 		
 		util.Fly( _camera,Self )
 		
+'		Local cresult:=World.GetDefault().ConvexSweep( _collider,_camera.Position,_camera.Position+_camera.Basis.k * 100 )
+
+		Local cresult:=World.GetDefault().ConvexSweep( _collider,_camera.Position+_camera.Basis.k * 2,_camera.Position+_camera.Basis.k * 100 )
+		
+		'Local cresult:=World.GetDefault().RayCast( _camera.Position,_camera.Position+_camera.Basis.k * 100 )
+		
+		If cresult 
+			Print "pos="+cresult.point
+			_sphere.Position=cresult.point'+cresult.normal
+		Endif
+			
 		World.GetDefault().Update()
 		
 		_scene.Render( canvas,_camera )
 		
-		canvas.DrawText( "Width="+Width+", Height="+Height+", FPS="+App.FPS,0,0 )
+		canvas.DrawText( "Camera pos="+_camera.Position+", Width="+Width+", Height="+Height+", FPS="+App.FPS,0,0 )
 	End
 	
 End

+ 10 - 10
modules/mojo3d-physics/tests/util.monkey2

@@ -4,23 +4,23 @@ Namespace util
 Function Fly( entity:Entity,view:View )
 
 	If Keyboard.KeyDown( Key.Up )
-		entity.RotateX( .1 )
+		entity.RotateX( .05 )
 	Else If Keyboard.KeyDown( Key.Down )
-		entity.RotateX( -.1 )
-	Endif
-	
-	If Keyboard.KeyDown( Key.Q )
-		entity.RotateZ( .1 )
-	Else If Keyboard.KeyDown( Key.W )
-		entity.RotateZ( -.1 )
+		entity.RotateX( -.05 )
 	Endif
 	
 	If Keyboard.KeyDown( Key.Left )
-		entity.RotateY( .1,True )
+		entity.RotateY( .025,True )
 	Else If Keyboard.KeyDown( Key.Right )
-		entity.RotateY( -.1,True )
+		entity.RotateY( -.025,True )
 	Endif
 
+	If Keyboard.KeyDown( Key.Q )
+		entity.RotateZ( .01 )
+	Else If Keyboard.KeyDown( Key.W )
+		entity.RotateZ( -.01 )
+	Endif
+	
 	If Mouse.ButtonDown( MouseButton.Left )
 		If Mouse.X<view.Width/3
 			entity.RotateY( .1,True )

+ 16 - 0
modules/mojo3d/graphics/entity.monkey2

@@ -115,6 +115,20 @@ Class Entity
 		Invalidate()
 	End
 	
+	#rem monkeydoc Number of child entities.
+	#end
+	Property NumChildren:Int()
+		
+		Return _children.Length
+	End
+	
+	#rem monkeydoc Array of child entities.
+	#end
+	Property Children:Entity[]()
+		
+		Return _children.ToArray()
+	End
+
 	#rem monkeydoc entity visibility flag.
 	#end
 	Property Visible:Bool()
@@ -422,6 +436,8 @@ Class Entity
 		_parent=Null
 		
 		_scene=Null
+		
+		Destroyed()
 	End
 	
 	#rem monkeydoc Sets entity position in local or world space.

+ 4 - 0
modules/std/geom/line.monkey2

@@ -31,6 +31,10 @@ Struct Line<T>
 		Return New Line( o-v,d )
 	End
 	
+	Operator*:Vec3<T>( time:Double )
+		Return o+d*time
+	End
+	
 	Method Nearest:Vec3<T>( p:Vec3<T> )
 		Return o+d*( d.Dot( p-o )/d.Dot( d ) )
 	End

+ 17 - 1
modules/std/geom/plane.monkey2

@@ -16,30 +16,46 @@ Struct Plane<T>
 	End
 	
 	Method New( n:Vec3<T>,d:T )
+		
 		Self.n=n
 		Self.d=d
 	End
 	
 	Method New( p:Vec3<T>,n:Vec3<T> )
+		
 		Self.n=n
 		Self.d=-n.Dot( p )
 	End
 	
 	Method New( v0:Vec3<T>,v1:Vec3<T>,v2:Vec3<T> )
+		
 		n=(v1-v0).Cross(v2-v0).Normalize()
 		d=-n.Dot( v0 )
 	End
 	
 	Operator-:Plane()
+	
 		Return New Plane( -n,-d )
 	End
 	
 	Method Distance:Double( p:Vec3<T> )
-		return n.Dot( p )+d
+		
+		Return n.Dot( p )+d
 	End
 
 	Method Nearest:Vec3<T>( p:Vec3<T> )
+		
 		Return p-n*Distance( p )
 	End
 	
+	Method TIntersect:Double( line:Line<T> )
+		
+		Return -Distance( line.o )/n.Dot( line.d )
+	End
+	
+	Method Intersect:Vec3<T>( line:Line<T> )
+		
+		Return line * TIntersect( line )
+	End
+	
 End

+ 2 - 2
products/android/Monkey2Game/app/src/main/java/org/libsdl/app/SDLActivity.java

@@ -71,8 +71,8 @@ public class SDLActivity extends Activity {
      */
     protected String[] getLibraries() {
 		return new String[] {
-				"mx2_main",
-				"openal"
+				"openal",
+				"mx2_main"
         };    
     }
 

+ 6 - 0
src/mx2cc/buildproduct.monkey2

@@ -702,11 +702,17 @@ Class AndroidBuildProduct Extends BuildProduct
 		buf.Push( "APP_OPTIM := "+opts.config )
 		
 		buf.Push( "APP_ABI := "+GetEnv( "MX2_ANDROID_APP_ABI","armeabi-v7a" ) )
+		
 		buf.Push( "APP_PLATFORM := "+GetEnv( "MX2_ANDROID_APP_PLATFORM","10" ) )
+		
 		buf.Push( "APP_CFLAGS += -std=gnu99" )
+		buf.Push( "APP_CFLAGS += -fno-stack-protector" )
+		
 		buf.Push( "APP_CPPFLAGS += -std=c++11" )
 		buf.Push( "APP_CPPFLAGS += -frtti" )
 		buf.Push( "APP_CPPFLAGS += -fexceptions" )
+		buf.Push( "APP_CPPFLAGS += -fno-stack-protector" )
+		
 		buf.Push( "APP_STL := c++_static" )
 		
 		CSaveString( buf.Join( "~n" ),jniDir+"Application.mk" )