- Vector3 right_dir = normalize(cross(look_dir, up_dir));
- double mdata[16];
-
- mdata[0] = right_dir.x;
- mdata[4] = right_dir.y;
- mdata[8] = right_dir.z;
-
- mdata[1] = right_dir.y*look_dir.z-right_dir.z*look_dir.y;
- mdata[5] = right_dir.z*look_dir.x-right_dir.x*look_dir.z;
- mdata[9] = right_dir.x*look_dir.y-right_dir.y*look_dir.x;
-
- mdata[2] = -look_dir.x;
- mdata[6] = -look_dir.y;
- mdata[10] = -look_dir.z;
-
- mdata[12] = -position.x*mdata[0]-position.y*mdata[4]-position.z*mdata[8];
- mdata[13] = -position.x*mdata[1]-position.y*mdata[5]-position.z*mdata[9];
- mdata[14] = -position.x*mdata[2]-position.y*mdata[6]-position.z*mdata[10];
-
- mdata[3] = 0;
- mdata[7] = 0;
- mdata[11] = 0;
- mdata[15] = 1;
+ float frustum_h = (fov!=Geometry::Angle<float>::zero() ? tan(fov/2.0f)*clip_near : height/2);
+ float frustum_w = frustum_h*aspect;
+ float left = frustum_w*(frustum_x-1.0f);
+ float right = frustum_w*(frustum_x+1.0f);
+ float bottom = frustum_h*(frustum_y-1.0f);
+ float top = frustum_h*(frustum_y+1.0f);
+ if(fov>Geometry::Angle<float>::zero())
+ proj_matrix = Matrix::frustum(left, right, bottom, top, clip_near, clip_far);
+ else
+ proj_matrix = Matrix::ortho(left, right, bottom, top, clip_near, clip_far);
+ proj_matrix = Matrix::rotation(rotate, Vector3(0, 0, 1))*proj_matrix;
+}