Skip to content

Commit

Permalink
construct objects in scene step by step
Browse files Browse the repository at this point in the history
  • Loading branch information
LittleTheFu committed Oct 2, 2024
1 parent 4867178 commit 9c665d7
Show file tree
Hide file tree
Showing 2 changed files with 102 additions and 58 deletions.
129 changes: 71 additions & 58 deletions scene/scene.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,15 +35,24 @@ Scene::Scene()

void Scene::run()
{
preConstructScene();
constructScene();

preRender();
render();
postRender();
}

void Scene::preConstructScene()
{
createMaterials();
}

void Scene::constructScene()
{
buildRoom();
buildLight();

buildSceneWithDefaultConfig();
}

Expand All @@ -67,53 +76,31 @@ void Scene::postRender()
// m_pObjectPool->applyTransfrom(t.getInverseTransform());
}

void Scene::buildSceneWithDefaultConfig()
void Scene::createMaterials()
{
float rho = 0.4;

LambertianMaterial *lambMtrlLena = new LambertianMaterial(new ImageTexture(Common::LENA), rho);
LambertianMaterial *lambMtrlChessboard = new LambertianMaterial(new ChessboardTexture(), rho);
LambertianMaterial *lambUV = new LambertianMaterial(new UvTexture(), 1);
LambertianMaterial *lambNoise = new LambertianMaterial(new NoiseTexture(Color::COLOR_WHITE), rho);

LambertianMaterial *lambMtrlRed = new LambertianMaterial(new ConstTexture(Color::COLOR_RED), rho);
LambertianMaterial *lambMtrlYellow = new LambertianMaterial(new ConstTexture(Color::COLOR_YELLOW), rho);
LambertianMaterial *lambMtrlAqua = new LambertianMaterial(new ConstTexture(Color::COLOR_AQUA), rho);
LambertianMaterial *lambMtrlPurple = new LambertianMaterial(new ConstTexture(Color::COLOR_PURPLE), rho);
LambertianMaterial *lambMtrlGreen = new LambertianMaterial(new ConstTexture(Color::COLOR_GREEN), rho);
LambertianMaterial *lambMtrlBlue = new LambertianMaterial(new ConstTexture(Color::COLOR_BLUE), rho);
LambertianMaterial *lambMtrlWhite = new LambertianMaterial(new ConstTexture(Color::COLOR_WHITE), rho);

MirrorMaterial MtrlMirror;
GlassMaterial *MtrlGlass = new GlassMaterial();

MixMaterial *MtrlMix = new MixMaterial();

Mesh *bunny = new Mesh(Common::LOW_BUNNY, lambMtrlAqua);
rho = 0.4;

TriVertex v_a(0, 0, 50);
TriVertex v_b(50, 0, 0);
TriVertex v_c(0, 50, 0);
Tri *tri = new Tri(v_a, v_b, v_c, Vector3(30, 30, 300), lambMtrlGreen);
lambMtrlLena = new LambertianMaterial(new ImageTexture(Common::LENA), rho);
lambMtrlChessboard = new LambertianMaterial(new ChessboardTexture(), rho);
lambUV = new LambertianMaterial(new UvTexture(), 1);
lambNoise = new LambertianMaterial(new NoiseTexture(Color::COLOR_WHITE), rho);

TriAngleVertex va = TriAngleVertex(-20, 20, 0, 0);
TriAngleVertex vb = TriAngleVertex(0, -20, 0.5, 1);
TriAngleVertex vc = TriAngleVertex(20, 20, 1, 0);
TriAngle *triAngle = new TriAngle(va, vb, vc,
Vector3(0, -Common::PI / 4, 0), Vector3(-50, 50, 300),
lambMtrlLena);
lambMtrlRed = new LambertianMaterial(new ConstTexture(Color::COLOR_RED), rho);
lambMtrlYellow = new LambertianMaterial(new ConstTexture(Color::COLOR_YELLOW), rho);
lambMtrlAqua = new LambertianMaterial(new ConstTexture(Color::COLOR_AQUA), rho);
lambMtrlPurple = new LambertianMaterial(new ConstTexture(Color::COLOR_PURPLE), rho);
lambMtrlGreen = new LambertianMaterial(new ConstTexture(Color::COLOR_GREEN), rho);
lambMtrlBlue = new LambertianMaterial(new ConstTexture(Color::COLOR_BLUE), rho);
lambMtrlWhite = new LambertianMaterial(new ConstTexture(Color::COLOR_WHITE), rho);

Ball *redBall = new Ball(Vector3::ZERO, Vector3(-55, 10, 240), 20, lambMtrlRed);
Ball *yellowBall = new Ball(Vector3::ZERO, Vector3(60, 80, 225), 20, lambMtrlYellow);
Ball *aquaBall = new Ball(Vector3::ZERO, Vector3(-50, 70, 370), 20, lambMtrlAqua);
Ball *whiteBall = new Ball(Vector3::ZERO, Vector3(20, -20, 250), 20, lambMtrlWhite);
Ball *glassBall = new Ball(Vector3::ZERO, Vector3(75, 72, 300), 20, MtrlGlass);
// Ball *mirrorBall = new Ball(Vector3::ZERO, Vector3(25, 40, 225), 20, MtrlMirror);
Ball *textureBall = new Ball(Vector3::ZERO, Vector3(-45, 40, 220), 20, lambMtrlChessboard);
Ball *mixBall = new Ball(Vector3::ZERO, Vector3(0, 0, 220), 20, MtrlMix);
MtrlMirror = new MirrorMaterial();
MtrlGlass = new GlassMaterial();

Light *light = new Light(Vector3(0, 0, 300), 50);
MtrlMix = new MixMaterial();
}

