00001
00002 #include <yafraycore/meshtypes.h>
00003 #include <cstdlib>
00004
00005 #ifdef __MINGW32__ //Added by DarkTide to enable mingw32 compliation
00006 void *alloca(size_t);
00007 #endif
00008
00009 __BEGIN_YAFRAY
00010
00011 triangleObject_t::triangleObject_t(int ntris, bool hasUV, bool hasOrco):
00012 has_orco(hasOrco), has_uv(hasUV), has_vcol(false), is_smooth(false)
00013 {
00014 triangles.reserve(ntris);
00015 if(hasUV)
00016 {
00017 uv_offsets.reserve(ntris);
00018 }
00019 }
00020
00021 int triangleObject_t::getPrimitives(const triangle_t **prims)
00022 {
00023 for(unsigned int i=0; i < triangles.size(); ++i)
00024 {
00025 prims[i] = &(triangles[i]);
00026 }
00027 return triangles.size();
00028 }
00029
00030 triangle_t* triangleObject_t::addTriangle(const triangle_t &t)
00031 {
00032 triangles.push_back(t);
00033 return &(triangles.back());
00034 }
00035
00036 void triangleObject_t::setContext(std::vector<point3d_t>::iterator p, std::vector<normal_t>::iterator n)
00037 {
00038 points = p;
00039 normals = n;
00040 }
00041
00042 void triangleObject_t::finish()
00043 {
00044 for(std::vector<triangle_t>::iterator i=triangles.begin(); i!= triangles.end(); ++i)
00045 {
00046 (*i).recNormal();
00047 }
00048 }
00049
00050 int triangleObject_t::evalVMap(const surfacePoint_t &sp, unsigned int ID, float *val) const
00051 {
00052 std::map<int, vmap_t>::const_iterator vm = vmaps.find(ID);
00053 if(vm == vmaps.end()) return 0;
00054 const vmap_t &map = vm->second;
00055 int ndim = map.getDimensions();
00056 float *rvals = (float *)alloca( 3*ndim * sizeof(float) );
00057 int tri_index = (triangle_t*)sp.origin - &(this->triangles.front());
00058 map.getVal(tri_index, rvals);
00059 float u=sp.sU, v=sp.sV;
00060 float w=1.f - u - v;
00061 for(int i=0; i<ndim; ++i)
00062 {
00063 val[i] = u*rvals[i] + v*rvals[i+ndim] + w*rvals[i+2*ndim];
00064 }
00065 return ndim;
00066 }
00067
00068
00069
00070
00071
00072 meshObject_t::meshObject_t(int ntris, bool hasUV, bool hasOrco):
00073 has_orco(hasOrco), has_uv(hasUV), has_vcol(false), is_smooth(false), light(0)
00074 {
00075
00076 if(hasUV)
00077 {
00078 uv_offsets.reserve(ntris);
00079 }
00080 }
00081
00082 int meshObject_t::getPrimitives(const primitive_t **prims) const
00083 {
00084 int n=0;
00085 for(unsigned int i=0; i < triangles.size(); ++i, ++n)
00086 {
00087 prims[n] = &(triangles[i]);
00088 }
00089 for(unsigned int i=0; i < s_triangles.size(); ++i, ++n)
00090 {
00091 prims[n] = &(s_triangles[i]);
00092 }
00093 return n;
00094 }
00095
00096 primitive_t* meshObject_t::addTriangle(const vTriangle_t &t)
00097 {
00098 triangles.push_back(t);
00099 return &(triangles.back());
00100 }
00101
00102 primitive_t* meshObject_t::addBsTriangle(const bsTriangle_t &t)
00103 {
00104 s_triangles.push_back(t);
00105 return &(triangles.back());
00106 }
00107
00108 void meshObject_t::setContext(std::vector<point3d_t>::iterator p, std::vector<normal_t>::iterator n)
00109 {
00110 points = p;
00111 normals = n;
00112 }
00113
00114 void meshObject_t::finish()
00115 {
00116 for(std::vector<vTriangle_t>::iterator i=triangles.begin(); i!= triangles.end(); ++i)
00117 {
00118 (*i).recNormal();
00119 }
00120 }
00121
00122 __END_YAFRAY