- float x = look_dir.y*up_dir.z-look_dir.z*up_dir.y;
- float y = look_dir.z*up_dir.x-look_dir.x*up_dir.z;
- float z = look_dir.x*up_dir.y-look_dir.y*up_dir.x;
- float len = sqrt(x*x+y*y+z*z);
-
- matrix[0] = x/len;
- matrix[4] = y/len;
- matrix[8] = z/len;
-
- matrix[1] = matrix[4]*look_dir.z-matrix[8]*look_dir.y;
- matrix[5] = matrix[8]*look_dir.x-matrix[0]*look_dir.z;
- matrix[9] = matrix[0]*look_dir.y-matrix[4]*look_dir.x;
-
- matrix[2] = -look_dir.x;
- matrix[6] = -look_dir.y;
- matrix[10] = -look_dir.z;
+ 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);
+}