Revision: 36315
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=36315
Author:   moguri
Date:     2011-04-24 22:11:13 +0000 (Sun, 24 Apr 2011)
Log Message:
-----------
There is enough potential developer interest in BGE Components that I'm making 
a branch for them. I'm also committing my initial work in the area.

Modified Paths:
--------------
    branches/bge_components/release/scripts/modules/bpy/utils.py
    branches/bge_components/release/scripts/startup/bl_ui/space_logic.py
    branches/bge_components/source/blender/blenkernel/CMakeLists.txt
    branches/bge_components/source/blender/blenkernel/intern/object.c
    branches/bge_components/source/blender/blenloader/intern/readfile.c
    branches/bge_components/source/blender/blenloader/intern/writefile.c
    branches/bge_components/source/blender/editors/space_logic/logic_ops.c
    branches/bge_components/source/blender/makesdna/DNA_object_types.h
    branches/bge_components/source/blender/makesdna/DNA_space_types.h
    branches/bge_components/source/blender/makesdna/intern/makesdna.c
    branches/bge_components/source/blender/makesrna/RNA_access.h
    branches/bge_components/source/blender/makesrna/intern/makesrna.c
    branches/bge_components/source/blender/makesrna/intern/rna_internal.h
    branches/bge_components/source/blender/makesrna/intern/rna_object.c
    branches/bge_components/source/blender/makesrna/intern/rna_space.c
    branches/bge_components/source/blender/python/intern/bpy.c
    
branches/bge_components/source/gameengine/Converter/BL_BlenderDataConversion.cpp
    branches/bge_components/source/gameengine/Ketsji/CMakeLists.txt
    branches/bge_components/source/gameengine/Ketsji/KX_GameObject.cpp
    branches/bge_components/source/gameengine/Ketsji/KX_GameObject.h
    branches/bge_components/source/gameengine/Ketsji/KX_PythonInitTypes.cpp
    branches/bge_components/source/gameengine/Ketsji/KX_PythonInitTypes.h
    branches/bge_components/source/gameengine/Ketsji/KX_PythonSeq.cpp
    branches/bge_components/source/gameengine/Ketsji/KX_PythonSeq.h
    branches/bge_components/source/gameengine/Ketsji/KX_Scene.cpp

Added Paths:
-----------
    branches/bge_components/
    branches/bge_components/release/scripts/bge_components/
    branches/bge_components/release/scripts/bge_components/camera.py
    branches/bge_components/release/scripts/bge_components/movement.py
    branches/bge_components/release/scripts/bge_components/particle.py
    branches/bge_components/release/scripts/bge_components/vehicle.py
    branches/bge_components/source/blender/blenkernel/BKE_pycomponent.h
    branches/bge_components/source/blender/blenkernel/intern/python_component.c
    branches/bge_components/source/blender/makesdna/DNA_component_types.h
    branches/bge_components/source/blender/makesrna/intern/rna_pycomponent.c
    branches/bge_components/source/gameengine/Ketsji/KX_PythonComponent.cpp
    branches/bge_components/source/gameengine/Ketsji/KX_PythonComponent.h

Added: branches/bge_components/release/scripts/bge_components/camera.py
===================================================================
--- branches/bge_components/release/scripts/bge_components/camera.py            
                (rev 0)
