Exemple #1
0
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;
}
Exemple #2
0
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);
}
Exemple #3
0
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();
}
Exemple #4
0
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);
}
Exemple #5
0
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);
}
Exemple #6
0
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();
}
Exemple #7
0
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);
}
Exemple #8
0
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;
}
Exemple #9
0
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);
}
Exemple #10
0
	fl3 fl3::operator+(const fl3 &other)
	{
		return fl3(x+other.x, y+other.y, z+other.z);
	}
Exemple #11
0
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]);
}
Exemple #12
0
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);
  }
}
Exemple #13
0
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])));
}
Exemple #14
0
fl3  operator -  (const fl3 a)
{
  return fl3(-a.m[0], -a.m[1], -a.m[2]);
}
Exemple #15
0
void CCone::calculatePointColor()
{
  SavedColor = fl3(0.8f, 0.8f, 0.8f);
}
Exemple #16
0
	fl3 fl3::operator*(const float &scalar)
	{
		return fl3(x*scalar, y*scalar, z*scalar);
	};
Exemple #17
0
//покомпонентное произведение
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;
}
Exemple #19
0
fl3  operator *  (const fl3 a, const float b) { return fl3(b*a.m[0], b*a.m[1], b*a.m[2]); }