ad5cd7b16a
match the genesis editor version 1.3.1.921.
433 lines
10 KiB
C++
433 lines
10 KiB
C++
/****************************************************************************
|
||
Copyright (c) 2011-2013,WebJet Business Division,CYOU
|
||
|
||
http://www.genesis-3d.com.cn
|
||
|
||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||
of this software and associated documentation files (the "Software"), to deal
|
||
in the Software without restriction, including without limitation the rights
|
||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||
copies of the Software, and to permit persons to whom the Software is
|
||
furnished to do so, subject to the following conditions:
|
||
|
||
The above copyright notice and this permission notice shall be included in
|
||
all copies or substantial portions of the Software.
|
||
|
||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||
THE SOFTWARE.
|
||
****************************************************************************/
|
||
#include "stdneb.h"
|
||
#include "graphicfeature/components/cameracomponent.h"
|
||
#include "appframework/actor.h"
|
||
#include "appframework/component.h"
|
||
#include "graphicfeature/graphicsfeature.h"
|
||
|
||
#include "graphicfeature/graphicsfeatureprotocol.h"
|
||
|
||
#include "app/apputil/mouserayutil.h"
|
||
#include "appframework/actormanager.h"
|
||
|
||
namespace App
|
||
{
|
||
__ImplementClass(CameraComponent, 'CAMP', Component);
|
||
|
||
using namespace Math;
|
||
using namespace Graphic;
|
||
|
||
//------------------------------------------------------------------------------
|
||
/**
|
||
*/
|
||
CameraComponent::CameraComponent()
|
||
: m_bUseSkyBox(false)
|
||
, m_bAttached(false)
|
||
, m_bSkyBoxDirty(false)
|
||
, m_bInit(false)
|
||
|
||
{
|
||
m_camera = Graphic::Camera::Create();
|
||
m_camera->SetOwner(this);
|
||
m_camera->SetCameraOrder(Graphic::eCO_Main);
|
||
}
|
||
|
||
//------------------------------------------------------------------------------
|
||
/**
|
||
*/
|
||
CameraComponent::~CameraComponent()
|
||
{
|
||
m_camera = NULL;
|
||
}
|
||
//------------------------------------------------------------------------------
|
||
/**
|
||
*/
|
||
void
|
||
CameraComponent::SetupCallbacks()
|
||
{
|
||
Super::SetupCallbacks();
|
||
this->mActor->RegisterComponentCallback(this, BeginFrame);
|
||
this->mActor->RegisterComponentCallback(this, OnFrame);
|
||
this->mActor->RegisterComponentCallback(this, MoveAfter);
|
||
}
|
||
|
||
void CameraComponent::_OnBeginFrame()
|
||
{
|
||
Super::_OnBeginFrame();
|
||
if (m_bSkyBoxDirty)
|
||
{
|
||
DetachSkyBox();
|
||
AttachSkyBox();
|
||
}
|
||
|
||
}
|
||
//------------------------------------------------------------------------
|
||
void CameraComponent::_OnFrame()
|
||
{
|
||
Super::_OnFrame();
|
||
}
|
||
|
||
void CameraComponent::GetReferenceResourceId(Util::Array<Resources::ReferenceResource>& list) const
|
||
{
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD>б༭<D0B1><E0BCAD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD>ͳ<EFBFBD>ơ<EFBFBD>
|
||
Super::GetReferenceResourceId(list);
|
||
}
|
||
//------------------------------------------------------------------------------
|
||
/**
|
||
*/
|
||
void
|
||
CameraComponent::OnActivate()
|
||
{
|
||
Super::OnActivate();
|
||
|
||
n_assert( m_camera.isvalid() );
|
||
n_assert( GraphicsFeature::HasInstance() );
|
||
n_assert( mActor );
|
||
|
||
if ( mActor )
|
||
{
|
||
m_camera->SetTransform( mActor->GetWorldTranslateNoScale() );
|
||
m_camera->OnTransformChanged();
|
||
}
|
||
AttachCamera();
|
||
#ifndef __SCRIPT_COMMIT__
|
||
mActor->Check_OnRenderPostEffect_Bind();
|
||
#endif
|
||
}
|
||
//------------------------------------------------------------------------------
|
||
/**
|
||
*/
|
||
void
|
||
CameraComponent::OnDeactivate()
|
||
{
|
||
DetachCamera();
|
||
#ifndef __SCRIPT_COMMIT__
|
||
mActor->Check_OnRenderPostEffect_Unbind();
|
||
#endif
|
||
Super::OnDeactivate();
|
||
}
|
||
//------------------------------------------------------------------------------
|
||
/**
|
||
*/
|
||
void
|
||
CameraComponent::OnRenderSceneChanged()
|
||
{
|
||
if (m_camera.isvalid())
|
||
{
|
||
m_camera->SetRenderScene(mActor->GetRenderScene(),true);
|
||
}
|
||
}
|
||
|
||
//------------------------------------------------------------------------------
|
||
/**
|
||
*/
|
||
void
|
||
CameraComponent::SetupAcceptedMessages()
|
||
{
|
||
Super::SetupAcceptedMessages();
|
||
}
|
||
|
||
//------------------------------------------------------------------------------
|
||
/**
|
||
*/
|
||
void
|
||
CameraComponent::HandleMessage(const GPtr<Messaging::Message>& msg)
|
||
{
|
||
}
|
||
//------------------------------------------------------------------------
|
||
bool CameraComponent::GetProjParam( float* nearWidth , float* nearHeight , float* nearPlaneDis , float* farPlaneDis )
|
||
{
|
||
*nearWidth = m_camera->GetCameraSetting().GetNearWidth() ;
|
||
*nearHeight = m_camera->GetCameraSetting().GetNearHeight() ;
|
||
*nearPlaneDis = m_camera->GetCameraSetting().GetZNear() ;
|
||
*farPlaneDis = m_camera->GetCameraSetting().GetZFar();
|
||
|
||
return true ;
|
||
}
|
||
//------------------------------------------------------------------------
|
||
bool CameraComponent::SetProjParam( float nearW , float nearH , float nearDis , float farDis )
|
||
{
|
||
|
||
Graphic::CameraSetting cs = m_camera->GetCameraSetting();
|
||
|
||
float fovy = 2.0f * atan(nearH/(2.0f * nearDis));//
|
||
|
||
cs.SetupPerspectiveFovRH( fovy , nearW / nearH , nearDis , farDis ) ;
|
||
|
||
m_camera->SetCameraSetting( cs ) ;
|
||
|
||
return true ;
|
||
}
|
||
//------------------------------------------------------------------------
|
||
bool CameraComponent::SetProj(float fovOrHeight, float zNear, float zFar, Graphic::Camera::ViewType vt)
|
||
{
|
||
m_camera->SetProj(vt, fovOrHeight, zNear, zFar);
|
||
return true ;
|
||
}
|
||
|
||
bool CameraComponent::SetProj(float fovOrHeight, float zNear, float zFar)
|
||
{
|
||
return SetProj(fovOrHeight, zNear, zFar, m_camera->GetViewType());
|
||
}
|
||
|
||
void CameraComponent::SetZNear(float zNear)
|
||
{
|
||
const CameraSetting& cs = m_camera->GetCameraSetting();
|
||
Camera::ViewType vt = m_camera->GetViewType();
|
||
switch (vt)
|
||
{
|
||
case Camera::VT_persp:
|
||
{
|
||
SetProj(cs.GetFov(), zNear, cs.GetZFar());
|
||
}
|
||
break;
|
||
case Camera::VT_ortho:
|
||
{
|
||
SetProj(cs.GetNearHeight(), zNear, cs.GetZFar());
|
||
}
|
||
break;
|
||
default:
|
||
{
|
||
n_error("No suport this Camera::ViewType: %d", (int)vt);//[zhongdaohuan]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
|
||
void CameraComponent::SetZFar(float zFar)
|
||
{
|
||
const CameraSetting& cs = m_camera->GetCameraSetting();
|
||
Camera::ViewType vt = m_camera->GetViewType();
|
||
switch (vt)
|
||
{
|
||
case Camera::VT_persp:
|
||
{
|
||
SetProj(cs.GetFov(), cs.GetZNear(), zFar, vt);
|
||
}
|
||
break;
|
||
case Camera::VT_ortho:
|
||
{
|
||
SetProj(cs.GetNearHeight(), cs.GetZNear(), zFar, vt);
|
||
}
|
||
break;
|
||
default:
|
||
{
|
||
n_error("No suport this Camera::ViewType: %d", (int)vt);//[zhongdaohuan]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
//------------------------------------------------------------------------
|
||
void CameraComponent::_OnMoveAfter()
|
||
{
|
||
if ( mActor )
|
||
{
|
||
m_camera->SetTransform( mActor->GetWorldTranslateNoScale() );
|
||
m_camera->OnTransformChanged();
|
||
}
|
||
|
||
}
|
||
//------------------------------------------------------------------------
|
||
void CameraComponent::CopyFrom( const GPtr<Component>& pComponent )
|
||
{
|
||
if( !pComponent.isvalid() )
|
||
return;
|
||
if( !pComponent->GetRtti()->IsDerivedFrom( *(this->GetRtti()) ) )
|
||
return;
|
||
|
||
GPtr<CameraComponent> pSource = pComponent.downcast<CameraComponent>();
|
||
GPtr<Graphic::Camera> pSourceCamera = pSource->GetCameraObject();
|
||
n_assert( pSource->m_camera.isvalid() );
|
||
|
||
m_camera->CopyParam(pSourceCamera);
|
||
}
|
||
|
||
//------------------------------------------------------------------------
|
||
void CameraComponent::AttachCamera()
|
||
{
|
||
if ( m_bAttached )
|
||
{
|
||
return;
|
||
}
|
||
|
||
if (eCO_PuppetMain != m_camera->GetCameraOrder())
|
||
{
|
||
const GPtr<GraphicSystem>& gs = GraphicsFeature::Instance()->GetGraphicSystem();
|
||
n_assert( gs.isvalid() );
|
||
if ( gs.isvalid() )
|
||
{
|
||
m_camera->SetOwner(this);
|
||
m_camera->SetRenderScene(mActor->GetRenderScene(),true);
|
||
m_camera->Setup();
|
||
|
||
//if (m_camera->GetCameraOrder() == eCO_Main)
|
||
//{
|
||
// GraphicsFeature::Instance()->AssignDefaultCamera( mActor );
|
||
//}
|
||
}
|
||
}
|
||
|
||
m_bAttached = true;
|
||
|
||
AttachSkyBox();
|
||
}
|
||
//------------------------------------------------------------------------
|
||
void CameraComponent::DetachCamera()
|
||
{
|
||
if ( !m_bAttached )
|
||
{
|
||
return;
|
||
}
|
||
|
||
const GPtr<GraphicSystem>& gs = GraphicsFeature::Instance()->GetGraphicSystem();
|
||
n_assert( gs.isvalid() );
|
||
if ( gs.isvalid() )
|
||
{
|
||
m_camera->Discard();
|
||
m_camera->SetRenderScene(NULL);
|
||
//m_camera->SetOwner(NULL);
|
||
}
|
||
|
||
|
||
m_bAttached = false;
|
||
|
||
DetachSkyBox();
|
||
}
|
||
|
||
void CameraComponent::SetCullMarkID(CullMarkID id)
|
||
{
|
||
//m_cullMarkID = id;
|
||
RenderLayer rl = RenderLayerConverter::Convert(id);
|
||
if (m_camera.isvalid())
|
||
{
|
||
m_camera->SetCullMask(rl);
|
||
}
|
||
}
|
||
|
||
void CameraComponent::AttachSkyBox()
|
||
{
|
||
}
|
||
|
||
void CameraComponent::DetachSkyBox()
|
||
{
|
||
const GPtr<GraphicSystem>& gs = GraphicsFeature::Instance()->GetGraphicSystem();
|
||
n_assert( gs.isvalid() );
|
||
}
|
||
|
||
bool CameraComponent::IsUseSkyBox(void)
|
||
{
|
||
return m_bUseSkyBox;
|
||
}
|
||
|
||
void CameraComponent::SetUseSkyBox(bool useSkyBox)
|
||
{
|
||
}
|
||
|
||
|
||
|
||
void CameraComponent::SetRenderCustom( bool custom )
|
||
{
|
||
if (m_camera.isvalid())
|
||
{
|
||
m_camera->SetUseCustomMaterial(custom);
|
||
}
|
||
}
|
||
|
||
bool CameraComponent::IsRenderCustom()
|
||
{
|
||
if (m_camera.isvalid())
|
||
{
|
||
return m_camera->IsRenderCustom();
|
||
}
|
||
return false;
|
||
}
|
||
|
||
void CameraComponent::SetRenderNormal( bool normal )
|
||
{
|
||
if (m_camera.isvalid())
|
||
{
|
||
m_camera->SetRenderNormal(normal);
|
||
}
|
||
}
|
||
|
||
bool CameraComponent::IsRenderNormal()
|
||
{
|
||
if (m_camera.isvalid())
|
||
{
|
||
return m_camera->IsRenderNormal();
|
||
}
|
||
return false;
|
||
}
|
||
|
||
void CameraComponent::SetRenderDepth( bool RenderDepth )
|
||
{
|
||
if (m_camera.isvalid())
|
||
{
|
||
m_camera->SetRenderDepth(RenderDepth);
|
||
}
|
||
}
|
||
|
||
bool CameraComponent::IsRenderDepth()
|
||
{
|
||
if (m_camera.isvalid())
|
||
{
|
||
return m_camera->IsRenderDepthMap();
|
||
}
|
||
return false;
|
||
}
|
||
|
||
void CameraComponent::SetRenderToTexture( const GPtr<Graphic::RenderToTexture>& rtt )
|
||
{
|
||
if (m_camera.isvalid())
|
||
{
|
||
return m_camera->SetRenderToTexture(rtt);
|
||
}
|
||
}
|
||
|
||
void CameraComponent::SetPerspectiveFovRH( float fov, float aspect, float zNear, float zFar )
|
||
{
|
||
|
||
m_camera->SetPerspectiveFovRH(fov, aspect, zNear, zFar);
|
||
}
|
||
|
||
void CameraComponent::SetPerspectiveFovRHEx( float fov, float aspect, float zNear, float zFar,const Math::float4& clipPlane, bool reflection )
|
||
{
|
||
m_camera->SetPerspectiveFovRH(fov, aspect, zNear, zFar, clipPlane, reflection);
|
||
}
|
||
|
||
bool
|
||
CameraComponent::IsAllResourceLoaded()
|
||
{
|
||
return true;
|
||
}
|
||
|
||
void
|
||
CameraComponent::SetupAllResource()
|
||
{
|
||
return;
|
||
}
|
||
|
||
}; // namespace GraphicsFeature
|