亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? cvcamera.cpp

?? Windows上的MUD客戶端程序
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
/*----------------------------------------------------------------------------
                        _                              _ _       
        /\             | |                            | (_)      
       /  \   _ __   __| |_ __ ___  _ __ ___   ___  __| |_  __ _ 
      / /\ \ | '_ \ / _` | '__/ _ \| '_ ` _ \ / _ \/ _` | |/ _` |
     / ____ \| | | | (_| | | | (_) | | | | | |  __/ (_| | | (_| |
    /_/    \_\_| |_|\__,_|_|  \___/|_| |_| |_|\___|\__,_|_|\__,_|

    The contents of this file are subject to the Andromedia Public
	License Version 1.0 (the "License"); you may not use this file
	except in compliance with the License. You may obtain a copy of
	the License at http://www.andromedia.com/APL/

    Software distributed under the License is distributed on an
	"AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
	implied. See the License for the specific language governing
	rights and limitations under the License.

    The Original Code is Pueblo client code, released November 4, 1998.

    The Initial Developer of the Original Code is Andromedia Incorporated.
	Portions created by Andromedia are Copyright (C) 1998 Andromedia
	Incorporated.  All Rights Reserved.

	Andromedia Incorporated                         415.365.6700
	818 Mission Street - 2nd Floor                  415.365.6701 fax
	San Francisco, CA 94103

    Contributor(s):
	--------------------------------------------------------------------------
	   Chaco team:  Dan Greening, Glenn Crocker, Jim Doubek,
	                Coyote Lussier, Pritham Shetty.

					Wrote and designed original codebase.

------------------------------------------------------------------------------

	Implementation for the ChQvPCameraRenderData class for  Intel 3DR and 
	Microsoft's RealityLab.

----------------------------------------------------------------------------*/

// $Header: /home/cvs/chaco/modules/client/msw/ChGraphx/CvCamera.cpp,v 2.27 1996/10/03 21:46:12 jimd Exp $

#include "grheader.h"

#include <QvInfo.h>
#include <QvState.h>
#include "ChMaze.h"
#include "CvConvrt.h"
#include "CvTrnsfm.h"
#include "CvNormal.h"
#include "CvInstnc.h"
#include "CvType.h"
#include "CvBound.h"
#include "ChRenderData.h"
#include "GxQuaternion.h"

#include "ChVrmlTransition.h"


ChQvPCameraRenderData::ChQvPCameraRenderData(QvPerspectiveCamera *pCamera, ChQvBuildState* state ) : 
	ChQvRenderBaseData(),
	m_boolPerspective(true), 
	m_pCamera(pCamera),
	m_boolNew(true),
	m_boolSynchEnabled(true)
{
#if defined(CH_VRML_EVENTS)
	if(!m_pDispatcher)
	{
		m_pDispatcher = new	ChVrmlDispatcher;
		Init();
	}
#endif
	Attach(pCamera);
	m_strName = MakeName(state);
	ChRenderContext *pRC = ((ChQvState*)state)->GetView()->GetRenderContext();
	m_pRC = pRC;
	#if (defined(CH_USE_RLAB) || defined(CH_USE_D3D))
	m_transform = m_pRC->GetModelTransform();
	#endif

	#if 1
	if(!m_strName.IsEmpty()) pRC->AddCamera(pCamera, m_strName);
	#endif
}

ChQvPCameraRenderData::ChQvPCameraRenderData(QvOrthographicCamera *pCamera, ChQvBuildState* state ) : 
	ChQvRenderBaseData(),
	m_boolPerspective(false), 
	m_pCamera((QvPerspectiveCamera *)((QvNode*)pCamera)),
	m_boolNew(true),
	m_boolSynchEnabled(true)
{
#if defined(CH_VRML_EVENTS)
	if(!m_pDispatcher)
	{
		m_pDispatcher = new	ChVrmlDispatcher;
		Init();
	}
#endif
	Attach(pCamera);
	m_strName = MakeName(state);
	ChRenderContext *pRC = ((ChQvState*)state)->GetView()->GetRenderContext();
	m_pRC = pRC;
	#if (defined(CH_USE_RLAB) || defined(CH_USE_D3D))
	m_transform = m_pRC->GetModelTransform();
	#endif
	pRC->AddCamera(pCamera, m_strName);
}

