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

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

?? cvtrnsfm.cpp

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

    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 computation of transforms of a VRML QV tree
	(currently assumes Intel 3DR.)

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

// $Header: /home/cvs/chaco/modules/client/msw/ChGraphx/CvTrnsfm.cpp,v 2.17 1996/06/27 03:44:18 jimd Exp $

#include "grheader.h"
//
#if defined( CH_ARCH_16 )
#include <QvElemnt.h>   
#else
#include <QvElement.h>   
#endif
#include <QvNodes.h>
#include <QvState.h>
#if defined( CH_ARCH_16 )
#include <UnknNode.h>   
#else
#include <QvUnknownNode.h>
#endif
#ifdef CH_MSW
#include <windows.h>
#endif
#ifdef HUGE
#undef HUGE
#endif
#include <math.h>
#include <strstrea.h>
#include "ChMaze.h"
#include "CvTrnsfm.h"
#include "CvConvrt.h"

void GetTransform(QvMatrixTransform *pNode, GxTransformF_t& mat)
{
	Qv2Native(pNode->matrix, mat);
}

void GetTransform(QvRotation *pNode, GxTransformF_t& mat)
{
	RotationMatrix(pNode->rotation.axis[0], 
					pNode->rotation.axis[1],
					pNode->rotation.axis[2],
					pNode->rotation.angle,
					mat);
}

void GetTransform(QvScale *pNode, GxTransformF_t& mat)
{
	ScalingMatrix(pNode->scaleFactor.value[0],
				  pNode->scaleFactor.value[1],
				  pNode->scaleFactor.value[2],
				  mat);
}
    
void GetTransform(QvTransform *pNode, GxTransformF_t& mat)
{
										/* The VRML 1.0 spec (5/26/95) states:
										
										"The transform node 

										Transform {
										    translation T1
										    rotation R1
										    scaleFactor S
										    scaleOrientation R2
										    center T2
										  }

										is equivalent to the sequence 

										Translation { translation T1 }
										Translation { translation T2 }
										Rotation { rotation R1 }
										Rotation { rotation R2 }
										Scale { scaleFactor S }
										Rotation { rotation -R2 }
										Translation { translation -T2 }"
										
										*/
	// We accumulate the matrix in mat by multiplying by each step. Note the
	// use of mat and tmpMat alternates in each step.
	GxTransformF_t stepMat, tmpMat;

		// T1	=> mat
	TranslationMatrix (pNode->translation.value[0], pNode->translation.value[1], pNode->translation.value[2], mat );

		// T2	=> tmpMat
	TranslationMatrix (pNode->center.value[0], pNode->center.value[1], pNode->center.value[2], stepMat );
	ComposeMatrix(mat, stepMat, tmpMat);
	
		// R1	=> mat	
	RotationMatrix(pNode->rotation.axis[0], 
			pNode->rotation.axis[1],
			pNode->rotation.axis[2],
			pNode->rotation.angle,
			stepMat);
	ComposeMatrix(tmpMat, stepMat, mat);

		// R2	=> tmpMat
	RotationMatrix(pNode->scaleOrientation.axis[0], 
			pNode->scaleOrientation.axis[1],
			pNode->scaleOrientation.axis[2],
			pNode->scaleOrientation.angle,
			stepMat);
	ComposeMatrix(mat, stepMat, tmpMat);

		// S	=> mat
	ScalingMatrix (pNode->scaleFactor.value[0], pNode->scaleFactor.value[1], pNode->scaleFactor.value[2], stepMat );
	ComposeMatrix(tmpMat, stepMat, mat);

		// -R2	=> tmpMat
	RotationMatrix(pNode->scaleOrientation.axis[0], 
			pNode->scaleOrientation.axis[1],
			pNode->scaleOrientation.axis[2],
			-pNode->scaleOrientation.angle,
			stepMat);
	ComposeMatrix(mat, stepMat, tmpMat);

		// -T2	=> mat
	TranslationMatrix (-pNode->center.value[0], -pNode->center.value[1], -pNode->center.value[2], stepMat );
	ComposeMatrix(tmpMat, stepMat, mat);
}

