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