|
|
- #include "test_scaffold.h"
- #include "gp/containers/array.hpp"
- #include "gp/math.hpp"
- #include "gp/math/rendering/renderer.hpp"
- #include "gp/math/rendering/bmp_viewport.hpp"
-
- #include <chrono>
- #include <cmath>
- #include <fstream>
- #include <iomanip>
- #include <iostream>
-
-
- struct sin_test : public test_scaffold {
- sin_test() {
- name = __FILE__ ":1";
- }
-
-
- virtual int run() {
- int res = 0;
- for(float i = 0; i < 100; i += 0.1) {
- float v = gp::math::sin(i);
- float ref = sin(i);
- res += 0.3 < gp::math::abs<float>(ref - v)*100.0/(gp::math::abs(ref+0.00000001));
- }
- for(float i = 0; i < 100; i += 0.1) {
- float v = gp::math::cos(i);
- float ref = cos(i);
- res += 0.3 < gp::math::abs<float>(ref - v)*100.0/(gp::math::abs(ref+0.00000001));
- }
- for(float i = 0; i < 100; i += 0.1) {
- float v = gp::math::cos(i)*gp::math::cos(i) + gp::math::sin(i)*gp::math::sin(i);
- res += 1 + gp_config::rendering::epsilon < v;
- res += 1 - gp_config::rendering::epsilon > v;
- }
-
- return res;
- }
- };
-
- append_test dummy_mldffh6f(new sin_test{});
-
-
- struct render_test : public test_scaffold {
- render_test() {
- name = __FILE__ ":2";
- }
-
-
- virtual int run() {
- using namespace gp::math::rendering;
-
- int res = 0;
- gp::array<char, 2048> allocation_buffer;
- renderer a{allocation_buffer.as_buffer()};
- a._resolution = vec2{128,64};
- a.passes = 5;
- a.projection_end = 3;
-
- a.sky_box = material_t([](vec3) -> color_t {
- color_t ret;
- ret.r() = 0.5;
- ret.g() = 0.5;
- ret.b() = 1;
- ret.a() = 1;
- return ret;
- }, a.get_allocator());
- auto red = a.materials.push(
- material_t([&](vec3 p) -> color_t {
- color_t ret;
- ret.r() = 1;
- ret.g() = 0;
- ret.b() = 0;
- ret.a() = 1;
- return ret;
- }, a.get_allocator())
- );
- auto green = a.materials.push(
- material_t([&](vec3 p) -> color_t {
- color_t ret;
- ret.r() = 0;
- ret.g() = 1;
- ret.b() = 0;
- ret.a() = 1;
- return ret;
- }, a.get_allocator())
- );
-
- auto sphere = a.scene_elements.push(
- sdf_t([&](vec3 pos) -> render_point {
- auto l_sdf = gp::math::difference_sdf<float>(
- gp::math::sphere_sdf<float>({0.0,0.0,0.0}, 1.0),
- gp::math::sphere_sdf<float>({-0.75,0.0,0.0}, 1.0)
- );
- render_point ret;
- ret.distance = l_sdf(pos);
- ret.material = red;
- return ret;
- }, a.get_allocator())
- );
-
- auto sphere2 = a.scene_elements.push(
- sdf_t([&](vec3 pos) -> render_point {
- auto l_sdf_b = gp::math::sphere_sdf<float>({-0.75,0.0,0.0}, 0.05);
- render_point ret;
- ret.distance = l_sdf_b(pos);
- ret.material = green;
- return ret;
- }, a.get_allocator())
- );
-
- a._camera.position = vec3{0, 0, -5};
- a._camera.normal = vec3{0, 0, 1};
-
- using pic_color = gp::math::vec4_g<uint8_t>;
- using viewport = gp::bmp_viewport<true, pic_color>;
-
- viewport vp{
- {128,64},
- viewport::src_t{[&](gp::math::vec2_g<int32_t> p) -> pic_color {
- auto orig = a.render({(float)p.x,(float)p.y});
- pic_color ret{};
- ret.x = (uint8_t)(orig.x*255);
- ret.y = (uint8_t)(orig.y*255);
- ret.z = (uint8_t)(orig.z*255);
- ret.w = (uint8_t)(orig.w*255);
- return ret;
- }, a.get_allocator()}
- };
-
- auto buff = std::make_unique<gp::array<char, 300000>>();
-
- auto begin = std::chrono::steady_clock::now();
-
- auto r_end = vp.write(buff->as_buffer());
-
- auto end = std::chrono::steady_clock::now();
-
- std::cout << "render time: " << std::chrono::duration_cast<std::chrono::microseconds>(end - begin).count() << std::endl;
-
-
-
- auto myfile = std::fstream("render.bmp", std::ios::out | std::ios::binary);
-
- myfile.write(buff->begin().data, r_end - buff->begin());
-
- //gp_config::assertion(a.render(vec2{64,32}).x == color_t{1.0,0,0,1.0}.x, "red sphere not perceived");
- //gp_config::assertion(a.render(vec2{0,0}).x == color_t{0.0,0,1.0,1.0}.x, "blue sky not perceived");
-
- return res;
- }
- };
-
- append_test dummy_pzj6f(new render_test{});
-
- struct function_test : public test_scaffold {
- function_test() {
- name = __FILE__ ":3";
- }
-
-
- virtual int run() {
- using namespace gp::math::rendering;
- int res = 0;
-
- gp::array<char, 2048> allocation_buffer;
- gp::buddy<> allocator{allocation_buffer.begin().data, allocation_buffer.size()};
-
- gp::function<float(vec3)> l_sdf_b{gp::math::sphere_sdf<float>({0.0,0.0,0.0}, 1.0), allocator};
- {
- gp::function<float(vec3)> sdf{l_sdf_b};
-
- gp_config::assertion(l_sdf_b(vec3(0,0,0)) == -1 && sdf(vec3(0,0,0)) == -1, "Bad sdf");
- }
- return res;
- }
- };
-
- append_test dummy_ml8576f(new function_test{});
|