mirror of
https://github.com/leozide/leocad
synced 2024-11-17 07:47:55 +01:00
Added missing files.
This commit is contained in:
parent
418481f8c8
commit
79ac714ffc
2 changed files with 178 additions and 0 deletions
49
common/lc_projection.cpp
Normal file
49
common/lc_projection.cpp
Normal file
|
@ -0,0 +1,49 @@
|
|||
#include "lc_global.h"
|
||||
#include "lc_math.h"
|
||||
#include "lc_projection.h"
|
||||
#include "camera.h"
|
||||
|
||||
void lcProjection::setTransformInput(const Camera* pCamera, int width, int height)
|
||||
{
|
||||
mViewPixelWidth = width;
|
||||
mViewPixelHeight = height;
|
||||
mCamera = pCamera;
|
||||
|
||||
calculateTransform();
|
||||
}
|
||||
|
||||
void lcProjection::calculateTransform()
|
||||
{
|
||||
if (NULL == mCamera)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
float fAspect = (float)mViewPixelWidth/(float)mViewPixelHeight;
|
||||
|
||||
switch(mType)
|
||||
{
|
||||
case Ortho:
|
||||
{
|
||||
// Compute the FOV/plane intersection radius.
|
||||
// d d
|
||||
// a = 2 atan(------) => ~ a = --- => d = af
|
||||
// 2f f
|
||||
float f = (mCamera->mPosition - mCamera->mOrthoTarget).Length();
|
||||
float d = ( mCamera->m_fovy * f) * (LC_PI / 180.0f);
|
||||
float r = d/2;
|
||||
|
||||
float right = r * fAspect;
|
||||
mTransform = lcMatrix44Ortho(-right, right, -r, r, mCamera->m_zNear, mCamera->m_zFar * 4);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
case Projection:
|
||||
default:
|
||||
{
|
||||
mTransform = lcMatrix44Perspective(mCamera->m_fovy, fAspect, mCamera->m_zNear, mCamera->m_zFar);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
129
common/lc_projection.h
Normal file
129
common/lc_projection.h
Normal file
|
@ -0,0 +1,129 @@
|
|||
#ifndef _LC_PROJECTION_H_
|
||||
#define _LC_PROJECTION_H_
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "opengl.h"
|
||||
#include "lc_math.h"
|
||||
|
||||
class Camera;
|
||||
|
||||
class lcProjection
|
||||
{
|
||||
public:
|
||||
|
||||
enum Type
|
||||
{
|
||||
Ortho = 0,
|
||||
Projection,
|
||||
OUT_OF_RANGE,
|
||||
Cycle,
|
||||
};
|
||||
|
||||
lcProjection()
|
||||
{
|
||||
mType = Projection;
|
||||
mTransform = lcMatrix44Identity();
|
||||
mCamera = NULL;
|
||||
}
|
||||
|
||||
inline void SetType(Type type)
|
||||
{
|
||||
if (Cycle == type)
|
||||
{
|
||||
type = (Type)((int)mType + 1);
|
||||
if (OUT_OF_RANGE == type)
|
||||
type = (Type)0;
|
||||
}
|
||||
|
||||
if (type < OUT_OF_RANGE)
|
||||
{
|
||||
mType = type;
|
||||
}
|
||||
|
||||
calculateTransform();
|
||||
}
|
||||
|
||||
inline Type GetType() const
|
||||
{
|
||||
return mType;
|
||||
}
|
||||
|
||||
inline void SetView(const Camera* pCamera, int width, int height)
|
||||
{
|
||||
setTransformInput(pCamera, width, height);
|
||||
}
|
||||
|
||||
inline lcVector3 ProjectPoint(const lcMatrix44 mWorldView, const lcVector3& Point) const
|
||||
{
|
||||
int viewport[4] = { 0, 0, mViewPixelWidth, mViewPixelHeight };
|
||||
return lcProjectPoint(Point, mWorldView, mTransform, viewport);
|
||||
}
|
||||
|
||||
inline lcVector3 UnprojectPoint(const lcMatrix44 mWorldView, const lcVector3& Point) const
|
||||
{
|
||||
int viewport[4] = { 0, 0, mViewPixelWidth, mViewPixelHeight };
|
||||
return lcUnprojectPoint(Point, mWorldView, mTransform, viewport);
|
||||
}
|
||||
|
||||
inline void UnprojectPoints(const lcMatrix44 mWorldView, lcVector3* Points, int NumPoints) const
|
||||
{
|
||||
if (NumPoints > 0)
|
||||
{
|
||||
int viewport[4] = { 0, 0, mViewPixelWidth, mViewPixelHeight };
|
||||
lcUnprojectPoints(Points, NumPoints, mWorldView, mTransform, viewport);
|
||||
}
|
||||
}
|
||||
|
||||
inline int ConstrainX(int x) const
|
||||
{
|
||||
if (x >= mViewPixelWidth)
|
||||
return mViewPixelWidth - 1;
|
||||
else
|
||||
if (x <= 0)
|
||||
return 1;
|
||||
return x;
|
||||
}
|
||||
|
||||
inline int ConstrainY(int y) const
|
||||
{
|
||||
if (y >= mViewPixelHeight)
|
||||
return mViewPixelHeight - 1;
|
||||
else
|
||||
if (y <= 0)
|
||||
return 1;
|
||||
return y;
|
||||
}
|
||||
|
||||
operator lcMatrix44& ()
|
||||
{
|
||||
return mTransform;
|
||||
}
|
||||
|
||||
const char* GetName() const
|
||||
{
|
||||
switch(mType)
|
||||
{
|
||||
case Ortho:
|
||||
return "Ortho";
|
||||
|
||||
case Projection:
|
||||
return "Projection";
|
||||
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
void calculateTransform();
|
||||
void setTransformInput(const Camera* pCamera, int width, int height);
|
||||
|
||||
Type mType;
|
||||
lcMatrix44 mTransform;
|
||||
const Camera* mCamera;
|
||||
int mViewPixelWidth;
|
||||
int mViewPixelHeight;
|
||||
};
|
||||
|
||||
#endif _LC_PROJECTION_H_
|
Loading…
Reference in a new issue