void Scene::buildRoom()
{
const float c = 100;
const float r = 5 * c;

Expand Down Expand Up @@ -144,30 +131,63 @@ void Scene::buildSceneWithDefaultConfig()
Vector3 backPosition(0, 0, -3 * c);
Plane *backPlane = new Plane(backRotate, backPosition, 100, lambMtrlRed);

Vector3 glassRotate(-Common::PI / 2, 0, 0);
Vector3 glassPosition(0, 0, -c * 0.5);
// Plane *glassPlane = new Plane(glassRotate, glassPosition, r, MtrlGlass);

Vector3 squareRotate(Common::PI, -Common::PI / 4, Common::PI);
Vector3 squarePosition(70, -25, 290);
Plane *squarePlane = new Plane(squareRotate, squarePosition, 20, lambMtrlLena);

// frontPlane->setTag(Common::TAG_PLANE_FRONT);
// backPlane->setTag(Common::TAG_PLANE_BACK);
// topPlane->setTag(Common::TAG_PLANE_TOP);
// bottomPlane->setTag(Common::TAG_PLANE_BOTTOM);
// leftPlane->setTag(Common::TAG_PLANE_LEFT);
// rightPlane->setTag(Common::TAG_PLANE_RIGHT);

m_pObjectPool->add(frontPlane);
m_pObjectPool->add(backPlane);
m_pObjectPool->add(topPlane);
m_pObjectPool->add(bottomPlane);
m_pObjectPool->add(leftPlane);
m_pObjectPool->add(rightPlane);
}

void Scene::buildLight()
{
Light *light = new Light(Vector3(0, 0, 300), 50);
light->setTag(Common::TAG_LIGHT);

m_pObjectPool->add(light);
}