ChQvPCameraRenderData::~ChQvPCameraRenderData()
{
#if 1
	//if(!m_strName.IsEmpty()) m_pRC->RemoveCamera(m_strName);
#endif
}

void ChQvPCameraRenderData::Init()
{
	ChQvRenderBaseData::Init();
#if defined(CH_VRML_EVENTS)

	AddVrmlDispatcher("set_orientation", SFRotation, OnSetOrientation);
	AddVrmlDispatcher("set_position", SFVec3f, OnSetPosition);

#endif

};


void ChQvPCameraRenderData::Term()
{
#if defined(CH_VRML_EVENTS)
	delete m_pDispatcher;
	m_pDispatcher = 0;
#endif
}

void ChQvPCameraRenderData::SetDirty(bool boolDirty)
{
	ChQvRenderBaseData::SetDirty(boolDirty);
#if 1
	if(boolDirty && IsSynchEnabled())
	{
		Synch();
		if(m_pRC && m_pNode == m_pRC->GetCurrentCamera())
		{
			SetRenderer();

				// And set the context dirty
			m_pRC->SetDirty();
		}
	}
	//ChQvRenderBaseData::SetDirty(false);
#endif
} 


ChQvPCameraRenderData *ChQvPCameraRenderData::SetLoc(GxVec3f &loc)
{
	m_loc = loc;
	// Notify window that we moved
	if(m_pRC->GetCurrentCamera() == GetNode())
	{
		((ChMazeWnd*)(m_pRC->GetWnd()))->OnCameraChange(ChMazeWnd::cameraMoved);
	}
	return this;
};
ChQvPCameraRenderData *ChQvPCameraRenderData::SetDir(GxVec3f &dir)
{
	m_dir = dir; 
	// Notify window that we turned
	if(m_pRC->GetCurrentCamera() == GetNode())
	{
		((ChMazeWnd*)(m_pRC->GetWnd()))->OnCameraChange(ChMazeWnd::cameraTurned);
	}
	return this;
};

ChQvPCameraRenderData *ChQvPCameraRenderData::SetUp(GxVec3f &up)
{
	m_up = up; 
	// Notify window that we turned
	if(m_pRC->GetCurrentCamera() == GetNode())
	{
		((ChMazeWnd*)(m_pRC->GetWnd()))->OnCameraChange(ChMazeWnd::cameraTurned);
	}
	return this;
};

GxTransform3Wf ChQvPCameraRenderData::GetTransform()
{
	return GxTransform3Wf(m_cameraTransform);
}
GxTransform3Wf ChQvPCameraRenderData::GetInverseTransform()
{
	#if defined(CH_USE_3DR)
	return GxTransform3Wf(m_invCameraTransform);
	#else
	return m_cameraTransform.Inverse();
	#endif
}

GxTransform3Wf ChQvPCameraRenderData::GetClipTransform()
{
	return GxTransform3Wf(m_camClipTransform);
}




string ChQvPCameraRenderData::MakeName(ChQvBuildState* state)
{
	string name;
	QvNode * pParentNode = 0;
	ChQvGroupInstance *pParentInst = state->GetCurrentParent();
	if(pParentInst)
	{
		pParentNode = pParentInst->GetNode();
	}
	#if 1
	if(pParentNode)
	{
		string strType;
		if(pParentNode->GetType(strType) == typeQvSwitch && pParentNode->getName() == "Cameras")
		{
			name = (char *)(m_pNode->getName().getString());
			if(name.IsEmpty())
			{
				ChRenderContext *pRC = ((ChQvState*)state)->GetView()->GetRenderContext();
				name.Format("Camera %d", pRC->GetCameraCount());
			}
		}
	}
	#else
	string prefix;

	if(pParentNode)
	{
		string strType;
		if(pParentNode->GetType(strType) == typeQvSwitch)
		{
			if(pParentNode->getName() == "Cameras") prefix = "Cameras:";
		}
	}
	name = prefix + (char *)(m_pNode->getName().getString());
	if(name.IsEmpty())
	{
		ChRenderContext *pRC = ((ChQvState*)state)->GetView()->GetRenderContext();
		name.Format("Camera %d", pRC->GetCameraCount());
	}
	#endif

	return name;
}