void GetTransform(QvTranslation *pNode, GxTransformF_t& mat)
{
	TranslationMatrix(pNode->translation.value[0],
					  pNode->translation.value[1],
					  pNode->translation.value[2],	
					  mat);
}

bool GetTransform(QvElement *elt, GxTransformF_t& eltMat)
{
	bool	boolHasMatrix;
	switch(elt->type)
	{
		case QvElement::MatrixTransform:
		{	
			GetTransform((QvMatrixTransform *)(elt->data), eltMat);
			boolHasMatrix = true;
			break;
		}
		case QvElement::Rotation:
		{
			GetTransform((QvRotation *)(elt->data), eltMat);
			boolHasMatrix = true;
			break;
		}
		case QvElement::Scale:
		{
			GetTransform((QvScale *)(elt->data), eltMat);
			boolHasMatrix = true;
			break;
		}
		case QvElement::Transform:
		{
			GetTransform((QvTransform *)(elt->data), eltMat);
			boolHasMatrix = true;
			break;
		}
		case QvElement::Translation:
		{
			GetTransform((QvTranslation *)(elt->data), eltMat);
			boolHasMatrix = true;
			break;
		}
		default:
		{
			boolHasMatrix = false;
			break;
		}
	}
	return boolHasMatrix;
}

void normalize(float &x, float &y, float &z)
{
	float sum = x * x + y * y + z * z;
	sum = sqrt(sum);
	x /= sum;	y /= sum;	z /= sum;
}

void RotateMatrix( float angle, float x, float y, float z, GxTransformF_t mat)
{
#if defined(CH_USE_3DR)
	float aBit = .001;
	float eps = aBit;

	if (fabs(x) < eps && fabs(z) < eps  )
	{
		float sum, sum2;
		x += aBit;
		sum2 = x * x + y * y + z * z;
		sum = sqrt(sum2);
		x /= sum;	y /= sum;	z /= sum;
	}
		
	G3dRotateMatrix( angle, x, y, z, mat);
#else
	float c = cos(angle);
	float s = sin(angle);
	float t = 1.0 - c;

	//normalize(x, y, z);	assume normalized
    
    mat[0][0] = 	t * x * x + c;
	mat[1][0] = 	t * x * y - s * z;
	mat[2][0] = 	t * x * z + s * y;
	mat[3][0] = 	0.0;

	mat[0][1] = 	t * x * y + s * z;
	mat[1][1] = 	t * y * y + c;
	mat[2][1] = 	t * y * z - s * x;
	mat[3][1] = 	0.0;

	mat[0][2] = 	t * x * z - s * y;
	mat[1][2] = 	t * y * z + s * x;
	mat[2][2] = 	t * z * z + c;
	mat[3][2] = 	0.0;

	mat[0][3] = 	0.0; 
	mat[1][3] = 	0.0; 
	mat[2][3] = 	0.0; 
	mat[3][3] = 	1.0;

#endif
}



void TranslationMatrix(float fX, float fY, float fZ, GxTransformF_t& mat)
{
	GxTransform3Wf::IdentityMatrix(mat);
#if defined(CH_USE_3DR)
	mat[0][3] = fX;
	mat[1][3] =	fY;
	mat[2][3] = fZ;
#else
	mat[3][0] = fX;		   
	mat[3][1] =	fY;		   
	mat[3][2] = fZ;		   
#endif
}

void ScalingMatrix(float fX, float fY, float fZ, GxTransformF_t& mat)
{
	GxTransform3Wf::IdentityMatrix(mat);
	mat[0][0] = fX;
	mat[1][1] = fY;
	mat[2][2] = fZ;
}