+++ branches/bge_components/release/scripts/bge_components/camera.py    
2011-04-24 22:11:13 UTC (rev 36315)
@@ -0,0 +1,74 @@
+import bge
+from collections import OrderedDict
+
+class ThirdPerson(bge.types.KX_PythonComponent):
+       """A component for a third person camera"""
+       
+       args = OrderedDict([
+               ("pPivot Name", "pivot"),
+               ("Time Offset", 35),
+               ("Lens", 30),
+               ("Scale Max", 4.0),
+               ("Scale Min", 0.6),
+               ("Option", {"One", "Two"})
+               ])
+               
+       def start(self, args):
+               # Make sure we have a camera
+               if not isinstance(self.object, bge.types.KX_Camera):
+                       raise TypeError("This component must be attached to a 
camera")
+               
+               print(args['Option'])
+               # Apply settings
+               self.object.parent.timeOffset = args['Time Offset']
+               self.object.lens = args['Lens']
+               
+               # Save scale settings
+               self.scale_max = args['Scale Max']
+               self.scale_min = args['Scale Min']
+               
+               # Find the pivot
+               pivot = self.object.parent
+               
+               while pivot:
+                       if pivot.name == args['Pivot Name']:
+                               break
+
+                       pivot = pivot.parent
+                       
+               if not pivot:
+                       raise ValueError("Could not find the pivot object")
+                       
+               self.pivot = pivot
+               
+               self._target_distance = (self.object.worldPosition - 
pivot.worldPosition).length
+               
+       def update(self):
+               ob = self.object
+               pivot = self.pivot
+       
+               # Cast a ray and see if we hit something
+               hit_pos = self.object.rayCast(
+                                       ob.worldPosition,
+                                       pivot.worldPosition,
+                                       ob.localPosition[2])[1]
+                                       
+               if hit_pos:
+                       scale = ob.getDistanceTo(hit_pos)/self._target_distance
+                       if scale > self.scale_max:
+                               scale = self.scale_max
+                       elif scale < self.scale_min:
+                               scale = self.scale_min
+               else:
+                       scale = self.scale_max
+                       
+               # Apply the scaling
+               pivot.scaling = [scale, scale, scale]
+               
+               # Undo the scaling on the camera
+               # inv_scale = 1/scale
+               # ob.scaling = [inv_scale, inv_scale, inv_scale]
+               
+               # Update the "look at"
+               vec = ob.getVectTo(pivot)[1]
+               ob.alignAxisToVect(vec, 1)
\ No newline at end of file

Added: branches/bge_components/release/scripts/bge_components/movement.py
===================================================================
--- branches/bge_components/release/scripts/bge_components/movement.py          
                (rev 0)
+++ branches/bge_components/release/scripts/bge_components/movement.py  
2011-04-24 22:11:13 UTC (rev 36315)
@@ -0,0 +1,39 @@
+import bge
+
+class ThirdPerson(bge.types.KX_PythonComponent):
+       """Basic third person controls
+       
+       W: move forward
+       A: turn left
+       S: move backward
+       D: turn right
+       
+       """
+       
+       args = {
+               "Move Speed": 10,
+               "Turn Speed": 0.04
+       }
+       
+       def start(self, args):
+               self.move_speed = args['Move Speed']
+               self.turn_speed = args['Turn Speed']
+               
+       def update(self):
+               keyboard = bge.logic.keyboard.events
+               
+               move = 0
+               rotate = 0
+               
+               if keyboard[bge.events.WKEY]:
+                       move += self.move_speed
+               if keyboard[bge.events.SKEY]:
+                       move -= self.move_speed
+                       
+               if keyboard[bge.events.AKEY]:
+                       rotate += self.turn_speed
+               if keyboard[bge.events.DKEY]:
+                       rotate -= self.turn_speed
+                       
+               self.object.setLinearVelocity((0, move, 0), True)
+               self.object.applyRotation((0, 0, rotate), True)

Added: branches/bge_components/release/scripts/bge_components/particle.py
===================================================================
--- branches/bge_components/release/scripts/bge_components/particle.py          
                (rev 0)
+++ branches/bge_components/release/scripts/bge_components/particle.py  
2011-04-24 22:11:13 UTC (rev 36315)
@@ -0,0 +1,116 @@
+import bge
+import mathutils
+import math
+import random
+from collections import OrderedDict
+
+X_AXIS = mathutils.Vector((1, 0, 0))
+Y_AXIS = mathutils.Vector((0, 1, 0))
+Z_AXIS = mathutils.Vector((0, 0, 1))
+
+class ParticleSystem(bge.types.KX_PythonComponent):
+       """Simple particles System"""
+       
+       args = OrderedDict([
+               ("Particle Name", ""),
+               ("Particles Per Frame", 1),
+               ("X Angle", 30.0),
+               ("Y Angle", 30.0),
+               ("X Size", 0.0),
+               ("Y Size", 0.0),
+               ("Starting Velocity", 500.0),
+               ("Velocity Variance", 0.0),
+               ("Particle Life", 30),
+               ("Life Variance", 0.0),
+               ("Gravity", -9.8),
+               ])
+               
+       def start(self, args):
+               self.valid = True
+               self.particle = args['Particle Name']
+               self.part_life = args['Particle Life']
+               self.ppf_inv = 1/(args['Particles Per Frame'] if 
args['Particles Per Frame'] else 1)
+               
+               # Save directional variance as radians
+               self.x_var = math.radians(args['X Angle'])
+               self.y_var = math.radians(args['Y Angle'])
+               
+               # Save the offests
+               self.x_off = args['X Size']
+               self.y_off = args['Y Size']
+               
+               # Save variances
+               self.velocity_var = args['Velocity Variance']
+               self.life_variance = args['Life Variance']
+               
+               # Store a time step
+               self.dt = 1/bge.logic.getLogicTicRate()
+               
+               # Precalculate gravity*dt
+               self.gravity_dt = args['Gravity']*self.dt
+               
+               # Precalculate velocity*dt
+               self.start_velocity_dt = args['Starting Velocity'] * self.dt
+               
+               # Add the first particle into the list
+               self.particle_list = [self.create_particle()]
+               
+       def update(self):
+               frame_position = self.ppf_inv
+               while frame_position <= 1:
+                       
self.particle_list.append(self.create_particle(frame_position))
+                       frame_position += self.ppf_inv
+                       
+               [self.update_particle(particle) for particle in 
self.particle_list]
+                       
+       def create_particle(self, frame_position=0):
+               # Add the particle
+               scene = bge.logic.getCurrentScene()
+               particle = scene.addObject(self.particle, self.object, 0)
+               
+               # Determine particle heading
+               x_tilt = random.uniform(-self.x_var, self.x_var)
+               y_tilt = random.uniform(-self.y_var, self.y_var)
+               
+               # Apply x offset
+               x_dir = self.object.getAxisVect(X_AXIS)
+               particle.worldPosition = particle.worldPosition.copy() + x_dir 
* random.uniform(-self.x_off, self.x_off)
+               
+               # Apply y offset
+               y_dir = self.object.getAxisVect(Y_AXIS)
+               particle.worldPosition = particle.worldPosition.copy() + y_dir 
* random.uniform(-self.y_off, self.y_off)
+               
+               # Determine the particle velocity vector
+               velocity = self.object.getAxisVect(Z_AXIS)
+               velocity.rotate(mathutils.Euler((x_tilt, 0, 0)))
+               velocity.rotate(mathutils.Euler((0, y_tilt, 0)))
+               
+               # Assign the particle properties
+               particle['life'] = self.part_life
+               if self.life_variance > .0001:
+                       particle['life'] *= 
1+random.uniform(-self.life_variance, self.life_variance)
+               particle['velocity'] = velocity * self.start_velocity_dt
+               if self.velocity_var > .0001:
+                       particle['velocity'] *= 
1+random.uniform(-self.velocity_var, self.velocity_var)
+               # Deal with subframe positioning
+               if frame_position < 1:
+                       particle.worldPosition = particle.worldPosition.copy() 
+ particle['velocity']*self.dt*frame_position
+               
+               # Return the particle
+               return particle
+               
+       def update_particle(self, particle):
+               # Update particle life
+               if particle['life'] == 0:
+                       self.particle_list.remove(particle)
+                       particle.endObject()
+                       return
+               else:
+                       particle['life'] -= 1
+                       
+               # Apply gravity to the particle's velocity
+               particle['velocity'][2] += self.gravity_dt
+               
+               # Update particle position
+               particle.worldPosition = particle.worldPosition.copy() + 
particle['velocity']*self.dt
+               

Added: branches/bge_components/release/scripts/bge_components/vehicle.py
===================================================================
--- branches/bge_components/release/scripts/bge_components/vehicle.py           
                (rev 0)
+++ branches/bge_components/release/scripts/bge_components/vehicle.py   
2011-04-24 22:11:13 UTC (rev 36315)
@@ -0,0 +1,129 @@
+import bge
+from collections import OrderedDict
+
+class Vehicle(bge.types.KX_PythonComponent):
+       """A component making use of the vehicle wrapper
+       
+       Controls:
+       W: Move forward
+       S: Move backward
+       A: Turn left
+       D: Turn right
+       SPACE: Brake
+       
+       """
+       
+       args = OrderedDict([
+               ("Gas Power", 15.0),
+               ("Reverse Power", 10.0),
+               ("Brake Power", 10.0),
+               ("Turn Power", 0.3),
+               
+               ("Front Wheel Drive", True),
+               ("Rear Wheel Drive", False),
+               ("Tire Prefix", "tire_"),
+               ("Front Tire Radius", 0.3),
+               ("Rear Tire Radius", 0.3),
+               ("Tire Friction", 10.0),
+               ("Suspension Height", 0.2),
+               ("Suspension Compression", 6.0),
+               ("Suspension Damping", 1.0),
+               ("Suspension Stiffness", 20.0),
+               ("Roll Influence", 0.06),
+               ])
+       
+       def start(self, args):
+       
+               # Save power settings
+               self.gas = args['Gas Power']
+               self.reverse = args['Reverse Power']
+               self.brake = args['Brake Power']
+               self.turn = args['Turn Power']
+               
+               # Save steering settings
+               self.fwd = args['Front Wheel Drive']
+               self.rwd = args['Rear Wheel Drive']
+               
+               # Create the vehicle constraint
+               constraint = 
bge.constraints.createConstraint(self.object.getPhysicsId(), 0, 11)
+               cid = constraint.getConstraintId()
+               vid = bge.constraints.getVehicleConstraint(cid)
+               self.vid = vid
+               
+               # Find the tires (they should be parented)
+               tpx = args['Tire Prefix']
+               tires = [None]*4
+               for child in self.object.childrenRecursive:
+                       for i in range(4):
+                               if child.name.startswith(tpx+str(i+1)):
+                                       tires[i] = child
+                                       
+                                       # Unparent the tire so it doesn't cause 
the vehicle wrapper grief
+                                       child.removeParent()
+
+               # Verify that we have all of the tires
+               for idx, tire in enumerate(tires):
+                       if tire is None:
+                               raise ValueError("Tire "+str(idx+1)+" not 
found")
+                               
+               # Now setup the tires
+               for i in range(4):                      
+                       # Add the wheel
+                       vid.addWheel(
+                                       # Object
+                                       tires[i],
+                                       
+                                       # Position
+                                       tires[i].worldPosition - 
self.object.worldPosition,
+                                       
+                                       # Suspension angle
+                                       (0, 0, -1),
+                                       
+                                       # Suspension axis
+                                       (-1, 0, 0),
+                                       
+                                       # Suspension height
+                                       args['Suspension Height'],
+                                       
+                                       # Tire radius
+                                       args['Front Tire Radius'] if i in (0, 
1) else args['Rear Tire Radius'],
+                                       
+                                       # Steerability
+                                       args['Front Wheel Drive'] if i in (2, 
3) else args['Rear Wheel Drive'])
+                                       
+                       # Advanced settings
+                       vid.setTyreFriction(args['Tire Friction'], i)
+                       vid.setSuspensionCompression(args['Suspension 
Compression'], i)
+                       vid.setSuspensionDamping(args['Suspension Damping'], i)
+                       vid.setSuspensionStiffness(args['Suspension 
Stiffness'], i)
+                       vid.setRollInfluence(args['Roll Influence'], i)
+                                       
+       def update(self):
+               keyboard = bge.logic.keyboard.events
+               # Engine force

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to