fl3 CCone::getColor(vector<CLight> Lights, int SceneLightCount) { //здесь интенсивностb света от разных источников суммируютс¤. if (CLight::light_model != CLight::LM_NO_LIGHT) { int n = Lights.size(); if (n == 0) return fl3(0, 0, 0); calculatePointColor(); calculateIntensity(Lights); fl3 col = fl3(0, 0, 0); for (int i = 0; i < n; i++) { fl3 clr = Lights[i].clr; float r = clr.m[0], g = clr.m[1], b = clr.m[2]; fl3 intensity = SavedIntensity[i]; float ir = intensity.m[0], ig = intensity.m[1], ib = intensity.m[2]; col += fl3(r*ir, g*ig, b*ib); } col = SavedColor ^ col; //col /= (float)SceneLightCount; return col; } return SavedNormal; }
GLvoid CCamera::PositionCamera(float PositionX, float PositionY, float PositionZ, float ViewX, float ViewY, float ViewZ, float upVectorX, float upVectorY, float upVectorZ) { m_vPosition = fl3(PositionX, PositionY, PositionZ); m_vView = fl3(ViewX, ViewY, ViewZ); m_vUpVector = fl3(upVectorX, upVectorY, upVectorZ); }
CCone::CCone() { b_create = false; obj.resize(VERTEX_NUM); for (int i = 0; i < VERTEX_NUM; i++) obj[i].resize(VERTEX_NUM); c = fl3(0, 0, 0); LightCoef = new CObjectLightParam(); }
fl3 to_cylindrical_r_phi_z(fl3 point) { float x = point.m[0], y = point.m[1], z = point.m[2], r = sqrt(x*x + y*y), phi = atan(y / x); return fl3(r, phi, z); }
fl3 to_spherical_r_phi_theta(fl3 point) { float x = point.m[0], y = point.m[1], z = point.m[2], r = sqrt(x*x + y*y + z*z), theta = acos(z / r), phi = atan(y / x); return fl3(r, phi, theta); }
CCone::CCone(float _r1, float _r2, float _h) { b_create = false; r1 = _r1; r2 = _r2; h = _h; obj.resize(VERTEX_NUM); for (int i = 0; i < VERTEX_NUM; i++) obj[i].resize(VERTEX_NUM); c = fl3(0, 0, 0); LightCoef = new CObjectLightParam(); }
void CCone::create() { //for OGL drawing static const float phi_end = 2.0f*(float)M_PI, d_phi = (2.0f*(float)M_PI / (float)VERTEX_NUM); float phi = 0; for (int i = 0; phi < phi_end && i < VERTEX_NUM; phi += d_phi, i++) { float r = r1, r_end = r2, d_r = ((r2 - r1) / (float)VERTEX_NUM); float hh = -h*0.5f, hh_end = h*0.5f, d_hh = (h / (float)VERTEX_NUM); for (int j = 0; hh < hh_end && j < VERTEX_NUM; r += d_r, j++, hh += d_hh) { obj[i][j] = c + (fl3(r*cos(phi), hh, r*sin(phi))); } } //create matrix for ray tracing transpose += (c - fl3(0.0f, h*0.5f, 0.0f)); float R = max(r1, r2); scale *= fl3(R, h, R); }
CCamera::CCamera() { kSpeed = 0.05f; MouseFlag = false; /*m_vPosition = fl3 ( 0.0, 0.0, 50.0 ); m_vView = fl3 ( 0.0, 0.0, 0.0 ); m_vUpVector = fl3 ( 0.0, 1.0, 0.0 );*/ m_vPosition = CAMERA_POS; m_vView = CAMERA_VIEW; m_vUpVector = fl3(0.0, 1.0, 0.0); Perspective = 45.0f; }
void Matrix::lookAt(const float xPos, const float yPos, const float zPos, const float xLook, const float yLook, const float zLook, const float xUp, const float yUp, const float zUp) { fl3 dir (xLook - xPos, yLook - yPos, zLook - zPos); normalize(dir); fl3 up (xUp, yUp, zUp); fl3 right = cross(dir, up); normalize(right); up = cross(right, dir); normalize(up); lookAtHelper(fl3(xPos, yPos, zPos), dir, up, right); }
fl3 fl3::operator+(const fl3 &other) { return fl3(x+other.x, y+other.y, z+other.z); }
fl3 operator + (const fl3 l, const fl3 r) { return fl3(l.m[0] + r.m[0], l.m[1] + r.m[1], l.m[2] + r.m[2]); }
bool CCone::trace(CRay ray, float& t) { static float R = r1,//max(r1,r2), r = r2;//min(r1,r2); CRay Ray = TransferToCanonical(ray); SavedEyeRay = ray; float Dirx = Ray._2.m[0], Diry = Ray._2.m[2], Dirz = Ray._2.m[1], Eyex = Ray._1.m[0], Eyey = Ray._1.m[2], Eyez = Ray._1.m[1], s = r / R, k = s - 1, d = k*Dirz, f = 1 + k*Eyez, A = Dirx*Dirx + Diry*Diry - d*d, B = (Eyex*Dirx + Eyey*Diry - f*d) * 2, C = Eyex*Eyex + Eyey*Eyey - f*f; float D = B*B - 4.0f*A*C; if (D >= 0) //бокова¤ поверхность { t = (-B - sqrtf(D)) / (2.0f*A); fl3 P = Ray.getPoint(t); if (t < 0) return false; fl3 Vscale = fl3(R, h, R), P1 = (Ray._1) ^ Vscale, P2 = P ^ Vscale; float norm1 = norm(P1 - P2); float norm2 = norm(ray._2); t = norm1 / norm2; SavedPoint = TransferToCanonical(ray.getPoint(t)); SavedNormal = normalize(fl3(SavedPoint.m[0], (R - r) / h, SavedPoint.m[2])); if (P.m[1] <= 1 && P.m[1] >= 0) return true; } float t1 = -Eyez / Dirz, //нижнее основание t2 = t1 + 1.0f / Dirz; //верхнее t = min(t1, t2); fl3 P = Ray.getPoint(t); if (t < 0) return false; fl3 Vscale = fl3(R, h, R), P1 = (Ray._1) ^ Vscale, P2 = P ^ Vscale; float norm1 = norm(P1 - P2); float norm2 = norm(ray._2); t = norm1 / norm2; SavedPoint = TransferToCanonical(ray.getPoint(t)); float px = P.m[0], py = P.m[2]; if (t1 < t2) { SavedNormal = fl3(0, -1, 0); return (px*px + py*py <= 1); } else { SavedNormal = fl3(0, 1, 0); return (px*px + py*py <= s*s); } }
fl3 ort(fl3 v1, fl3 v2) { return fl3(((v1.m[1] * v2.m[2]) - (v1.m[2] * v2.m[1])), ((v1.m[2] * v2.m[0]) - (v1.m[0] * v2.m[2])), ((v1.m[0] * v2.m[1]) - (v1.m[1] * v2.m[0]))); }
fl3 operator - (const fl3 a) { return fl3(-a.m[0], -a.m[1], -a.m[2]); }
void CCone::calculatePointColor() { SavedColor = fl3(0.8f, 0.8f, 0.8f); }
fl3 fl3::operator*(const float &scalar) { return fl3(x*scalar, y*scalar, z*scalar); };
//покомпонентное произведение fl3 operator ^ (const fl3 a, const fl3 b) { return fl3(a.m[0] * b.m[0], a.m[1] * b.m[1], a.m[2] * b.m[2]); }
int main(int argc, char const *argv[]) { int i; Forward_list<int> fl1; Forward_list<int> fl2(fl1); Forward_list<int> fl3(std::move(fl1)); Forward_list<int>::iterator it; Forward_list<int>::const_iterator cit; // Unity test #1: size() assert(fl1.size() == 0); assert(fl2.size() == 0); assert(fl3.size() == 0); // Unity test #2: empty() assert(fl1.empty() == true); assert(fl2.empty() == true); assert(fl3.empty() == true); // Unity test #3: push_front() consequences fl1.push_front(3); fl2.push_front(3); fl3.push_front(3); assert(fl1.size() == 1); // size() to fl1 assert(fl2.size() == 1); // size() to fl2 assert(fl3.size() == 1); // size() to fl3 assert(fl1.empty() == false); // empty() to fl1 assert(fl2.empty() == false); // empty() to fl2 assert(fl3.empty() == false); // empty() to fl3 assert(fl1.front() == 3); // front() to fl1 assert(fl2.front() == 3); // front() to fl2 assert(fl3.front() == 3); // front() to fl3 assert(fl1.back() == 3); // back() to fl1 assert(fl2.back() == 3); // back() to fl2 assert(fl3.back() == 3); // back() to fl3 // Unity test #4: push_back() consequences fl1.push_back(10); fl2.push_back(10); fl3.push_back(10); assert(fl1.size() == 2); // size() to fl1 assert(fl2.size() == 2); // size() to fl2 assert(fl3.size() == 2); // size() to fl3 assert(fl1.empty() == false); // empty() to fl1 assert(fl2.empty() == false); // empty() to fl2 assert(fl3.empty() == false); // empty() to fl3 assert(fl1.front() == 3); // front() to fl1 assert(fl2.front() == 3); // front() to fl2 assert(fl3.front() == 3); // front() to fl3 assert(fl1.back() == 10); // back() to fl1 assert(fl2.back() == 10); // back() to fl2 assert(fl3.back() == 10); // back() to fl3 // Unity test #5: pop_front() consequences fl1.pop_front(); fl2.pop_front(); fl3.pop_front(); assert(fl1.size() == 1); // size() to fl1 assert(fl2.size() == 1); // size() to fl2 assert(fl3.size() == 1); // size() to fl3 assert(fl1.empty() == false); // empty() to fl1 assert(fl2.empty() == false); // empty() to fl2 assert(fl3.empty() == false); // empty() to fl3 assert(fl1.front() == 10); // front() to fl1 assert(fl2.front() == 10); // front() to fl2 assert(fl3.front() == 10); // front() to fl3 assert(fl1.back() == 10); // back() to fl1 assert(fl2.back() == 10); // back() to fl2 assert(fl3.back() == 10); // back() to fl3 fl1.push_front(3); fl2.push_front(3); fl3.push_front(3); // Unity test #6: pop_back() consequences fl1.pop_back(); fl2.pop_back(); fl3.pop_back(); assert(fl1.size() == 1); // size() to fl1 assert(fl2.size() == 1); // size() to fl2 assert(fl3.size() == 1); // size() to fl3 assert(fl1.empty() == false); // empty() to fl1 assert(fl2.empty() == false); // empty() to fl2 assert(fl3.empty() == false); // empty() to fl3 assert(fl1.front() == 3); // front() to fl1 assert(fl2.front() == 3); // front() to fl2 assert(fl3.front() == 3); // front() to fl3 assert(fl1.back() == 3); // back() to fl1 assert(fl2.back() == 3); // back() to fl2 assert(fl3.back() == 3); // back() to fl3 // Unity test #7: clear() consequences fl1.clear(); fl2.clear(); fl3.clear(); assert(fl1.size() == 0); // size() to fl1 assert(fl2.size() == 0); // size() to fl2 assert(fl3.size() == 0); // size() to fl3 assert(fl1.empty() == true); // empty() to fl1 assert(fl2.empty() == true); // empty() to fl2 assert(fl3.empty() == true); // empty() to fl3 // Unity test #8: push_back() and back() for (i = 0; i < 10; i++) { fl1.push_back(i); fl2.push_back(i); fl3.push_back(i); assert(fl1.back() == i); assert(fl2.back() == i); assert(fl3.back() == i); } // Unity test #9: assign(), front() and pop_front(); fl1.assign(100); fl2.assign(100); fl3.assign(100); for (i = 0; i < 10; i++) { assert(fl1.front() == 100); assert(fl2.front() == 100); assert(fl3.front() == 100); fl1.pop_front(); fl2.pop_front(); fl3.pop_front(); } // Unity test #10: size() and empty() (after pop_front) assert(fl1.size() == 0); assert(fl2.size() == 0); assert(fl3.size() == 0); assert(fl1.empty() == true); assert(fl2.empty() == true); assert(fl3.empty() == true); // Unity test #11: assign() with initializer list fl1.assign({1, 2, 3, 4}); fl2.assign({1, 2, 3, 4}); fl3.assign({1, 2, 3, 4}); for (i = 1; i < 5; i++) { assert(fl1.front() == i); assert(fl2.front() == i); assert(fl3.front() == i); fl1.pop_front(); fl2.pop_front(); fl3.pop_front(); } // Unity test #12: size() and empty() (after pop_front) [2] assert(fl1.size() == 0); assert(fl2.size() == 0); assert(fl3.size() == 0); assert(fl1.empty() == true); assert(fl2.empty() == true); assert(fl3.empty() == true); // Unity test #13: assign() w/ initializer_list, insert_after(), // --------------- before_begin(), begin(), operators (prefix ++ and !=), // --------------- end(), front() and pop_front() fl1.assign({1, 2, 3, 4, 5, 6}); fl2.assign({1, 2, 3, 4, 5, 6}); fl3.assign({1, 2, 3, 4, 5, 6}); // To fl1 it = fl1.insert_after(fl1.before_begin(), 0); for (it = fl1.begin(), i = 0; it != fl1.end(); ++it, i++) { assert(fl1.front() == i); fl1.pop_front(); } assert(i == 7); // To fl2 it = fl2.insert_after(fl2.before_begin(), 0); for (it = fl2.begin(), i = 0; it != fl2.end(); ++it, i++) { assert(fl2.front() == i); fl2.pop_front(); } assert(i == 7); // To fl3 it = fl3.insert_after(fl3.before_begin(), 0); for (it = fl3.begin(), i = 0; it != fl3.end(); ++it, i++) { assert(fl3.front() == i); fl3.pop_front(); } assert(i == 7); // Unity test #14: assign() w/ initializer_list, insert_after(), // --------------- before_begin(), cbegin(), operators (postfix ++ and !=), // --------------- cend(), front() and pop_front() fl1.assign({1, 2, 3, 4, 5, 6}); fl2.assign({1, 2, 3, 4, 5, 6}); fl3.assign({1, 2, 3, 4, 5, 6}); // To fl1 it = fl1.insert_after(fl1.before_begin(), 0); for (cit = fl1.cbegin(), i = 0; cit != fl1.cend(); cit++, i++) { assert(fl1.front() == i); fl1.pop_front(); } assert(i == 7); // To fl2 it = fl2.insert_after(fl2.before_begin(), 0); for (cit = fl2.cbegin(), i = 0; cit != fl2.cend(); cit++, i++) { assert(fl2.front() == i); fl2.pop_front(); } assert(i == 7); // To fl3 it = fl3.insert_after(fl3.before_begin(), 0); for (cit = fl3.cbegin(), i = 0; cit != fl3.cend(); cit++, i++) { assert(fl3.front() == i); fl3.pop_front(); } assert(i == 7); // Unit test #15: erase_after() with only one iterator and cbefore_begin() // Fill List for (i = 0; i < 10; i++) { fl1.push_back(i); fl2.push_back(i); fl3.push_back(i); } it = fl1.erase_after(fl1.cbefore_begin()); it = fl2.erase_after(fl2.cbefore_begin()); it = fl3.erase_after(fl3.cbefore_begin()); assert(fl1.size() == 9); // Test for fl1 assert(fl2.size() == 9); // Test for fl2 assert(fl3.size() == 9); // Test for fl3 assert(fl1.empty() == false); // Test for fl1 assert(fl2.empty() == false); // Test for fl2 assert(fl3.empty() == false); // Test for fl3 assert(fl1.front() == 1); // Test for fl1 assert(fl2.front() == 1); // Test for fl2 assert(fl3.front() == 1); // Test for fl3 assert(fl1.back() == 9); // Test for fl1 assert(fl2.back() == 9); // Test for fl2 assert(fl3.back() == 9); // Test for fl3 // Clear List content fl1.clear(); fl2.clear(); fl3.clear(); // Unit test #16: erase_after() with the begin and end iterators // Fill List for (i = 0; i < 10; i++) { fl1.push_back(i); fl2.push_back(i); fl3.push_back(i); } it = fl1.erase_after(fl1.cbegin(), fl1.cend()); it = fl2.erase_after(fl2.cbegin(), fl2.cend()); it = fl3.erase_after(fl3.cbegin(), fl3.cend()); assert(fl1.size() == 1); // Test for fl1 assert(fl2.size() == 1); // Test for fl2 assert(fl3.size() == 1); // Test for fl3 assert(fl1.empty() == false); // Test for fl1 assert(fl2.empty() == false); // Test for fl2 assert(fl3.empty() == false); // Test for fl3 assert(fl1.front() == 0); // Test for fl1 assert(fl2.front() == 0); // Test for fl2 assert(fl3.front() == 0); // Test for fl3 assert(fl1.back() == 0); // Test for fl1 assert(fl2.back() == 0); // Test for fl2 assert(fl3.back() == 0); // Test for fl3 // Clear List content fl1.clear(); fl2.clear(); // Unit test #17: find() // Fill List for (i = 0; i < 10; i++) { fl1.push_back(i); fl2.push_back(i); fl3.push_back(i); } for (i = 0; i < 10; i++) { assert(*fl1.find(i) == i); assert(*fl2.find(i) == i); assert(*fl3.find(i) == i); } // Clear List content fl1.clear(); fl2.clear(); // Put elements on list to test memory leak for (i = 0; i < 10; i++) { fl1.push_back(i); fl2.push_back(i); fl3.push_back(i); } std::cout << ">>> Exiting with success...\n"; return EXIT_SUCCESS; }
fl3 operator * (const fl3 a, const float b) { return fl3(b*a.m[0], b*a.m[1], b*a.m[2]); }