Skip to content

Commit

Permalink
Added perlin noise generator
Browse files Browse the repository at this point in the history
  • Loading branch information
Pedro Jorquera committed Mar 14, 2024
1 parent 49b79c9 commit 9aa619f
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 1 deletion.
15 changes: 14 additions & 1 deletion src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -84,11 +84,24 @@ void earth() {
camera.render(scene, "image.ppm");
}

void twoPerlinSpheres() {
shared_ptr<Scene> scene = make_shared<Scene>();

auto perlinTexture = make_shared<NoiseTexture>();
scene->add(make_shared<Sphere>(Point(0.0, -1000.0, 0.0), 1000, make_shared<Lambertian>(perlinTexture)));
scene->add(make_shared<Sphere>(Point(0.0, 2.0, 0.0), 2.0, make_shared<Lambertian>(perlinTexture)));

Camera camera(16.0 / 9.0, 100, 50, 400, 20.0, Vector(13.0, 2.0, 3.0), Vector(0.0, 0.0, 0.0), Vector(0.0, 1.0, 0.0), 0.0, 10.0);

camera.render(scene, "image.ppm");
}

int main() {
switch (3) {
switch (4) {
case 1: randomSpheres(); break;
case 2: twoSpheres(); break;
case 3: earth(); break;
case 4: twoPerlinSpheres(); break;
}
return 0;
}
46 changes: 46 additions & 0 deletions src/perlin.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
#include "perlin.h"

void permute(int* p, int n) {
for (int i = n-1; i > 0; i--) {
int target = randomInt(0, i);
int tmp = p[i];
p[i] = p[target];
p[target] = tmp;
}
}

int* generatePerm() {
auto p = new int[Perlin::POINT_COUNT];

for (int i = 0; i < Perlin::POINT_COUNT; i++) {
p[i] = i;
}
permute(p, Perlin::POINT_COUNT);
return p;
}

Perlin::Perlin() {
_randomData = new double[Perlin::POINT_COUNT];
for (int i = 0; i < Perlin::POINT_COUNT; ++i) {
_randomData[i] = randomDouble();
}

_permuteX = generatePerm();
_permuteY = generatePerm();
_permuteZ = generatePerm();
}

Perlin::~Perlin() {
delete [] _randomData;
delete [] _permuteX;
delete [] _permuteY;
delete [] _permuteZ;
}

double Perlin::noise(const Point& point) const {
auto i = int(4.0 * point.x()) & 255;
auto j = int(4.0 * point.y()) & 255;
auto k = int(4.0 * point.z()) & 255;

return _randomData[_permuteX[i] ^ _permuteY[j] ^ _permuteZ[k]];
}
22 changes: 22 additions & 0 deletions src/perlin.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#pragma once

#include "vector.h"

class Perlin {

private:

double* _randomData;
int* _permuteX;
int* _permuteY;
int* _permuteZ;

public:

static const int POINT_COUNT = 256;

Perlin();
~Perlin();

double noise(const Point& point) const;
};
17 changes: 17 additions & 0 deletions src/texture.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

#include "vector.h"
#include "image.h"
#include "perlin.h"

#include <memory>
#include <string>
Expand Down Expand Up @@ -89,3 +90,19 @@ class ImageTexture : public Texture {
}

};

class NoiseTexture : public Texture {

private:

Perlin _noise;

public:

NoiseTexture() {}

Color color(double u, double v, const Point &point) override {
return Color(1.0, 1.0, 1.0) * _noise.noise(point);
}

};

0 comments on commit 9aa619f

Please sign in to comment.