Integrate Perlin noise switch

Also make Perlin noise ground wider and less ugly
This commit is contained in:
Théophile Bastian 2018-02-14 13:16:01 +01:00
parent b208cc237e
commit eaa730f5dc
3 changed files with 42 additions and 15 deletions

View File

@ -2,6 +2,8 @@
* bouncing implicit-surface defined sphere.
**/
#include <cstring>
#include "render/GlutRender.hpp"
#include "Ball.hpp"
#include "FlatGround.hpp"
@ -11,26 +13,45 @@
#include "periodic_updates.hpp"
int main(int argc, char** argv) {
bool perlin = false;
for(int pos=1; pos < argc; ++pos) {
if(strcmp(argv[pos], "-perlin") == 0)
perlin = true;
}
// Last minute switch, this code is ugly, please close your eyes until
// stated otherwise.
PerlinGround perlin_ground;
FlatGround flat_ground;
GroundFlatMesh ground_mesh(Point(0., 0., 0.), 0.05);
Ground* ball_ground = nullptr;
if(perlin)
ball_ground = &perlin_ground;
else
ball_ground = &flat_ground;
// You can open your eyes, now.
PerlinGround* flat = new PerlinGround();
GlutRender& render = GlutRender::get_instance();
render.init(&argc, argv, 640, 480, "Bouncing stuff");
Ball ball(Point(0, 5, 0), flat, 0.55, -.5, -.7, 1, 1);
Ball ball(Point(0, 5, 0), ball_ground, 0.55, -.5, -.7, 1, 1);
ball.get_surface()->set_color(Color(1., 0., 0.));
Cuboid bbox = ball.get_surface()->max_bounding_box();
Cuboid bbox_2(Point(-2, -1, -2), Point(2,1,2));
Cuboid bbox_2(Point(-20, -2, -20), Point(20,2,20));
printf("%.2lf %.2lf %.2lf | %.2lf %.2lf %.2lf\n",
bbox.low(0), bbox.low(1), bbox.low(2),
bbox.high(0), bbox.high(1), bbox.high(2));
render.add_surface(ball.get_surface(), bbox);
render.add_surface(flat->get_surface(), bbox_2);
GroundFlatMesh ground(Point(0., 0., 0.), 0.05);
ground.get_mesh()->set_color(Color(0.13, 0.82, 0.21));
render.add_mesh(ground.get_mesh());
if(perlin) {
perlin_ground.get_surface()->set_color(Color(0.13, 0.82, 0.21));
render.add_surface(perlin_ground.get_surface(), bbox_2, 1);
}
else {
ground_mesh.get_mesh()->set_color(Color(0.13, 0.82, 0.21));
render.add_mesh(ground_mesh.get_mesh());
}
render.set_idle_func(periodic_update);
init_periodic_static(&ball);

View File

@ -74,12 +74,14 @@ void GlutRender::remove_mesh(Mesh* mesh) {
meshes.erase(mesh);
}
void GlutRender::add_surface(ImplicitSurface* surf, const Cuboid& box) {
surfaces.insert(SurfaceDetails(surf, box));
void GlutRender::add_surface(ImplicitSurface* surf, const Cuboid& box,
double resolution)
{
surfaces.insert(SurfaceDetails(surf, box, resolution));
}
void GlutRender::remove_surface(ImplicitSurface* surf) {
surfaces.erase(SurfaceDetails(surf, Cuboid::empty()));
surfaces.erase(SurfaceDetails(surf, Cuboid::empty(), 0.1));
}
void GlutRender::run() {
@ -190,7 +192,8 @@ void GlutRender::display() {
}
for(const SurfaceDetails& surface: surfaces) {
Mesh mesh = MarchingCubes(*surface.surface, surface.box)
Mesh mesh = MarchingCubes(*surface.surface, surface.box,
surface.resolution)
.add_hint(surface.surface->location_hint())
();
display_mesh(mesh);

View File

@ -18,7 +18,8 @@ class GlutRender {
void cleanup();
void add_mesh(Mesh* mesh);
void remove_mesh(Mesh* mesh);
void add_surface(ImplicitSurface* surf, const Cuboid& box);
void add_surface(ImplicitSurface* surf, const Cuboid& box,
double resolution=0.1);
void remove_surface(ImplicitSurface* surf);
void run();
@ -26,11 +27,13 @@ class GlutRender {
private:
struct SurfaceDetails {
SurfaceDetails(ImplicitSurface* surf, const Cuboid& box):
surface(surf), box(box) {}
SurfaceDetails(ImplicitSurface* surf, const Cuboid& box,
double resolution):
surface(surf), box(box), resolution(resolution) {}
ImplicitSurface* surface;
Cuboid box;
double resolution;
bool operator<(const SurfaceDetails& oth) const {
return surface < oth.surface;