项目作者: zacharycarter

项目描述 :
2D | 3D Game development library
高级语言: Nim
项目地址: git://github.com/zacharycarter/zengine.git
创建时间: 2017-07-08T15:06:59Z
项目社区:https://github.com/zacharycarter/zengine

开源协议:

下载


zengine

2D | 3D Game development library

NOTE - Please run examples from root directory for now

Progress -

3D Skeletal Animation
Lit Model
Model Loading
FPS Camera
2D & 3D Primitive Rendering

Dependencies:
Assimp

  1. import zengine, sdl2, opengl
  2. type
  3. LightKind = enum
  4. Point, Directional, Spot
  5. Light = ref object
  6. id: int
  7. enabled: bool
  8. kind: LightKind
  9. position: Vector3
  10. target: Vector3
  11. radius: float
  12. diffuse: ZColor
  13. intensity: float
  14. coneAngle: float
  15. const
  16. WIDTH = 960
  17. HEIGHT = 540
  18. MAX_LIGHTS = 8
  19. var lights: array[MAX_LIGHTS, Light]
  20. var lightsCount = 0
  21. var lightsLocs: array[MAX_LIGHTS, array[8, int]]
  22. proc createLight(kind: LightKind, position: Vector3, diffuse: ZColor): Light =
  23. result = nil
  24. if lightsCount < MAX_LIGHTS:
  25. result = Light(
  26. id: lightsCount,
  27. kind: kind,
  28. enabled: true,
  29. position: position,
  30. target: vectorZero(),
  31. intensity: 1.0,
  32. diffuse: diffuse
  33. )
  34. lights[lightsCount] = result
  35. inc(lightsCount)
  36. else:
  37. result = lights[lightsCount]
  38. proc setShaderLightsValues(shader: Shader) =
  39. var tempInt: array[8, GLint]
  40. var tempFloat: array[8, GLfloat]
  41. for i in 0..<MAX_LIGHTS:
  42. if i < lightsCount:
  43. tempInt[0] = lights[i].enabled.GLint
  44. setShaderValuei(shader, lightsLocs[i][0].GLint, tempInt, 1)
  45. tempInt[0] = lights[i].kind.GLint
  46. setShaderValuei(shader, lightsLocs[i][1].GLint, tempInt, 1)
  47. tempFloat[0] = lights[i].diffuse.r.float/255.0
  48. tempFloat[1] = lights[i].diffuse.g.float/255.0
  49. tempFloat[2] = lights[i].diffuse.b.float/255.0
  50. tempFloat[3] = lights[i].diffuse.a.float/255.0
  51. setShaderValue(shader, lightsLocs[i][5].GLint, tempFloat, 4)
  52. tempFloat[0] = lights[i].intensity
  53. setShaderValue(shader, lightsLocs[i][6].GLint, tempFloat, 1)
  54. case lights[i].kind:
  55. of LightKind.Point:
  56. tempFloat[0] = lights[i].position.x
  57. tempFloat[1] = lights[i].position.y
  58. tempFloat[2] = lights[i].position.z
  59. setShaderValue(shader, lightsLocs[i][2].GLint, tempFloat, 3)
  60. tempFloat[0] = lights[i].radius
  61. setShaderValue(shader, lightsLocs[i][4].GLint, tempFloat, 1)
  62. of LightKind.Directional:
  63. var direction = vectorSubtract(lights[i].target, lights[i].position)
  64. vectorNormalize(direction)
  65. tempFloat[0] = direction.x
  66. tempFloat[1] = direction.y
  67. tempFloat[2] = direction.z
  68. setShaderValue(shader, lightsLocs[i][3].GLint, tempFloat, 3)
  69. of LightKind.Spot:
  70. tempFloat[0] = lights[i].position.x
  71. tempFloat[1] = lights[i].position.y
  72. tempFloat[2] = lights[i].position.z
  73. setShaderValue(shader, lightsLocs[i][2].GLint, tempFloat, 3)
  74. var direction = vectorSubtract(lights[i].target, lights[i].position)
  75. vectorNormalize(direction)
  76. tempFloat[0] = direction.x
  77. tempFloat[1] = direction.y
  78. tempFloat[2] = direction.z
  79. setShaderValue(shader, lightsLocs[i][3].GLint, tempFloat, 3)
  80. tempFloat[0] = lights[i].coneAngle
  81. setShaderValue(shader, lightsLocs[i][7].GLint, tempFloat, 1)
  82. else:
  83. tempInt[0] = 0
  84. setShaderValuei(shader, lightsLocs[i][0].GLint, tempInt, 1)
  85. proc getShaderLightsLocation(shader: Shader) =
  86. var locName = "lights[x]."
  87. var locNameUpdated = newStringOfCap(64)
  88. for i in 0..<MAX_LIGHTS:
  89. locName[7] = ('0'.int + i).char
  90. locNameUpdated = locName
  91. locNameUpdated &= "enabled"
  92. lightsLocs[i][0] = getShaderLocation(shader, locNameUpdated)
  93. locNameUpdated[0] = ' '
  94. locNameUpdated = locName
  95. locNameUpdated &= "type"
  96. lightsLocs[i][1] = getShaderLocation(shader, locNameUpdated)
  97. locNameUpdated[0] = ' '
  98. locNameUpdated = locName
  99. locNameUpdated &= "position"
  100. lightsLocs[i][2] = getShaderLocation(shader, locNameUpdated)
  101. locNameUpdated[0] = ' '
  102. locNameUpdated = locName
  103. locNameUpdated &= "direction"
  104. lightsLocs[i][3] = getShaderLocation(shader, locNameUpdated)
  105. locNameUpdated[0] = ' '
  106. locNameUpdated = locName
  107. locNameUpdated &= "radius"
  108. lightsLocs[i][4] = getShaderLocation(shader, locNameUpdated)
  109. locNameUpdated[0] = ' '
  110. locNameUpdated = locName
  111. locNameUpdated &= "diffuse"
  112. lightsLocs[i][5] = getShaderLocation(shader, locNameUpdated)
  113. locNameUpdated[0] = ' '
  114. locNameUpdated = locName
  115. locNameUpdated &= "intensity"
  116. lightsLocs[i][6] = getShaderLocation(shader, locNameUpdated)
  117. locNameUpdated[0] = ' '
  118. locNameUpdated = locName
  119. locNameUpdated &= "coneAngle"
  120. lightsLocs[i][7] = getShaderLocation(shader, locNameUpdated)
  121. zengine.init(WIDTH, HEIGHT, "zengine example: 00_Initialization")
  122. var
  123. evt = sdl2.defaultEvent
  124. running = true
  125. camera = Camera(
  126. position: Vector3(x: 4, y: 2, z: 4),
  127. target: Vector3(x: 0, y: 1.8, z: 0),
  128. up: Vector3(x: 0, y: 1, z: 0),
  129. fovY: 60
  130. )
  131. mouseWheelMovement = 0
  132. mouseXRel = 0
  133. mouseYRel = 0
  134. camera.setMode(CameraMode.Free)
  135. #camera.setMode(CameraMode.FirstPerson)
  136. let shader = loadShader("examples/data/shaders/glsl330/forward.vs", "examples/data/shaders/glsl330/forward.fs")
  137. var model = loadModel("examples/data/models/mannequin/walking.dae", shader)
  138. getShaderLightsLocation(shader)
  139. var spotLight = createLight(LightKind.Spot, Vector3(x:0.0, y:5.0, z:0.0), ZColor(r:255, g:255, b:255, a:255))
  140. spotLight.target = Vector3(x: 0.0, y: 0.0, z: 0.0)
  141. spotLight.intensity = 2.0
  142. spotlight.diffuse = ZColor(r: 0, g: 0, b: 255, a: 255)
  143. spotLight.coneAngle = 60.0
  144. var dirLight = createLight(LightKind.Directional, Vector3(x:0.0, y: -3.0, z: -3.0), ZColor(r:0, g:0, b:255, a:255))
  145. dirLight.target = Vector3(x: 1.0, y: -2.0, z: -2.0)
  146. dirLight.intensity = 2.0
  147. dirLight.diffuse = ZColor(r: 100, g:255, b:100, a:255)
  148. var pointLight = createLight(LightKind.Point, Vector3(x:0.0, y: 4.0, z: 5.0), ZColor(r:255, g:255, b:255, a:255))
  149. pointLight.intensity = 2.0
  150. pointLight.diffuse = ZColor(r: 100, g:100, b:255, a:255)
  151. pointLight.radius = 3.0
  152. setShaderLightsValues(shader)
  153. while running:
  154. mouseWheelMovement = 0
  155. mouseXRel = 0
  156. mouseYRel = 0
  157. while sdl2.pollEvent(evt):
  158. case evt.kind
  159. of QuitEvent:
  160. running = false
  161. of MouseMotion:
  162. var mouseMoveEvent = cast[MouseMotionEventPtr](addr evt)
  163. mouseXRel = mouseMoveEvent.xrel
  164. mouseYRel = mouseMoveEvent.yrel
  165. of MouseWheel:
  166. var mouseWheelEvent = cast[MouseWheelEventPtr](addr evt)
  167. mouseWheelMovement = mouseWheelEvent.y
  168. else:
  169. discard
  170. pollInput()
  171. camera.update(mouseWheelMovement, mouseXRel, mouseYRel)
  172. beginDrawing()
  173. clearBackground(ZENGRAY)
  174. begin3dMode(camera)
  175. drawPlane(Vector3(x: 0.0, y: 0.0, z: 0.0), Vector2(x: 32.0, y: 32.0), GREEN)
  176. drawCube(Vector3(x: -16.0, y: 2.5, z: 0.0), 1.0, 5.0, 32.0, BLUE)
  177. drawCube(Vector3(x: 16.0, y: 2.5, z: 0.0), 1.0, 5.0, 32.0, RED)
  178. drawCube(Vector3(x: 0.0, y: 2.5, z: 16.0), 32.0, 5.0, 1.0, WHITE)
  179. drawModel(model, WHITE)
  180. end3dMode()
  181. drawText("Hello zengine!", 5, 5, 30, ZColor(r: 255, g: 255, b: 255, a: 255))
  182. endDrawing()
  183. zengine.shutdown()