Size: 2106 bytes.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
// cs/renderer/scene_renderer.hh
#ifndef CS_RENDERER_SCENE_RENDERER_HH
#define CS_RENDERER_SCENE_RENDERER_HH

#include <stdio.h>

#include <tuple>
#include <vector>

#include "cs/renderer/film.hh"
#include "cs/renderer/geo/dist.hh"
#include "cs/renderer/geo/point3.h"
#include "cs/renderer/geo/ray3.h"
#include "cs/renderer/geo/vector3.h"
#include "cs/renderer/linalg/transform.hh"
#include "cs/renderer/numbers/clamp.hh"
#include "cs/renderer/numbers/map_value.hh"
#include "cs/renderer/scene.hh"

using p3 = ::cs::renderer::geo::Point3;
using v3 = ::cs::renderer::geo::Vector3;
using r3 = ::cs::renderer::geo::Ray3;
using ::cs::numbers::clamp;
using ::cs::numbers::map_value;
using ::cs::renderer::Film;
using ::cs::renderer::geo::dist;
using ::cs::renderer::linalg::Transform;

namespace cs::renderer {

struct Camera {
  Transform w2c_;
  unsigned int pixels_per_unit_;
  float focal_length_;
  Film film_;

  Camera(Transform w2c, unsigned int pixels_per_unit,
         float focal_length, Film film)
      : w2c_(w2c),
        pixels_per_unit_(pixels_per_unit),
        focal_length_(focal_length),
        film_(film) {}

  friend std::ostream& operator<<(std::ostream& os,
                                  const Camera& camera) {
    return os << "Camera(pixels_per_unit="
              << camera.pixels_per_unit_
              << ", focal_length=" << camera.focal_length_
              << ", film dimensions: <"
              << std::get<0>(camera.film_.dimensions())
              << ", "
              << std::get<1>(camera.film_.dimensions())
              << ">)";
  }
};

class SceneRenderer {
 public:
  Camera camera_;
  Scene scene_;

  SceneRenderer(Camera camera, Scene scene)
      : camera_(camera), scene_(scene) {}

  Film render();

  struct RenderContext {
    std::size_t width;
    std::size_t height;
    float x_units;
    float y_units;
    Transform c2w;
    p3 focal_point_in_world;
  };

  void RenderPixel(std::size_t film_x, std::size_t film_y,
                   const RenderContext& ctx) const;
};
}  // namespace cs::renderer

#endif  // CS_RENDERER_SCENE_RENDERER_HH
v0 (commit) © 2025 @p13i.io | Load balancer proxied to: cs-code-viewer-3:8080 in 4ms.