Pydoc: Fix multiple bpy.type modules
[blender.git] / doc / python_api / rst / bge_types / bge.types.KX_SCA_ReplaceMeshActuator.rst
1 KX_SCA_ReplaceMeshActuator(SCA_IActuator)
2 =========================================
3
4 base class --- :class:`SCA_IActuator`
5
6 .. class:: KX_SCA_ReplaceMeshActuator(SCA_IActuator)
7
8    Edit Object actuator, in Replace Mesh mode.
9
10    .. warning::
11
12       Replace mesh actuators will be ignored if at game start, the named mesh doesn't exist.
13
14       This will generate a warning in the console
15
16       .. code-block:: none
17       
18          Error: GameObject 'Name' ReplaceMeshActuator 'ActuatorName' without object
19
20    .. code-block:: python
21
22       # Level-of-detail
23       # Switch a game object's mesh based on its depth in the camera view.
24       # +----------+     +-----------+     +-------------------------------------+
25       # | Always   +-----+ Python    +-----+ Edit Object (Replace Mesh) LOD.Mesh |
26       # +----------+     +-----------+     +-------------------------------------+
27       from bge import logic
28
29       # List detail meshes here
30       # Mesh (name, near, far)
31       # Meshes overlap so that they don't 'pop' when on the edge of the distance.
32       meshes = ((".Hi", 0.0, -20.0),
33             (".Med", -15.0, -50.0),
34             (".Lo", -40.0, -100.0)
35           )
36       
37       cont = logic.getCurrentController()
38       object = cont.owner
39       actuator = cont.actuators["LOD." + obj.name]
40       camera = logic.getCurrentScene().active_camera
41       
42       def Depth(pos, plane):
43         return pos[0]*plane[0] + pos[1]*plane[1] + pos[2]*plane[2] + plane[3]
44       
45       # Depth is negative and decreasing further from the camera
46       depth = Depth(object.position, camera.world_to_camera[2])
47       
48       newmesh = None
49       curmesh = None
50       # Find the lowest detail mesh for depth
51       for mesh in meshes:
52         if depth < mesh[1] and depth > mesh[2]:
53           newmesh = mesh
54         if "ME" + object.name + mesh[0] == actuator.getMesh():
55             curmesh = mesh
56       
57       if newmesh != None and "ME" + object.name + newmesh[0] != actuator.mesh:
58         # The mesh is a different mesh - switch it.
59         # Check the current mesh is not a better fit.
60         if curmesh == None or curmesh[1] < depth or curmesh[2] > depth:
61           actuator.mesh = object.name + newmesh[0]
62           cont.activate(actuator)
63
64    .. attribute:: mesh
65
66       :class:`MeshProxy` or the name of the mesh that will replace the current one.
67    
68       Set to None to disable actuator.
69
70       :type: :class:`MeshProxy` or None if no mesh is set
71
72    .. attribute:: useDisplayMesh
73
74       when true the displayed mesh is replaced.
75
76       :type: boolean
77
78    .. attribute:: usePhysicsMesh
79
80       when true the physics mesh is replaced.
81
82       :type: boolean
83
84    .. method:: instantReplaceMesh()
85
86       Immediately replace mesh without delay.