#include "test_scaffold.h" #include "gp/array.hpp" #include "gp/math.hpp" #include "gp/rendering/renderer.hpp" #include "gp/rendering/bmp_viewport.hpp" #include #include #include #include #include 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::sin(i); float ref = sin(i); res += 0.3 < gp::abs(ref - v)*100.0/(gp::abs(ref+0.00000001)); } for(float i = 0; i < 100; i += 0.1) { float v = gp::cos(i); float ref = cos(i); res += 0.3 < gp::abs(ref - v)*100.0/(gp::abs(ref+0.00000001)); } return res; } }; append_test dummy_mldffh6f(new sin_test{}); struct render_test : public test_scaffold { render_test() { name = __FILE__ ":2"; } virtual int run() { int res = 0; renderer a; a._resolution = vec2{1000,500}; a.sky_box = [](vec3) -> color_t {return {0,0,0,0};}; auto v = a.materials.push( [&](vec3 p) -> color_t { //return color_t{0,0,1,1}; const float EPSILON = 0.001; /*vec3( a.sdf(vec3(p.x + EPSILON, p.y, p.z)).distance - a.sdf(vec3(p.x - EPSILON, p.y, p.z)).distance, a.sdf(vec3(p.x, p.y + EPSILON, p.z)).distance - a.sdf(vec3(p.x, p.y - EPSILON, p.z)).distance, a.sdf(vec3(p.x, p.y, p.z + EPSILON)).distance - a.sdf(vec3(p.x, p.y, p.z - EPSILON)).distance )*/ auto normals = p.normalize(); auto light = vec3(1,1,1).normalize(); auto tmp = light*p; auto color = tmp.x+tmp.y+tmp.z; return vec4(vec3(color, color, color), 1.0); //return {v.normalize(), 1.0}; } ); auto sphere = a.scene_elements.push( [=](vec3 pos) -> render_point { render_point ret; ret.distance = gp::fixed_sqrt(pos.x*pos.x + pos.y*pos.y + pos.z*pos.z) - 1.0; ret.material = v; return ret; } ); a._camera.position = vec3{0, 0, -2}; a._camera.normal = vec3{0, 0, 1}; using pic_color = gp::vec4_g; gp::bmp_viewport vp{ {1000,500}, [&](gp::vec2_g 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; } }; gp::array* buff = new gp::array(); 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(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()); myfile.close(); delete buff; //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_ml8576f(new render_test{});