1 // Copyright 2016-2021 Doug Moen 2 // Licensed under the Apache License, version 2.0 3 // See accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0 4 5 #ifndef LIBCURV_IO_COMPILED_SHAPE_H 6 #define LIBCURV_IO_COMPILED_SHAPE_H 7 8 #include <libcurv/io/cpp_program.h> 9 #include <libcurv/shape.h> 10 #include <ostream> 11 #include <glm/vec3.hpp> 12 #include <glm/vec4.hpp> 13 14 namespace curv { namespace io { 15 16 extern "C" { 17 typedef void (*Cpp_Dist_Func)(const glm::vec4* in, float* out); 18 typedef void (*Cpp_Colour_Func)(const glm::vec4* in, glm::vec3* out); 19 } 20 21 struct Compiled_Shape final : public Shape 22 { 23 Cpp_Program cpp_; 24 Cpp_Dist_Func dist_; 25 Cpp_Colour_Func colour_; 26 27 Compiled_Shape(Shape_Program&); 28 distfinal29 virtual double dist(double x, double y, double z, double t) override 30 { 31 glm::vec4 in{x,y,z,t}; 32 float out; 33 dist_(&in, &out); 34 return out; 35 } colourfinal36 virtual Vec3 colour(double x, double y, double z, double t) override 37 { 38 glm::vec4 in{x,y,z,t}; 39 glm::vec3 out; 40 colour_(&in, &out); 41 return Vec3{out.x,out.y,out.z}; 42 } 43 }; 44 45 void export_cpp(Shape_Program& shape, std::ostream& out); 46 47 }} // namespace 48 #endif // include guard 49