void Scene::buildSceneWithDefaultConfig()
{
Mesh *bunny = new Mesh(Common::LOW_BUNNY, lambMtrlAqua);

TriVertex v_a(0, 0, 50);
TriVertex v_b(50, 0, 0);
TriVertex v_c(0, 50, 0);
Tri *tri = new Tri(v_a, v_b, v_c, Vector3(30, 30, 300), lambMtrlGreen);

TriAngleVertex va = TriAngleVertex(-20, 20, 0, 0);
TriAngleVertex vb = TriAngleVertex(0, -20, 0.5, 1);
TriAngleVertex vc = TriAngleVertex(20, 20, 1, 0);
TriAngle *triAngle = new TriAngle(va, vb, vc,
Vector3(0, -Common::PI / 4, 0), Vector3(-50, 50, 300),
lambMtrlLena);

Ball *redBall = new Ball(Vector3::ZERO, Vector3(-55, 10, 240), 20, lambMtrlRed);
Ball *yellowBall = new Ball(Vector3::ZERO, Vector3(60, 80, 225), 20, lambMtrlYellow);
Ball *aquaBall = new Ball(Vector3::ZERO, Vector3(-50, 70, 370), 20, lambMtrlAqua);
Ball *whiteBall = new Ball(Vector3::ZERO, Vector3(20, -20, 250), 20, lambMtrlWhite);
Ball *glassBall = new Ball(Vector3::ZERO, Vector3(75, 72, 300), 20, MtrlGlass);
// Ball *mirrorBall = new Ball(Vector3::ZERO, Vector3(25, 40, 225), 20, MtrlMirror);
Ball *textureBall = new Ball(Vector3::ZERO, Vector3(-45, 40, 220), 20, lambMtrlChessboard);
Ball *mixBall = new Ball(Vector3::ZERO, Vector3(0, 0, 220), 20, MtrlMix);

Vector3 squareRotate(Common::PI, -Common::PI / 4, Common::PI);
Vector3 squarePosition(70, -25, 290);
Plane *squarePlane = new Plane(squareRotate, squarePosition, 20, lambMtrlLena);

glassBall->setTag(Common::TAG_GLASS_BALL);
// glassPlane->setTag(101);

// mirrorBall->setTag(200);

m_pObjectPool->add(light);

// m_pObjectPool->add(aquaBall);
// m_pObjectPool->add(tri);

Expand All @@ -185,11 +205,4 @@ void Scene::buildSceneWithDefaultConfig()

// pool->add(textureBall);
// bunny->addToPool(m_pObjectPool);

m_pObjectPool->add(frontPlane);
m_pObjectPool->add(backPlane);
m_pObjectPool->add(topPlane);
m_pObjectPool->add(bottomPlane);
m_pObjectPool->add(leftPlane);
m_pObjectPool->add(rightPlane);
}
31 changes: 31 additions & 0 deletions scene/scene.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@
#include "camera.h"
#include "objectpool.h"
#include "pinholeCamera.h"
#include "lambertianMaterial.h"
#include "mirrorMaterial.h"
#include "glassMaterial.h"
#include "mixMaterial.h"

class Scene
{
Expand All @@ -14,18 +18,45 @@ class Scene
void run();

private:
void preConstructScene();
void constructScene();

void preRender();
void render();
void postRender();

private:
void createMaterials();

void buildRoom();
void buildLight();

void buildSceneWithDefaultConfig();

private:
ObjectPool* m_pObjectPool;
Camera* m_pCamera;

private:
float rho;

LambertianMaterial *lambMtrlLena;
LambertianMaterial *lambMtrlChessboard;
LambertianMaterial *lambUV;
LambertianMaterial *lambNoise;

LambertianMaterial *lambMtrlRed;
LambertianMaterial *lambMtrlYellow;
LambertianMaterial *lambMtrlAqua;
LambertianMaterial *lambMtrlPurple;
LambertianMaterial *lambMtrlGreen;
LambertianMaterial *lambMtrlBlue;
LambertianMaterial *lambMtrlWhite;

MirrorMaterial *MtrlMirror;
GlassMaterial *MtrlGlass;

MixMaterial *MtrlMix;
};

#endif

0 comments on commit 9c665d7

Please sign in to comment.