void RotationMatrix(float fAxisX, float fAxisY, float fAxisZ, float fAngle, GxTransformF_t& mat)
{
	// This takes into account the difference between vrml and 3dr's sense of rotation
	GxVec3f axis;

	axis.set( fAxisX, fAxisY, fAxisZ);
	if (axis.dot(axis) < 1e-12)
	{
		axis.set( 0, 0, 1);
	}
	axis.normalize();
	#if (defined(CH_USE_RLAB) || defined(CH_USE_D3D))
	fAngle = -fAngle;
	#endif
						   // for other renderers??? TODO
	RotateMatrix(-fAngle, 	
					axis.x(),
					axis.y(),
					axis.z(),
					mat);
}

#if defined(CH_USE_3DR)
void TransformPoint( const PointFW_t &src, PointF_t &dst, GxTransformF_t& mat )
{
	PointFW_t tmp;
	PointF_t tmps;
	CopyPoint(src, tmps);
	G3dTransformPointF( &tmps, &tmp, mat );
	CopyPoint(tmp, dst);
}
void TransformPoint( const PointFW_t &src, PointFW_t &dst, GxTransformF_t& mat )
{
	PointF_t tmps;
	CopyPoint(src, tmps);
	G3dTransformPointF( &tmps, &dst, mat );
}
void TransformPoint( const PointF_t &src, PointF_t &dst, GxTransformF_t& mat )
{
	PointFW_t tmp;
	G3dTransformPointF( (PointF_t*)&src, &tmp, mat );
	CopyPoint(tmp, dst);
}
void TransformPoint( const PointF_t &src, PointFW_t &dst, GxTransformF_t& mat )
{
	G3dTransformPointF( (PointF_t*)&src, &dst, mat );
}
#endif // defined(CH_USE_3DR)


void AccumQVTransform( QvState * qvState, GxTransformF_t& mat)
{

	QvElement *	top = qvState->getTopElement(QvState::TransformationIndex); 
	QvElement *	elt;
	GxTransformF_t eltMat, tmpMat;
	bool	boolHasMatrix;

	GxTransform3Wf::IdentityMatrix(mat);

	for( elt = top; elt; elt = elt->next )
	{
		boolHasMatrix = GetTransform(elt, eltMat);
		if(boolHasMatrix)
		{
			ComposeMatrix(eltMat, mat, tmpMat);		 // premult because of inside out order
			#if ( _MSC_VER == 900	 )	 
			GxTransform3Wf::CopyMatrix( tmpMat, mat);				 // walking down stack
			#else
			GxTransform3Wf::CopyMatrix((const float(*)[4])tmpMat, mat);				 // walking down stack
			#endif
		}
	}

}



#if 0
// Obsolete ??
void ComputeCameraOrientation( float pan, float tilt, float &axisX, float &axisY, float &axisZ, float &angle );
void ComputePanAndTilt( float &pan, float &tilt, float axisX, float axisY, float axisZ, float angle );

