@@ -248,3 +248,120 @@ AssetRenderer::AssetRenderer()
248248 // ssgi = std::make_shared<SSGI>(*gbuffer);
249249
250250}
251+
252+
253+ // ===========================================================================
254+ // SceneTextureRenderer — copy of AssetRenderer's scene-to-texture core.
255+ // (AssetRenderer left intact; it will later be rewritten to use this.)
256+ // ===========================================================================
257+
258+ SceneTextureRenderer::SceneTextureRenderer ()
259+ {
260+ std::lock_guard<std::mutex> g (lock);
261+
262+ scene_renderer = std::make_shared<main_renderer>();
263+ scene_renderer->register_renderer (meshes_renderer = std::make_shared<mesh_renderer>());
264+ cam.position = vec3 (0 , 5 , -30 );
265+
266+ mesh_plane.reset (new MeshAssetInstance (EngineAssets::plane.get_asset ()));
267+ material_tester.reset (new MeshAssetInstance (EngineAssets::material_tester.get_asset ()));
268+
269+ scene = std::make_shared<Scene>();
270+
271+ rendering = std::make_shared<SceneRenderWorkflow>();
272+ rendering->scene_renderer = scene_renderer;
273+ }
274+
275+ void SceneTextureRenderer::draw (Scene::ptr scene, HAL ::Texture::ptr result)
276+ {
277+ graph.start_new_frame ();
278+
279+ scene->update_transforms ();
280+
281+ auto mn = scene->get_min ();
282+ auto mx = scene->get_max ();
283+ scene->add_child (mesh_plane);
284+ scene->update (*graph.builder .current_frame );
285+
286+ float x = mx.x - mn.x ;
287+ float y = mx.y - mn.y ;
288+
289+ mesh_plane->local_transform .scaling (std::max (x, y));
290+
291+ mesh_plane->local_transform .a42 = mn.y ;
292+ scene->update_transforms ();
293+
294+ auto & time = graph.get_context <TimeInfo>();
295+ auto & skyinfo = graph.get_context <SkyInfo>();
296+ auto & caminfo = graph.get_context <CameraInfo>();
297+ auto & sceneinfo = graph.get_context <SceneInfo>();
298+ auto & vp = graph.get_context <ViewportInfo>();
299+
300+ auto rsize = result->get_size ().xy ;
301+ float aspect = float (rsize.x ) / float (rsize.y );
302+
303+ float base_dist = (mx - mn).length ();
304+ if (base_dist < 0 .001f ) base_dist = 1 .0f ;
305+
306+ // Orbit direction from yaw/pitch; distance scaled by zoom.
307+ vec3 dir;
308+ dir.x = Math::cos (m_orbit.y ) * Math::sin (m_orbit.x );
309+ dir.y = Math::sin (m_orbit.y );
310+ dir.z = Math::cos (m_orbit.y ) * Math::cos (m_orbit.x );
311+
312+ cam.target = (mn + mx) / 2 ;
313+ cam.position = cam.target + dir * (base_dist * m_zoom);
314+ cam.set_projection_params (Math::pi / 4 , aspect, 1 , 100 + (mn - mx).length ());
315+ cam.update ();
316+
317+ skyinfo.sunDir = float3 (1 , 1 , 1 ).normalize ();
318+
319+ graph.builder .debug = true ;
320+ vp.frame_size = rsize / 2 ;
321+ vp.upscale_size = rsize;
322+
323+ sceneinfo.scene = scene;
324+ sceneinfo.renderer = scene_renderer;
325+ caminfo.cam = &cam;
326+
327+ rendering->render (graph);
328+ graph.builder .pass_texture (FrameGraph::ResourceID::swapchain, result->resource , {}, ResourceFlags::Required);
329+
330+ graph.setup ();
331+ graph.compile (frame++);
332+ graph.render ();
333+ graph.commit_command_lists ();
334+ graph.reset ();
335+ mesh_plane->remove_from_parent ();
336+ }
337+
338+ void SceneTextureRenderer::draw (scene_object::ptr obj, HAL ::Texture::ptr result)
339+ {
340+ std::lock_guard<std::mutex> g (lock);
341+
342+ scene->add_child (obj);
343+ draw (scene, result);
344+ obj->remove_from_parent ();
345+ }
346+
347+ void SceneTextureRenderer::draw (MaterialAsset::ptr mat, HAL ::Texture::ptr result)
348+ {
349+ std::lock_guard<std::mutex> g (lock);
350+
351+ scene->add_child (material_tester);
352+ material_tester->override_material (1 , mat);
353+
354+ draw (scene, result);
355+ material_tester->remove_from_parent ();
356+ }
357+
358+ void SceneTextureRenderer::orbit (vec2 delta)
359+ {
360+ m_orbit += delta;
361+ m_orbit.y = Math::clamp (m_orbit.y , -Math::m_pi_2 + Math::eps2, Math::m_pi_2 - Math::eps2);
362+ }
363+
364+ void SceneTextureRenderer::zoom (float amount)
365+ {
366+ m_zoom = Math::clamp (m_zoom * (1 .0f - amount * 0 .1f ), 0 .05f , 10 .0f );
367+ }
0 commit comments