Merge: gamnit: new services and a lot of bug fixes and performance improvements
[nit.git] / lib / gamnit / depth / depth.nit
index c2328c6..a7864f9 100644 (file)
 # Framework for 3D games in Nit
 module depth
 
+import flat
 intrude import more_materials
 import more_models
+import model_dimensions
+import particles
+import selection
+import shadow
 
 redef class App
 
-       redef fun on_create
+       redef fun create_scene
        do
-               super
-
                # Move the camera back a bit
                world_camera.reset_height(10.0)
                world_camera.near = 0.1
 
+               super
+       end
+
+       redef fun create_gamnit
+       do
+               super
+
+               # Cull the invisible triangles in the back of the geometries
+               glCullFace gl_BACK
+
                # Prepare programs
-               var program = versatile_program
-               program.compile_and_link
-               var gamnit_error = program.error
-               assert gamnit_error == null else print_error gamnit_error
-
-               program = normals_program
-               normals_program.compile_and_link
-               gamnit_error = program.error
-               assert gamnit_error == null else print_error gamnit_error
+               var programs = [blinn_phong_program, normals_program, explosion_program, smoke_program, static_program, selection_program: GamnitProgram]
+               for program in programs do
+                       program.compile_and_link
+                       var gamnit_error = program.error
+                       assert gamnit_error == null else print_error gamnit_error
+               end
        end
 
        redef fun frame_core_draw(display) do frame_core_depth display
@@ -45,19 +55,47 @@ redef class App
        # Draw all elements of `actors` and then call `frame_core_flat`
        protected fun frame_core_depth(display: GamnitDisplay)
        do
-               # Update cameras on both our programs
-               versatile_program.use
-               versatile_program.mvp.uniform world_camera.mvp_matrix
+               frame_core_depth_clock.lapse
+
+               # Compute shadows
+               if light isa LightCastingShadows then
+                       frame_core_shadow_prep display
+                       perfs["gamnit depth shadows"].add frame_core_depth_clock.lapse
+               end
 
-               normals_program.use
-               normals_program.mvp.uniform app.world_camera.mvp_matrix
+               glViewport(0, 0, display.width, display.height)
+               frame_core_dynamic_resolution_before display
+               perfs["gamnit depth dynres"].add frame_core_depth_clock.lapse
 
                for actor in actors do
                        for leaf in actor.model.leaves do
-                               leaf.material.draw(actor, leaf)
+                               leaf.material.draw(actor, leaf, app.world_camera)
+                               assert glGetError == gl_NO_ERROR else print_error "Gamnit error on material {leaf.material.class_name}"
                        end
                end
+               perfs["gamnit depth actors"].add frame_core_depth_clock.lapse
 
-               frame_core_flat display
+               frame_core_world_sprites display
+               perfs["gamnit depth sprites"].add frame_core_depth_clock.lapse
+
+               # Toggle writing to the depth buffer for particles effects
+               glDepthMask false
+               for system in particle_systems do
+                       system.draw
+                       assert glGetError == gl_NO_ERROR else print_error "OpenGL error in {system}"
+               end
+               glDepthMask true
+               perfs["gamnit depth particles"].add frame_core_depth_clock.lapse
+
+               # Stop using the dynamic resolution before drawing UI sprites
+               frame_core_dynamic_resolution_after display
+
+               frame_core_ui_sprites display
+               perfs["gamnit depth ui_sprites"].add frame_core_depth_clock.lapse
+
+               # Debug, show the light point of view
+               #frame_core_shadow_debug display
        end
+
+       private var frame_core_depth_clock = new Clock
 end