// Based on pan and tilt, compute the transform for vrml
void ComputeCameraOrientation( float pan, float tilt, float &axisX, float &axisY, float &axisZ, float &angle )
{
	PointF_t	dir, axis;
	PointF_t 	dirZ = {0.0f, 0.0f, -1.0f};
	PointFW_t 	tmp;
 	GxTransformF_t mat;

	RotationMatrix(1, 0, 0, tilt, mat);
	G3dTransformPointF( &dirZ, &tmp, mat );
	CopyPoint(tmp, dir);
	RotationMatrix(0, 1, 0, pan, mat);
	G3dTransformPointF( &dir, &tmp, mat );
	CopyPoint(tmp, dir);

 	G3dCross(&dirZ, &dir, &axis);

	if (G3dDot(&axis, &axis) < 1e-12)
	{
		axis.x = 0; axis.y = 1; axis.z = 0;
	}
	G3dUnitVector(&axis);

	float cosa = G3dDot(&dirZ, &dir);	// both were unit vectors before
	angle = acos(cosa);
	axisX = axis.x;
	axisY = axis.y;
	axisZ = axis.z;
}
#if !defined(PI)
#define PI 3.1415927
#endif
// Based on transform for vrml, compute the pan and tilt
void ComputePanAndTilt( float &pan, float &tilt, float axisX, float axisY, float axisZ, float angle )
{
	PointF_t	dir;
	PointF_t 	dirZ = {0.0f, 0.0f, -1.0f};
	PointF_t 	dirY = {0.0f, 1.0f, 0.0f};
	PointFW_t 	tmp;
 	GxTransformF_t mat;

	RotationMatrix(axisX, 
				axisY,
				axisZ,
				angle,
				mat);
	G3dTransformPointF( &dirZ, &tmp, mat );
	CopyPoint(tmp, dir);

	tilt = asin(dir.y);

	if (fabs(tilt) < 1e-2) tilt = 0;	// make up for round off creep
	if( fabs(1. - fabs(dir.y)) > 1e-4)
	{
		pan = atan2( dir.x, dir.z ) + PI;
		if(pan > PI) pan -= PI + PI;
	}
	else
	{
		pan = atan2( -axisZ, axisX ) + PI;
		if(pan > PI) pan -= PI + PI;
	}
}
#endif
// end of file

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99久久99久久精品免费观看| 粉嫩av一区二区三区在线播放| 久久综合狠狠综合久久综合88 | 亚洲小少妇裸体bbw| 日韩欧美卡一卡二| 91香蕉视频mp4| 韩国精品久久久| 亚洲国产综合色| 国产精品少妇自拍| 日韩一区二区免费视频| 色综合久久九月婷婷色综合| 国产在线视频一区二区三区| 亚洲成人一区在线| 亚洲色图欧美偷拍| 久久精品一区二区三区不卡| 欧美久久一二三四区| 99re66热这里只有精品3直播| 久久福利视频一区二区| 亚洲图片欧美色图| 亚洲色图欧洲色图婷婷| 国产欧美日韩在线| 久久美女艺术照精彩视频福利播放| 精品污污网站免费看| kk眼镜猥琐国模调教系列一区二区| 九色综合国产一区二区三区| 首页综合国产亚洲丝袜| 亚洲综合在线视频| 亚洲人123区| 欧美国产精品劲爆| 久久精品一区二区三区四区| 日韩免费视频线观看| 欧美久久久一区| 欧美中文字幕一区| 色综合久久66| 色94色欧美sute亚洲线路二| 99久久综合国产精品| 成人国产免费视频| 成人app网站| 波多野结衣中文字幕一区 | 国产一区999| 精品系列免费在线观看| 美女一区二区三区在线观看| 舔着乳尖日韩一区| 日产精品久久久久久久性色| 天天综合天天综合色| 丁香婷婷综合网| 国产成人精品一区二区三区四区 | 日本二三区不卡| 色综合久久久久综合| 欧洲精品一区二区三区在线观看| 在线视频一区二区三区| 欧美亚洲高清一区| 欧美情侣在线播放| 欧美一区二区在线不卡| 日韩精品影音先锋| 久久综合久久99| 欧美高清在线精品一区| 亚洲天堂成人网| 亚洲va欧美va人人爽| 久久精品国产精品亚洲红杏| 国产麻豆精品95视频| 国产成人小视频| 91啪亚洲精品| 制服丝袜激情欧洲亚洲| 久久综合久久综合亚洲| 国产日韩高清在线| 一区二区三区在线观看国产| 天堂成人国产精品一区| 久久99久久久欧美国产| 成人丝袜18视频在线观看| 色哟哟一区二区在线观看| 欧美一区在线视频| 国产三级精品视频| 亚洲一区二区av电影| 久久精品国产亚洲aⅴ| 暴力调教一区二区三区| 欧美性色黄大片手机版| 欧美大片顶级少妇| 综合av第一页| 蜜桃av一区二区三区电影| 懂色av中文一区二区三区| 欧美调教femdomvk| 久久久91精品国产一区二区三区| 亚洲欧美经典视频| 蜜桃视频第一区免费观看| 不卡一区二区中文字幕| 欧美欧美欧美欧美| 欧美国产成人在线| 日产精品久久久久久久性色| 成人美女视频在线看| 91精品免费在线观看| 国产精品国模大尺度视频| 日韩精品欧美精品| 91在线无精精品入口| 欧美刺激午夜性久久久久久久| 最新国产精品久久精品| 久久99国产精品免费| 在线观看免费一区| 国产午夜精品一区二区三区嫩草 | 一本久久a久久精品亚洲| 欧美成人一区二区| 亚洲精品菠萝久久久久久久| 国产一区二区精品在线观看| 欧美日韩专区在线| 国产精品久久久久一区| 麻豆视频观看网址久久| 欧美性大战久久久| 日韩毛片视频在线看| 精品无人码麻豆乱码1区2区 | 欧美色综合网站| 亚洲成av人片在线观看无码| 99久久99精品久久久久久| 欧美精品一区男女天堂| 丝瓜av网站精品一区二区| 91香蕉视频黄| 国产精品久久99| 国产成人免费在线视频| 日韩三级在线观看| 丝袜脚交一区二区| 欧美日韩一二三| 亚洲专区一二三| 色综合天天做天天爱| 国产精品免费久久久久| 国产精品一二一区| 精品国产免费久久| 免费观看日韩电影| 91精品国产高清一区二区三区蜜臀 | 国产麻豆精品一区二区| 欧美一级在线观看| 丝袜脚交一区二区| 欧美日韩高清一区二区| 亚洲一区二区三区四区五区黄| 99久久婷婷国产综合精品| 中文字幕av资源一区| 大白屁股一区二区视频| 国产午夜亚洲精品不卡| 国产电影一区二区三区| 久久久蜜桃精品| 国产精品资源网站| 国产视频在线观看一区二区三区| 国内精品在线播放| 久久一日本道色综合| 国产在线精品一区二区三区不卡| 26uuu欧美| 国产成人在线观看| 国产精品久久看| 色综合中文综合网| 色又黄又爽网站www久久| 亚洲美腿欧美偷拍| 在线中文字幕不卡| 亚洲va天堂va国产va久| 91精品国产综合久久精品麻豆| 日本伊人色综合网| 精品国产免费人成在线观看| 国产激情一区二区三区桃花岛亚洲| 久久精品欧美一区二区三区麻豆| 丁香亚洲综合激情啪啪综合| 亚洲人成网站色在线观看| 在线免费观看成人短视频| 午夜视黄欧洲亚洲| 日韩亚洲欧美综合| 国产精品一二三四五| 亚洲欧美在线视频观看| 欧美吞精做爰啪啪高潮| 久久99国内精品| 国产精品视频免费看| 91成人看片片| 麻豆国产欧美一区二区三区| 精品国产乱子伦一区| av在线不卡观看免费观看| 一区二区三区免费看视频| 91精品午夜视频| 国产高清在线精品| 亚洲自拍与偷拍| 日韩精品一区二区三区四区 | 日韩精品中文字幕一区| 成人午夜av电影| 亚洲国产va精品久久久不卡综合 | 久久亚洲精品小早川怜子| jvid福利写真一区二区三区| 亚洲成va人在线观看| 久久九九影视网| 欧美无乱码久久久免费午夜一区| 国产在线一区观看| 亚洲一区成人在线| 国产拍揄自揄精品视频麻豆| 久久精品夜色噜噜亚洲a∨| 欧洲一区在线观看| 国产毛片精品一区| 天堂蜜桃91精品| 中文字幕中文字幕中文字幕亚洲无线 | 精品影视av免费| 亚洲免费大片在线观看| 久久久久国产精品厨房| 欧美伊人久久大香线蕉综合69| 国产一区二区导航在线播放| 亚洲一二三四在线| 国产精品久久综合| 日韩亚洲欧美中文三级| 91久久精品国产91性色tv|