| 2898 | } |
| 2899 | |
| 2900 | void Engine::DrawScene(DrawingViewport drawing_viewport, Engine::PostEffectsType post_effects_type, SceneGraph::SceneDrawType scene_draw_type) { |
| 2901 | PROFILER_GPU_ZONE(g_profiler_ctx, "Draw scene") |
| 2902 | Graphics* graphics = Graphics::Instance(); |
| 2903 | PushGPUProfileRange(__FUNCTION__); |
| 2904 | GLenum buffers[] = {GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT}; |
| 2905 | |
| 2906 | { |
| 2907 | PROFILER_GPU_ZONE(g_profiler_ctx, "Setup Post Effects") |
| 2908 | graphics->PushFramebuffer(); |
| 2909 | if (graphics->multisample_framebuffer_exists) { |
| 2910 | graphics->bindFramebuffer(graphics->multisample_framebuffer); |
| 2911 | } else { |
| 2912 | graphics->bindFramebuffer(graphics->framebuffer); |
| 2913 | } |
| 2914 | graphics->PushViewport(); |
| 2915 | } |
| 2916 | |
| 2917 | // Prepare for drawing |
| 2918 | { |
| 2919 | PROFILER_GPU_ZONE(g_profiler_ctx, "Clear screen"); |
| 2920 | glDrawBuffers(2, buffers); |
| 2921 | glClearColor(0.0f, 0.0f, 0.0f, 0); |
| 2922 | graphics->drawing_shadow = false; |
| 2923 | graphics->Clear(true); |
| 2924 | glDrawBuffers(1, buffers); |
| 2925 | } |
| 2926 | |
| 2927 | { |
| 2928 | PROFILER_GPU_ZONE(g_profiler_ctx, "Apply viewpoint"); |
| 2929 | ActiveCameras::Get()->applyViewpoint(); |
| 2930 | |
| 2931 | std::vector<Camera>& virt_cam = ActiveCameras::Instance()->GetVirtualCameras(); |
| 2932 | |
| 2933 | for (auto& cam : virt_cam) { |
| 2934 | cam.applyViewpoint(); |
| 2935 | } |
| 2936 | } |
| 2937 | |
| 2938 | { // Perform per-frame, per-camera functions, like character LOD and spawning grass |
| 2939 | PROFILER_GPU_ZONE(g_profiler_ctx, "Pre-draw camera"); |
| 2940 | ActiveCameras::Get()->tint = vec3(1.0); |
| 2941 | ActiveCameras::Get()->vignette_tint = vec3(1.0); |
| 2942 | float predraw_time = game_timer.GetRenderTime(); |
| 2943 | for (auto obj : scenegraph_->objects_) { |
| 2944 | if (!obj->parent) { |
| 2945 | obj->PreDrawCamera(predraw_time); |
| 2946 | } |
| 2947 | } |
| 2948 | } |
| 2949 | |
| 2950 | if (!g_no_decals) { |
| 2951 | scenegraph_->PrepareLightsAndDecals(active_screen_start, active_screen_end, vec2(graphics->render_dims[0], graphics->render_dims[1])); |
| 2952 | } |
| 2953 | |
| 2954 | // Draw everything |
| 2955 | { |
| 2956 | PROFILER_GPU_ZONE(g_profiler_ctx, "Draw scenegraph"); |
| 2957 | if (graphics->depth_prepass) { |
no test coverage detected