-
Notifications
You must be signed in to change notification settings - Fork 0
/
PerlinMaterial.cc
52 lines (42 loc) · 1.18 KB
/
PerlinMaterial.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include "PerlinMaterial.h"
#include "HitRecord.h"
#include "Light.h"
#include "Point.h"
#include "Primitive.h"
#include "Ray.h"
#include "RenderContext.h"
#include "Scene.h"
#include "Vector.h"
#include "Math.h"
#include "PerlinNoise.h"
#include <iostream>
using namespace std;
PerlinMaterial::PerlinMaterial(Material* m1, Material* m2)
:m1(m1), m2(m2)
{
}
PerlinMaterial::~PerlinMaterial()
{
}
void PerlinMaterial::preprocess(int maxTime)
{
m1->preprocess(maxTime);
m2->preprocess(maxTime);
}
Color turbstripe(Point& p, double w, Color c0, Color c1)
{
double k1 = .01, k2 = 4.;
double t = (1. + (k1*p.x() + sin(perlinNoise(p*k2))) / w) / 2.;
return c0*t + c1*(1-t);
}
void PerlinMaterial::shade(Color& result, const RenderContext& context,
const Ray& ray, const HitRecord& hit, const Color& atten, int depth) const
{
Point hitpos = ray.origin()+ray.direction()*hit.minT();
//if( sin((hitpos.x() + hitpos.y() - hitpos.z())* 15) > 0 &&
//sin((hitpos.x() + hitpos.y() + hitpos.z())* 4 ) > 0)
Color c0,c1;
m1->shade(c0, context, ray, hit, atten, depth);
m2->shade(c1, context, ray, hit, atten, depth);
result = turbstripe(hitpos, .3, c0, c1);
}