# HG changeset patch # User Radek Brich # Date 1208972103 -7200 # Node ID 907929fa9b592f62041a5b947219bd417f3f0dcc # Parent 062b1c4143f7fcbba148cd7fa00423c526603d99 remove forgotten noise.h includes common_ply.h: ignore invalid faces with duplicated points (this solves visual flaws in dragon model) extend loadShape for loading triangles realtime_dragon.cc demo: add kd-tree dump/load functionality, add colored perlin cloud texture diff -r 062b1c4143f7 -r 907929fa9b59 ccdemos/common_ply.h --- a/ccdemos/common_ply.h Wed Apr 23 14:39:33 2008 +0200 +++ b/ccdemos/common_ply.h Wed Apr 23 19:35:03 2008 +0200 @@ -57,7 +57,17 @@ continue; } f >> v1 >> v2 >> v3; - face = new Triangle(vertices.at(v1), vertices.at(v3), vertices.at(v2), mat); + + // check for invalid faces and ignore them + if (vertices[v1]->P == vertices[v2]->P + || vertices[v1]->P == vertices[v3]->P + || vertices[v2]->P == vertices[v3]->P) + { + f.ignore(1000,'\n'); + continue; + } + + face = new Triangle(vertices[v1], vertices[v3], vertices[v2], mat); rt.addShape(face); normals.at(v1) += face->getNormal(); diff -r 062b1c4143f7 -r 907929fa9b59 ccdemos/realtime_dragon.cc --- a/ccdemos/realtime_dragon.cc Wed Apr 23 14:39:33 2008 +0200 +++ b/ccdemos/realtime_dragon.cc Wed Apr 23 19:35:03 2008 +0200 @@ -1,5 +1,6 @@ #include "raytracer.h" #include "kdtree.h" +#include "serialize.h" #include "common_sdl.h" #include "common_ply.h" @@ -12,6 +13,8 @@ rt.setMaxDepth(0); rt.setTop(&top); + rt.setCamera(&cam); + cam.setEye(Vector3(0,0,10)); Light light1(Vector3(-5.0, 2.0, 8.0), Colour(0.9, 0.3, 0.6)); light1.castShadows(false); @@ -23,15 +26,33 @@ Material mat(Colour(0.9, 0.9, 0.9)); mat.setSmooth(true); - load_ply(rt, "../models/ply/dragon/dragon_vrip.ply", &mat, Vector3(-29,29,-29), Vector3(0,-3.6,0)); + LinearColourMap cmap(Colour(0.5, 0.0, 0.0), Colour(1.0, 1.0, 0.5)); + //LinearColourMap cmap(Colour(1.0, 0.2, 0.0), Colour(0.3, 0.9, 0.2)); + mat.setTexture(new CloudTexture(10, &cmap)); - rt.setCamera(&cam); - cam.setEye(Vector3(0,0,10)); + ifstream fin("realtime_dragon.kdtreedump"); + if (!fin) + { + load_ply(rt, "../models/ply/dragon/dragon_vrip.ply", + &mat, Vector3(-29,29,-29), Vector3(0,-3.6,0)); + top.optimize(); + } + else + top.load(fin, &mat); - top.optimize(); + for (int i = 1; i < argc; i++) + { + if (strcmp(argv[1], "-dump") == 0) + { + resetSerializer(); + ofstream fout("realtime_dragon.kdtreedump"); + fout << top << endl; + fout.close(); + } - if (argc == 2 && strcmp(argv[1], "-buildonly") == 0) - return 0; + if (strcmp(argv[1], "-buildonly") == 0) + return 0; + } loop_sdl(rt, cam); } diff -r 062b1c4143f7 -r 907929fa9b59 include/kdtree.h --- a/include/kdtree.h Wed Apr 23 14:39:33 2008 +0200 +++ b/include/kdtree.h Wed Apr 23 19:35:03 2008 +0200 @@ -93,7 +93,7 @@ void setMaxDepth(int md) { max_depth = md; }; ostream & dump(ostream &st); - istream & load(istream &st); + istream & load(istream &st, Material *mat); }; #endif diff -r 062b1c4143f7 -r 907929fa9b59 include/material.h --- a/include/material.h Wed Apr 23 14:39:33 2008 +0200 +++ b/include/material.h Wed Apr 23 19:35:03 2008 +0200 @@ -29,7 +29,6 @@ #include "common.h" #include "vector.h" -#include "noise.h" /** * perlin noise @@ -291,6 +290,7 @@ void setTransmissivity(const Float trans, const Float rindex) { transmissivity = trans; refract_index = rindex; }; void setSmooth(bool sm) { smooth = sm; }; + void setTexture(Texture *tex) { texture = tex; }; }; #endif diff -r 062b1c4143f7 -r 907929fa9b59 include/scene.h --- a/include/scene.h Wed Apr 23 14:39:33 2008 +0200 +++ b/include/scene.h Wed Apr 23 19:35:03 2008 +0200 @@ -32,7 +32,6 @@ #include "common.h" #include "sampler.h" -#include "noise.h" #include "vector.h" #include "quaternion.h" diff -r 062b1c4143f7 -r 907929fa9b59 include/serialize.h --- a/include/serialize.h Wed Apr 23 14:39:33 2008 +0200 +++ b/include/serialize.h Wed Apr 23 19:35:03 2008 +0200 @@ -47,7 +47,7 @@ extern Indexer vertex_index, shape_index; void resetSerializer(); -Shape *loadShape(istream &st); +Shape *loadShape(istream &st, Material *mat); ostream & operator<<(ostream &st, Shape &o); ostream & operator<<(ostream &st, Vertex &o); diff -r 062b1c4143f7 -r 907929fa9b59 src/kdtree.cc --- a/src/kdtree.cc Wed Apr 23 14:39:33 2008 +0200 +++ b/src/kdtree.cc Wed Apr 23 19:35:03 2008 +0200 @@ -412,7 +412,7 @@ } } -istream & KdTree::load(istream &st) +istream & KdTree::load(istream &st, Material *mat) { string s; istringstream is; @@ -421,6 +421,8 @@ if (s.compare("(kdtree") != 0) return st; + dbgmsg(1, "* loading kd-tree\n"); + shapes.clear(); if (root) delete root; root = new KdNode(); @@ -433,7 +435,7 @@ Shape *shape; for (int i = 0; i < shape_count; i++) { - shape = loadShape(st); + shape = loadShape(st, mat); Container::addShape(shape); getline(st, s, ','); } diff -r 062b1c4143f7 -r 907929fa9b59 src/serialize.cc --- a/src/serialize.cc Wed Apr 23 14:39:33 2008 +0200 +++ b/src/serialize.cc Wed Apr 23 19:35:03 2008 +0200 @@ -25,15 +25,18 @@ */ #include "serialize.h" +#include #include #include Indexer vertex_index, shape_index; +vector vertices; void resetSerializer() { vertex_index.reset(); shape_index.reset(); + vertices.clear(); } bool Indexer::get(void *o, int &retidx) @@ -53,32 +56,78 @@ } } -Shape *loadShape(istream &st) +Shape *loadShape(istream &st, Material *mat) { string s; istringstream is; - getline(st, s, ','); - trim(s); - if (s.compare("(box") == 0) + for (;;) { - Vector3 L,H; - st >> L; getline(st, s, ','); - st >> H; - getline(st, s, ')'); - return new Box(L, H, new Material(Colour(1,1,1))); + trim(s); + + // Vertex + if (s.compare("(v") == 0) + { + Vector3 P; + st >> P; + getline(st, s, ')'); + vertices.push_back(new Vertex(P)); + getline(st, s, ','); + continue; + } + + // NormalVertex + if (s.compare("(vn") == 0) + { + Vector3 P,N; + st >> P; + getline(st, s, ','); + st >> N; + getline(st, s, ')'); + vertices.push_back(new NormalVertex(P,N)); + getline(st, s, ','); + continue; + } + + // Triangle + if (s.compare("(t") == 0) + { + int a,b,c; + st >> a; + getline(st, s, ','); + st >> b; + getline(st, s, ','); + st >> c; + getline(st, s, ')'); + return new Triangle(vertices[a], vertices[b], vertices[c], mat); + } + + // box + if (s.compare("(box") == 0) + { + Vector3 L,H; + st >> L; + getline(st, s, ','); + st >> H; + getline(st, s, ')'); + return new Box(L, H, mat); + } + + // Sphere + if (s.compare("(sphere") == 0) + { + Vector3 center; + Float radius; + st >> center; + getline(st, s, ','); + st >> radius; + getline(st, s, ')'); + return new Sphere(center, radius, mat); + } + + // else... + return NULL; } - if (s.compare("(sphere") == 0) - { - Vector3 center; - Float radius; - st >> center; - getline(st, s, ','); - st >> radius; - getline(st, s, ')'); - return new Sphere(center, radius, new Material(Colour(1,1,1))); - } - return NULL; } ostream & operator<<(ostream &st, Shape &o)