-
Notifications
You must be signed in to change notification settings - Fork 2
/
default.py
169 lines (137 loc) · 6.19 KB
/
default.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
from panda3d.core import *
from pandac.PandaModules import loadPrcFileData
loadPrcFileData("", "framebuffer-multisample 1")
loadPrcFileData("", "prefer-parasite-buffer #f")
loadPrcFileData("", """fullscreen 1""" )
import direct.directbase.DirectStart
from direct.showbase.Audio3DManager import Audio3DManager
from direct.showbase.DirectObject import DirectObject
from panda3d.physx import PhysxManager
from panda3d.physx import PhysxEnums
from panda3d.physx import PhysxSceneDesc
from panda3d.physx import PhysxBodyDesc
from panda3d.physx import PhysxActorDesc
from panda3d.physx import PhysxBoxShapeDesc
from panda3d.physx import PhysxPlaneShapeDesc
from panda3d.physx import PhysxPointOnLineJointDesc
from panda3d.physx import PhysxTriangleMeshDesc
from panda3d.physx import PhysxTriangleMesh
from panda3d.physx import PhysxTriangleMeshShape
from panda3d.physx import PhysxTriangleMeshShapeDesc
from panda3d.physx import PhysxKitchen
from skydome import SkyDome
from Car import Car
from keycontrol import KeyControl
from cameracontrol import CameraControl
from speedometer import Speedometer
from stearingcontrol import SteeringControl
import sys
class World( DirectObject ):
""" Dynamic world """
def __init__(self):
""" Constructs the World """
self.sky = SkyDome( "Resources/Models/skydome.egg" )
self.sky.sky.setScale( Vec3( 10,10,10))
self.setupPhysX()
self.setup3DAudio()
self.car = Car( self.physxScene, self.audio3d, "defender.xml" )
self.car.setActiveAudioProfile( 'outside' )
self.setupLight()
self.initTrack()
taskMgr.add(self.simulate, 'PhysX Simulation')
# To to use Steering Wheel change inputHandler to SteeringControl
self.inputHandler = KeyControl( self.car )
#self.inputHandler = SteeringControl( self.car )
self.cameraControl = CameraControl( self.car )
self.cameraControl.enableTowerCamera()
self.speedometer = Speedometer();
render.setShaderAuto()
self.accept( 'escape', sys.exit )
# To turn on physx visual debugging, uncomment below
#self.enablePhysxDebug()
def initTrack(self):
""" Loads the track model and the collision model for it. """
kitchen = PhysxKitchen()
trackCollision = loader.loadModel( "Resources/Models/TrackCollision.egg" )
fenceCollision = loader.loadModel( "Resources/Models/FenceCollision.egg")
self.track = loader.loadModel( "Resources/Models/Track.egg" )
triMeshDesc = PhysxTriangleMeshDesc()
triMeshDesc.setFromNodePath( trackCollision )
triMesh = kitchen.cookTriangleMesh( triMeshDesc )
triMeshShapeDesc = PhysxTriangleMeshShapeDesc()
triMeshShapeDesc.setMesh( triMesh )
triMeshDesc2 = PhysxTriangleMeshDesc()
triMeshDesc2.setFromNodePath( fenceCollision )
triMesh2 = kitchen.cookTriangleMesh( triMeshDesc2 )
triMeshShapeDesc2 = PhysxTriangleMeshShapeDesc()
triMeshShapeDesc2.setMesh( triMesh2 )
actor = PhysxActorDesc()
actor.setName( 'trackcollision' )
actor.addShape( triMeshShapeDesc )
actor.addShape( triMeshShapeDesc2 )
self.physxtrack = self.physxScene.createActor( actor )
self.track.reparentTo( render )
loader.loadModel( "Resources/Models/Fence.egg" ).reparentTo( self.track )
loader.loadModel( "Resources/Models/Rocks.egg" ).reparentTo( self.track )
linfog = Fog( "Fog" )
linfog.setColor( Vec4( 0.8, 0.85, 0.8, 1 ) )
linfog.setExpDensity( 0.003 )
self.track.attachNewNode(linfog)
render.setFog(linfog)
def enablePhysxDebug(self):
""" Turns on physx visual debuggging """
self.debugNP = render.attachNewNode(self.physxScene.getDebugGeomNode())
self.debugNP.node().on()
self.debugNP.node().visualizeWorldAxes(True)
def setupPhysX(self):
""" Sets up the physx world """
self.physx = PhysxManager.getGlobalPtr()
sceneDesc = PhysxSceneDesc()
sceneDesc.setGravity(Vec3(0, 0, -9.81))
self.physxScene = self.physx.createScene(sceneDesc)
mGround = self.physxScene.getMaterial( 0 )
mGround.setRestitution(0.0)
mGround.setStaticFriction(0.8)
mGround.setDynamicFriction(0.2)
def setup3DAudio(self):
""" Initializes the 3D audio manager """
self.audio3d = Audio3DManager( base.sfxManagerList[0], base.cam )
def setupLight(self):
""" Sets up the scene lighting """
ambient_source = AmbientLight('ambient')
ambient_source.setColor(Vec4( 0.6, 0.65, 0.7, 1 ))
ambient = render.attachNewNode(ambient_source.upcastToPandaNode())
render.setLight( ambient )
sun = render.attachNewNode( DirectionalLight( 'sun' ) )
sun.node().setScene( render )
render.setLight( sun )
sun.reparentTo( self.car.chassisModel )
sun.setH( -60 )
sun.setP( -60 )
sun.setPos( 0, 0, 10 )
sun.node().getLens().setFov( 70 )
sun.node().getLens().setNearFar( 1, 20 )
sun.node().getLens().setFilmSize( 16, 16 )
sun.node().setColor( Vec4( 1, 0.96, 1, 1 ))
sun.node().setShadowCaster( True )
self.sun = sun
def simulate(self, task):
""" Simulation loop, called every frame """
dt = globalClock.getDt()
self.physxScene.simulate(dt)
self.physxScene.fetchResults()
self.car.simulate(dt)
self.cameraControl.simulate(dt)
self.sun.setH( render, -60 )
self.sun.setP( render, -60 )
self.speedometer.updateSpeedometer( self.car.speed )
self.inputHandler.simulate( dt )
return task.cont
base.cam.setPos(10, -25, 5)
base.cam.lookAt(0, 0, 0)
base.cam.node().getLens().setNear( 0.1 )
base.cam.node().getLens().setFov( 60 )
base.enableParticles()
render.setAntialias(AntialiasAttrib.MMultisample,1)
world = World()
run()