ChQvPCameraRenderData * ChQvPCameraRenderData::Reset()
{
	SetLoc(m_startLoc);
	SetDir(m_startDir);
	SetUp (m_startUp);
	return this;
}

void ChQvPCameraRenderData::SynchCamera()		  // Set camera node fields to agree with this
{
	if(m_boolPerspective)
	{
		EnableSynch(false);	// turn off to prevent redundant computation
		QvPerspectiveCamera *pCamera = (QvPerspectiveCamera*)((QvNode*)m_pCamera);

		pCamera->position.setValue(&m_loc);

		GxVec3f 	dirZ (0.0f, 0.0f, -1.0f);
		GxVec3f	axis;
		float angle;

		#if (!defined(CH_VRML_VIEWER) && !defined(CH_VRML_PLUGIN )) || defined(CH_VRML_EVENTS)

		GxQuaternion quat(m_dir, m_up);
		quat.AxisAngle(axis, angle);

		axis.normalize();
		#else
		// We don't really need this except for Pueblo or VRML 2.0, so do it lazy
		// The quaternion code takes longer. This way doesn't pay attention to up
		// but if we don't use it who cares? Do the same thing for ortho camera
		// later too.
		axis = dirZ.cross(m_dir);
		if (axis.dot(axis) < 1e-12)
		{
			axis.set( 0, 1, 0);
		}
		axis.normalize();
		float cosa = dirZ.dot(m_dir);	// both were unit vectors before
		angle = acos(cosa);
		#endif

		float orient[4];
		orient[0] = axis.x();
		orient[1] = axis.y();
		orient[2] = axis.z();
		orient[3] = angle;
		pCamera->orientation.setValue(orient);

		EnableSynch();

}
	else
	{
		QvOrthographicCamera *pCamera = (QvOrthographicCamera*)((QvNode*)m_pCamera);
		pCamera->position.value[0] = m_loc.x();
		pCamera->position.value[1] = m_loc.y();
		pCamera->position.value[2] = m_loc.z();
		GxVec3f 	dirZ(0.0f, 0.0f, -1.0f);
		GxVec3f	axis;
		float angle;

		#if (!defined(CH_VRML_VIEWER) && !defined(CH_VRML_PLUGIN )) || defined(CH_VRML_EVENTS)

		GxQuaternion quat(m_dir, m_up);
		quat.AxisAngle(axis, angle);

		axis.normalize();
		#else
		axis = dirZ.cross(m_dir);
		if (axis.dot(axis) < 1e-12)
		{
			axis.set( 0, 1, 0);
		}
		axis.normalize();
		float cosa = dirZ.dot(m_dir);	// both were unit vectors before
		angle = acos(cosa);
		#endif

		pCamera->orientation.axis[0] = axis.x();
		pCamera->orientation.axis[1] = axis.y();
		pCamera->orientation.axis[2] = axis.z();

		pCamera->orientation.angle = angle;
	}
#if (defined(CH_USE_RLAB) || defined(CH_USE_D3D))
	SetRenderer();
#endif
}	

