00001
00002 #ifndef Y_SCENE_H
00003 #define Y_SCENE_H
00004
00005 #include <yafray_config.h>
00006
00007 #include"color.h"
00008 #include"vector3d.h"
00009 #include <core_api/volume.h>
00010 #include <yafraycore/ccthreads.h>
00011 #include <vector>
00012
00013
00014 #define USER_DATA_SIZE 1024
00015 #define TRIM 0
00016 #define VTRIM 1
00017 #define MTRIM 2
00018 #define INVISIBLEM (1<<8)
00019
00020 __BEGIN_YAFRAY
00021 class scene_t;
00022 class camera_t;
00023 class material_t;
00024 class object3d_t;
00025 class triangleObject_t;
00026 class meshObject_t;
00027 class surfacePoint_t;
00028 class ray_t;
00029 class primitive_t;
00030 class triKdTree_t;
00031 template<class T> class kdTree_t;
00032 class triangle_t;
00033 class background_t;
00034 class light_t;
00035 class surfaceIntegrator_t;
00036 class volumeIntegrator_t;
00037 class imageFilm_t;
00038 class renderArea_t;
00039 class random_t;
00040 class vmap_t;
00041
00042 typedef unsigned int objID_t;
00043
00049 struct YAFRAYCORE_EXPORT renderState_t
00050 {
00051 renderState_t():raylevel(0), currentPass(0), pixelSample(0), rayDivision(1), rayOffset(0), dc1(0), dc2(0),
00052 traveled(0.0), chromatic(true), includeLights(false), userdata(0), lightdata(0), prng(0) {};
00053 renderState_t(random_t *rand):raylevel(0), currentPass(0), pixelSample(0), rayDivision(1), rayOffset(0), dc1(0), dc2(0),
00054 traveled(0.0), chromatic(true), includeLights(false), userdata(0), lightdata(0), prng(rand) {};
00055 ~renderState_t(){};
00056
00057 int raylevel;
00058 CFLOAT depth;
00059 CFLOAT contribution;
00060 const void *skipelement;
00061 int currentPass;
00062 int pixelSample;
00063 int rayDivision;
00064 int rayOffset;
00065 float dc1, dc2;
00066 PFLOAT traveled;
00067 int pixelNumber;
00068 int threadID;
00069 unsigned int samplingOffs;
00070 point3d_t screenpos;
00071 bool chromatic;
00072 bool includeLights;
00073 PFLOAT wavelength;
00074 PFLOAT time;
00075 mutable void *userdata;
00076 void *lightdata;
00077 random_t *const prng;
00078
00080 void setDefaults()
00081 {
00082 raylevel = 0;
00083 chromatic = true;
00084 rayDivision = 1;
00085 rayOffset = 0;
00086 dc1 = dc2 = 0.f;
00087 traveled = 0;
00088 }
00089
00090 explicit renderState_t(const renderState_t &r):prng(r.prng) {}
00091 };
00092
00093 __END_YAFRAY
00094
00095 #include "bound.h"
00096 #include <vector>
00097 #include <map>
00098 #include <list>
00099
00100 #define Y_SIG_ABORT 1
00101 #define Y_SIG_PAUSE 1<<1
00102 #define Y_SIG_STOP 1<<2
00103
00104 __BEGIN_YAFRAY
00105
00116 class YAFRAYCORE_EXPORT scene_t
00117 {
00118 public:
00119 scene_t();
00120 ~scene_t();
00121 explicit scene_t(const scene_t &s){ std::cerr<<"you may not use the copy constructor (yet)!\n"; }
00122 bool render();
00123 void abort();
00124
00125
00126 bool startGeometry();
00127 bool endGeometry();
00128 bool startTriMesh(objID_t id, int vertices, int triangles, bool hasOrco, bool hasUV=false, int type=0);
00129 bool endTriMesh();
00130 bool startCurveMesh(objID_t id, int vertices);
00131 bool endCurveMesh(const material_t *mat, float strandStart, float strandEnd, float strandShape);
00132 int addVertex(const point3d_t &p);
00133 int addVertex(const point3d_t &p, const point3d_t &orco);
00134 bool addTriangle(int a, int b, int c, const material_t *mat);
00135 bool addTriangle(int a, int b, int c, int uv_a, int uv_b, int uv_c, const material_t *mat);
00136 int addUV(GFLOAT u, GFLOAT v);
00137 bool startVmap(int id, int type, int dimensions);
00138 bool endVmap();
00139 bool addVmapValues(float *val);
00140 bool smoothMesh(objID_t id, PFLOAT angle);
00141 bool update();
00142
00143 bool addLight(light_t *l);
00144 bool addMaterial(material_t *m, const char* name);
00145 objID_t getNextFreeID();
00146 bool addObject(object3d_t *obj, objID_t &id);
00147 void addVolumeRegion(VolumeRegion* vr) { volumes.push_back(vr); }
00148 void setCamera(camera_t *cam);
00149 void setImageFilm(imageFilm_t *film);
00150 void setBackground(background_t *bg);
00151 void setSurfIntegrator(surfaceIntegrator_t *s);
00152 void setVolIntegrator(volumeIntegrator_t *v);
00153 void setAntialiasing(int numSamples, int numPasses, int incSamples, double threshold);
00154 void setNumThreads(int threads);
00155 void setMode(int m){ mode = m; }
00156 void depthChannel(bool enable){ do_depth=enable; }
00157
00158 background_t* getBackground() const;
00159 triangleObject_t* getMesh(objID_t id) const;
00160 object3d_t* getObject(objID_t id) const;
00161 std::vector<VolumeRegion*> getVolumes() const { return volumes; }
00162 const camera_t* getCamera() const { return camera; }
00163 imageFilm_t* getImageFilm() const { return imageFilm; }
00164 bound_t getSceneBound() const;
00165 int getNumThreads() const { return nthreads; }
00166 int getSignals() const;
00168 void getAAParameters(int &samples, int &passes, int &inc_samples, CFLOAT &threshold) const;
00169 bool doDepth() const { return do_depth; }
00170
00171 bool intersect(const ray_t &ray, surfacePoint_t &sp) const;
00172 bool isShadowed(renderState_t &state, const ray_t &ray) const;
00173 bool isShadowed(renderState_t &state, const ray_t &ray, int maxDepth, color_t &filt) const;
00174
00175 enum sceneState { READY, GEOMETRY, OBJECT, VMAP };
00176 enum changeFlags { C_NONE=0, C_GEOM=1, C_LIGHT= 1<<1, C_OTHER=1<<2,
00177 C_ALL=C_GEOM|C_LIGHT|C_OTHER };
00178
00179 std::vector<light_t *> lights;
00180 volumeIntegrator_t *volIntegrator;
00181
00182 protected:
00183
00184 struct objData_t
00185 {
00186 triangleObject_t *obj;
00187 meshObject_t *mobj;
00188 std::vector<point3d_t> points;
00189 std::vector<normal_t> normals;
00190 int type;
00191 };
00192 struct scState_t
00193 {
00194 std::list<sceneState> stack;
00195 unsigned int changes;
00196 objID_t nextFreeID;
00197 objData_t *curObj;
00198 vmap_t *cur_vmap;
00199 triangle_t *curTri;
00200 bool orco;
00201 float smooth_angle;
00202 } state;
00203
00204 std::map<objID_t, object3d_t *> objects;
00205 std::map<objID_t, objData_t> meshes;
00206 std::map< std::string, material_t * > materials;
00207 std::vector<VolumeRegion *> volumes;
00208 std::map<int, int> vmaps;
00209 camera_t *camera;
00210 imageFilm_t *imageFilm;
00211 triKdTree_t *tree;
00212 kdTree_t<primitive_t> *vtree;
00213 background_t *background;
00214 surfaceIntegrator_t *surfIntegrator;
00215 bound_t sceneBound;
00216
00217 int AA_samples, AA_passes;
00218 int AA_inc_samples;
00219 CFLOAT AA_threshold;
00220 int nthreads;
00221 int mode;
00222 bool do_depth;
00223 int signals;
00224 mutable yafthreads::mutex_t sig_mutex;
00225 };
00226
00227 __END_YAFRAY
00228
00229 #endif // Y_SCENE_H