Guest User

Untitled

a guest
Apr 30th, 2021
80
130 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include "RAdopt.h"
  2. #include "RUtils.h"
  3. #include "RWnd.h"
  4.  
  5. #include <filesystem>
  6.  
  7. namespace TC {
  8.     struct CityVertex {
  9.         glm::vec3 crd;
  10.         glm::vec3 norm;
  11.         glm::vec2 uv;
  12.         bool operator==(const CityVertex& v) const {
  13.             return (v.crd == crd) && (v.norm == norm) && (v.uv == uv);
  14.         }
  15.         static const RA::Layout* Layout() {
  16.             return RA::LB()
  17.                 ->Add("crd", RA::LayoutType::Float, 3)
  18.                 ->Add("norm", RA::LayoutType::Float, 3)
  19.                 ->Add("uv", RA::LayoutType::Float, 2)
  20.                 ->Finish();
  21.         }
  22.     };
  23.  
  24.     void LoadModel(std::wstring filename, std::vector<CityVertex>& vert, std::vector<uint32_t>& ind) {        
  25.         FILE* f = NULL;
  26.         _wfopen_s(&f, filename.c_str(), L"rb");
  27.         if (f) {
  28.             uint32_t n;
  29.             fread(&n, sizeof(n), 1, f);
  30.             vert.resize(n);
  31.             if (n) fread(vert.data(), sizeof(CityVertex), n, f);
  32.             fread(&n, sizeof(n), 1, f);
  33.             ind.resize(n);
  34.             if (n) fread(ind.data(), sizeof(uint32_t), n, f);
  35.             fclose(f);
  36.         }
  37.     }
  38.  
  39.     class MyWnd : public RA::RenderWindow {
  40.     private:
  41.         RA::FrameBufferPtr m_fbo;
  42.         std::unique_ptr<RA::Camera> m_cam;
  43.         RA::ProgramPtr m_default_render;
  44.         RA::ProgramPtr m_resolve;
  45.  
  46.         RA::VertexBufferPtr m_verts;
  47.         RA::IndexBufferPtr m_inds;
  48.         glm::AABB m_world_box;
  49.         glm::vec3 m_view_dir;
  50.         float m_view_dist;
  51.  
  52.         uint32_t m_fps;
  53.         uint64_t m_fps_sec;
  54.         RA::QPC m_timer;
  55.  
  56.         bool m_render_uv;
  57.     private:
  58.         void LoadMesh() {
  59.             std::vector<CityVertex> verts;
  60.             std::vector<uint32_t> inds;
  61.  
  62.             LoadModel(L"models\\city", verts, inds);
  63.             m_verts = m_device->Create_VertexBuffer();            
  64.             m_verts->SetState(CityVertex::Layout(), int(verts.size()), verts.data());
  65.             m_inds = m_device->Create_IndexBuffer();
  66.             m_inds->SetState(int(inds.size()), inds.data());
  67.             m_world_box.SetEmpty();
  68.             for (const auto& v : verts) {
  69.                 m_world_box += v.crd;
  70.             }
  71.         }
  72.         void UpdateFPSCounter() {
  73.             m_fps++;
  74.             uint64_t t = m_timer.Time();
  75.             uint64_t s = t / 1000;
  76.             if (m_fps_sec != s) {
  77.                 std::wstring str = std::wstring(L"FPS: ") + std::to_wstring(m_fps);
  78.                 SetWindowTextW(Handle(), str.c_str());
  79.                 m_fps = 0;
  80.                 m_fps_sec = s;
  81.             }
  82.         }
  83.     public:
  84.         void MouseDown(int btn, const glm::ivec2& crd, const RA::ShiftState& ss) override {
  85.             m_render_uv = !m_render_uv;
  86.         }
  87.  
  88.         void RenderScene() override {
  89.             float fi = m_timer.Time() / 1000.0f * 0.25f;
  90.             glm::vec3 view_dir = glm::vec3(glm::sin(fi), 0.5f, glm::cos(fi));
  91.             view_dir = glm::normalize(view_dir);
  92.             m_cam->SetCamera(m_world_box.Center() + view_dir * m_view_dist, m_world_box.Center(), { 0,1,0 });
  93.             m_cam->SetAspect(Handle());
  94.  
  95.             RECT rct;
  96.             GetClientRect(Handle(), &rct);
  97.             m_fbo->SetSize(glm::ivec2(rct.right, rct.bottom)*2);
  98.  
  99.             m_device->SetFrameBuffer(m_fbo);
  100.             m_fbo->Clear(0, { 0,0,0,0 });
  101.             m_fbo->ClearDS(0);
  102.  
  103.             m_device->States()->SetDepthEnable(true);
  104.             m_device->States()->SetDepthFunc(RA::Compare::greater);
  105.             m_device->States()->SetCull(RA::CullMode::none);
  106.  
  107.             m_default_render->SetResource("camera", m_cam->GetUBO());
  108.             m_default_render->SetValue("render_uv", m_render_uv ? 1.0f : 0.0f);
  109.             m_default_render->SetInputBuffers(m_verts, m_inds, nullptr);
  110.             m_default_render->DrawIndexed(RA::PrimTopology::Triangle);
  111.  
  112.             m_device->SetFrameBuffer(nullptr);
  113.             m_device->States()->SetDepthEnable(false);
  114.             m_resolve->SetResource("Color", m_fbo->GetSlot(0));
  115.             m_resolve->SetResource("ColorSampler", RA::cSampler_Linear);
  116.             m_resolve->Draw(RA::PrimTopology::Triangle, 0, 3);
  117.  
  118.             UpdateFPSCounter();
  119.         };
  120.         MyWnd(std::wstring wndname) : RA::RenderWindow(wndname, true) {
  121.             m_fbo = RA::FBB(m_device)->Color(RA::TextureFmt::RGBA8)->Depth(RA::TextureFmt::D32f)->Finish();
  122.  
  123.             m_cam = std::make_unique<RA::Camera>(m_device);            
  124.  
  125.             m_default_render = m_device->Create_Program();
  126.             m_default_render->Load("default");
  127.             m_resolve = m_device->Create_Program();
  128.             m_resolve->Load("resolve");
  129.  
  130.             LoadMesh();
  131.             glm::vec3 ws = m_world_box.Size();
  132.             float ms = glm::max(glm::max(ws.x, ws.y), ws.z);
  133.             m_cam->SetProjection(glm::pi<float>() * 0.25f, 1, { ms * 0.0001f , ms * 5.0f });
  134.             m_cam->SetCamera(m_world_box.Center() + glm::vec3(2, 1, 1), m_world_box.Center(), glm::vec3(0, 1, 0));
  135.             m_cam->FitView(m_world_box);
  136.             m_view_dist = glm::length(m_world_box.Center() - m_cam->Eye()) * 0.75f;
  137.  
  138.             m_fps = 0;
  139.             m_fps_sec = 0;
  140.         };
  141.     };
  142. }
  143.  
  144. int main() {
  145.     std::filesystem::current_path(RA::ExePath());
  146.     TC::MyWnd wnd(L"FOO");
  147.     RA::MessageLoop([&]() { wnd.Invalidate(); });
  148.     return 0;
  149. }
RAW Paste Data