void ChQvPCameraRenderData::Synch()		  // Set this' fields to agree with camera node
{
	GxVec3f	up, yAxis(0.0f, 1.0f, 0.0f);		// starting loc for look dirs
	GxVec3f	dir, dira(0.0f, 0.0f, -1.0f);		// will rotate later
	GxVec3f 	loc, axis;
	float angle;

	// Get the node's data; be safe about it
	if(m_boolPerspective)
	{
		QvPerspectiveCamera *pCamera = (QvPerspectiveCamera*)((QvNode*)m_pCamera);
		Qv2Gx(pCamera->position, loc);
		Qv2Gx(pCamera->orientation.axis, axis);
		angle = pCamera->orientation.angle;
	}
	else
	{
		QvOrthographicCamera *pCamera = (QvOrthographicCamera*)((QvNode*)m_pCamera);
		Qv2Gx(pCamera->position, loc);
		Qv2Gx(pCamera->orientation.axis, axis);
		angle = pCamera->orientation.angle;
	}

	angle = -angle;


	// Inventor puts the camera in transformed world (model) coordinates,
	// RLAB's camera is in the base frame. Apply our stack transform to the 
	// frame, then apply the camera loc and direction. 
	// Remember VRML is RHS, but RLab is LHS

	GxTransform3Wf	stackMat = m_transform;
	GxTransform3Wf	rotMat(axis, -angle);

										  
	GxTransform3Wf cameraMat = rotMat;		  // up/down has nothing to do with the transform jwd 12/7/95

	dir = cameraMat * dira;
	dir.normalize();

	if(m_pRC->GetViewerMode() != walk )
	{
		up  = cameraMat * yAxis;
	}
	else						// We're walking; keep camera level
	{							// This computation is not pure VRML,
								// but it keeps camera manipulations much cleaner for
								// walking situations. The camera acts more camera-like 
								// and less airplane-like.

		GxVec3f n = yAxis.cross(dir);				// normal to plane defined by (dir, yaxis)

		if (n.dot(n) > SMIDGEON)
		{
			up = dir.cross(n);
		}
		else
		{
			// special case; looking straight up or down
			up  = cameraMat * yAxis;
		} 

		if (up.dot(up) < SMIDGEON)
		{
			up = yAxis;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91久久一区二区| 极品少妇一区二区三区精品视频| 国产ts人妖一区二区| 久久亚区不卡日本| 成人性视频免费网站| 国产精品久久久久三级| 99精品视频在线观看免费| 亚洲伦在线观看| 欧美日韩免费电影| 久久国产三级精品| 中文字幕一区二区三| 欧美视频日韩视频| 免费高清成人在线| 国产精品免费网站在线观看| 欧美在线不卡视频| 精品综合久久久久久8888| 国产精品美女久久久久久久久久久| 一本久久精品一区二区| 蜜臀va亚洲va欧美va天堂| 亚洲国产经典视频| 欧美婷婷六月丁香综合色| 韩国精品免费视频| 亚洲人成网站在线| 日韩欧美国产麻豆| www.欧美日韩| 日韩中文字幕91| 国内不卡的二区三区中文字幕| 一区二区三区四区高清精品免费观看 | 国产日韩视频一区二区三区| 成人高清视频免费观看| 一区二区高清在线| 久久这里只有精品视频网| 色婷婷综合久久久久中文| 另类专区欧美蜜桃臀第一页| 亚洲私人影院在线观看| 日韩一级完整毛片| 一本大道av一区二区在线播放| 蜜臀久久99精品久久久久久9| 国产精品二三区| 欧美成人a在线| 色综合久久久久综合体桃花网| 免费在线视频一区| 亚洲欧美偷拍卡通变态| 久久综合久久鬼色中文字| 欧美亚洲国产一卡| 成人蜜臀av电影| 久久精品国产久精国产爱| 亚洲区小说区图片区qvod| 国产亚洲精品中文字幕| 欧美一区二区三区系列电影| 91捆绑美女网站| 国产精品99久久久久久有的能看 | 国产精品美女久久久久久久| 欧美理论在线播放| 色综合久久天天| 成人91在线观看| 国产成人一区二区精品非洲| 六月丁香综合在线视频| 亚洲成人手机在线| 久久久精品黄色| 丁香婷婷综合色啪| 综合av第一页| 欧美日韩精品专区| 亚洲成a人在线观看| 国产精品视频免费| 国产亚洲精久久久久久| 日韩精品一区二区在线| 7777精品伊人久久久大香线蕉超级流畅 | 亚洲在线观看免费| 综合自拍亚洲综合图不卡区| 国产情人综合久久777777| 日韩欧美高清一区| 在线综合+亚洲+欧美中文字幕| 欧美日韩一级大片网址| 欧美三级视频在线| 欧美色精品天天在线观看视频| 色就色 综合激情| 色综合久久久网| 在线一区二区视频| 欧美伊人久久大香线蕉综合69| 在线观看亚洲a| 欧美视频一区在线观看| 欧美手机在线视频| 欧美福利一区二区| 日韩欧美中文字幕公布| 日韩一二三区视频| 精品久久久网站| 国产日韩欧美在线一区| 中文字幕亚洲电影| 亚洲丝袜精品丝袜在线| 洋洋成人永久网站入口| 午夜激情综合网| 蜜臀久久99精品久久久画质超高清| 久久99精品网久久| 国产一区二区三区精品视频| 国产传媒欧美日韩成人| av中文字幕一区| 欧美亚洲另类激情小说| 日韩午夜精品视频| 国产精品污www在线观看| 最新国产成人在线观看| 亚洲国产综合色| 久久99精品一区二区三区三区| 国产成人亚洲综合a∨婷婷| 色一情一乱一乱一91av| 欧美日韩成人在线| 久久久久99精品一区| 亚洲猫色日本管| 麻豆国产91在线播放| 成人免费视频国产在线观看| 欧美性生交片4| 久久久久久97三级| 亚洲精品国产品国语在线app| 天天色 色综合| 高清免费成人av| 欧美群妇大交群中文字幕| 国产午夜精品一区二区三区四区| 亚洲色图制服丝袜| 黄色资源网久久资源365| 91在线码无精品| 精品国产一二三| 一区二区三区日韩欧美精品| 国产一区二区三区高清播放| 在线亚洲精品福利网址导航| 欧美精品一区二区三区四区| 亚洲精品免费在线播放| 国产剧情在线观看一区二区| 欧美亚洲国产一区在线观看网站| 国产亚洲欧美色| 午夜电影一区二区三区| 成人国产免费视频| 精品久久一区二区三区| 亚洲国产精品久久不卡毛片| 国产成人免费在线观看| 8x8x8国产精品| 中文字幕色av一区二区三区| 久久电影网站中文字幕 | 亚洲成人先锋电影| 不卡av在线免费观看| 日韩欧美色综合网站| 亚洲国产综合在线| 91色.com| 国产嫩草影院久久久久| 久久精品久久精品| 欧美日韩国产电影| 一区二区三区蜜桃| a4yy欧美一区二区三区| 久久九九国产精品| 精品在线一区二区| 51久久夜色精品国产麻豆| 亚洲高清在线视频| 在线观看一区二区视频| 亚洲美女在线国产| 91蝌蚪porny| 国产精品久99| 国产精品一级片| 欧美精品一区二区三区视频| 青青草国产成人av片免费| 欧美男女性生活在线直播观看| 亚洲激情六月丁香| 色乱码一区二区三区88| 亚洲欧美日韩一区二区三区在线观看| 国产91高潮流白浆在线麻豆 | 欧美极品美女视频| 国产高清不卡一区| 国产色综合久久| 国产在线一区二区综合免费视频| 日韩欧美国产小视频| 久久99在线观看| 久久久久97国产精华液好用吗| 国产一区二区导航在线播放| 久久男人中文字幕资源站| 国产一区二区三区四| 中文字幕不卡在线观看| jizzjizzjizz欧美| 一区二区三区国产| 欧美日韩亚洲综合| 蜜臂av日日欢夜夜爽一区| 精品区一区二区| 国产成人精品一区二区三区网站观看| 久久精品无码一区二区三区| 国产精品自拍毛片| 国产精品久久精品日日| 在线免费观看日韩欧美| 视频一区二区三区在线| 日韩免费电影网站| 国产寡妇亲子伦一区二区| **性色生活片久久毛片| 欧美视频日韩视频| 激情综合网激情| 中文字幕电影一区| 欧美色电影在线| 久久精品国产精品亚洲精品 | 一本色道久久综合亚洲精品按摩| 一区二区三区 在线观看视频| 欧美理论在线播放| 国产成人午夜高潮毛片| 亚洲乱码中文字幕综合| 日韩一区二区免费在线电影| 懂色av中文字幕一区二区三区|