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

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

?? cvboundsextent.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 of ChQvInstance::GetBoundsExtent.

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

// $Header: /home/cvs/chaco/modules/client/msw/ChGraphx/CvBoundsExtent.cpp,v 2.1 1996/06/27 03:43:56 jimd Exp $

#include "grheader.h"

#include "CvInstnc.h"
#include <QvInfo.h>
#include <QvState.h>
#include "ChMaze.h"
#include "ChRenderData.h"
#include "ChScriptData.h"
#include "ChMazDep.h"
#include "CvTrnsfm.h"
#include "CvNormal.h"
#include "CvBound.h"
#include "CvConvrt.h"
#include "CvHitTst.h"
#include "imode.h"


/* Get extent of bounds passed in if != 0, or default to bounds of instance */
ChRect ChQvInstance::GetBoundsExtent(ChRenderContext *pRC, ChQvBounds *pBounds, bool *pboolClipped, bool boolBeGenerous)
{
	// boolClipped means -completely- clipped
	// we'll set it to true if anything lies within the viewport
	// If boolBeGenerous is set, put a buffer area around the viewport
	// for clipping purposes. This means nearby things will be flagged as
	// not clipped.
	bool boolClipped = true;

	#if (defined(CH_USE_RLAB) || defined(CH_USE_D3D))
	ASSERT(m_frame);
	ASSERT(pRC);
	ASSERT(pRC->GetViewport());

	ChQvBounds bounds;
	if(pBounds)
	{
		bounds = *pBounds;
	}
	else
	{
		GetBounds(bounds);
	}
	
	// Take bounding cube
	float fpts[8*3];
	GxVec3f *pts = (GxVec3f *)fpts;	 // don't construct! (faster)
	GxVec3f lower, upper;

	bounds.GetBounds(lower, upper);

	for(int j=0; j<8; j++)
	{
		pts[j].set( ((j & 1) ? lower.x() : upper.x()),
					((j & 2) ? lower.y() : upper.y()),
					((j & 4) ? lower.z() : upper.z()));
		
	}
	ChNrViewport view = pRC->GetViewport();

	#if (defined(CH_USE_RLAB))
	 // use immed mode api
	RLIMViewVertex		viewVerts[8];

	RLIMClippingFlag clip = RLIMTransformVertices
    (   view, 
    	m_frame,
        (RLIMPositionVector*)(pts),
        viewVerts,
        sizeof(GxVec3f), 
        sizeof(RLIMViewVertex),
        8,
        1
    );

	boolClipped = true;
								// RLIMTransformVertices doesn't fill
								// in screen coords sometimes
								// if the point is clipped, so use the 
								// homogeneous ones. We'll wait to convert
								// until it's the rect to minimize computations
	for(j=0; j<8; j++)
	{
		float rhw = viewVerts[j].hw;
		if(rhw != 0.0) rhw = 1 / rhw;
		pts[j].set(viewVerts[j].hx * rhw , viewVerts[j].hy * rhw, viewVerts[j].hz * rhw);

		if(boolClipped && pboolClipped)
		{
			if( 0 <= viewVerts[j].hz )	// just check for behind 
			{
				boolClipped = false;
			}
		}
	}
	#elif (defined(CH_USE_D3D))
  	// Transform to screen space
	GxVec3f tmp;
	for(j=0; j<8; j++)
	{
		// first to world
		ChNrFrameTransform(m_frame, (ChNrVector*)(&tmp), (ChNrVector*)(pts + j));
		pts[j] = tmp;
	}

	for(j=0; j<8; j++)
	{
		// then to screen
		ChNrVector4d tmp;
		ChNrViewportTransform(pRC->GetViewport(), (&tmp), (ChNrVector*)(pts + j));

		#if 0
		// assume it works unless we find otherwise
		// RL's viewport transforms are sometimes completely bogus,
		// so do the inverse and see if it makes sense. If not, we'll
		// ignore this one and return a null rect
		GxVec3f invTmp;
		ChNrViewportInverseTransform(pRC->GetViewport(), (ChNrVector*)(&invTmp), (&tmp));
		
		invTmp -= pts[j];
		float mag = invTmp.magnitude();
		if(mag / pts[j].magnitude() > 1e-2)
		{
			// Bogus transform!
			if(pboolClipped) *pboolClipped = false;
			ChRect rtExtent(0,0,0,0);
			return rtExtent;
		}
		#endif // test for bogosity

		pts[j].x() = tmp.x / tmp.w;
		pts[j].y() = tmp.y / tmp.w;
		pts[j].z() = tmp.z / tmp.w;
		if(boolClipped && pboolClipped)
		{
			if( 0 <= tmp.z )	// just check for behind 
			{
				boolClipped = false;
			}
		}
	}

	#else
	// old code - use retained mode api
	// Transform to screen space
	for(j=0; j<8; j++)
	{
		// first to world
		ChNrFrameTransform(m_frame, (ChNrVector*)(&tmp), (ChNrVector*)(pts + j));
		pts[j] = tmp;
	}

	for(j=0; j<8; j++)
	{
		// then to screen
		ChNrVector4d tmp;
		ChNrViewportTransform(pRC->GetViewport(), (&tmp), (ChNrVector*)(pts + j));

		// RL's viewport transforms are sometimes completely bogus,
		// so do the inverse and see if it makes sense. If not, we'll
		// ignore this one and return a null rect
		GxVec3f invTmp;
		ChNrViewportInverseTransform(pRC->GetViewport(), (ChNrVector*)(&invTmp), (&tmp));
		
		invTmp -= pts[j];
		float mag = invTmp.magnitude();
		if(mag / pts[j].magnitude() > 1e-2)
		{
			// Bogus transform!
			if(pboolClipped) *pboolClipped = false;
			ChRect rtExtent(0,0,0,0);
			return rtExtent;
		}

		pts[j].x() = tmp.x / tmp.w;
		pts[j].y() = tmp.y / tmp.w;
		pts[j].z() = tmp.z / tmp.w;
		if(boolClipped && pboolClipped)
		{
			#if 0
			if( tmp.w * xmin <= tmp.x && tmp.x < tmp.w * xmax &&
				tmp.w * ymin <= tmp.y && tmp.y < tmp.w * ymax &&
				0 <= tmp.z && tmp.z < tmp.w)
			#endif
			if( 0 <= tmp.z )	// just check for behind 
			{
				boolClipped = false;
			}
		}
	}

	#endif

	// Take the bounds of result
	bounds.GetBounds( pts, 8, lower, upper );


	int xmin, xmax, ymin, ymax;
	xmin = 0;
	xmax = ChNrViewportGetWidth(view);
	ymin = 0;
	ymax = ChNrViewportGetHeight(view);
	int halfExtent = max(xmax, ymax) / 2;
	#if (defined(CH_USE_D3D))
	ChRect rtExtent(int(lower.x()), 
					int(lower.y()), 
					int(upper.x()), 
					int(upper.y()));
	#else
											   // extent is in homo coords,
											   // convert to screen
	ChRect rtExtent(int(lower.x() * halfExtent) + xmax / 2, 
					int(lower.y() * halfExtent) + ymax / 2, 
					int(upper.x() * halfExtent) + xmax / 2, 
					int(upper.y() * halfExtent) + ymax / 2);
	#endif

	rtExtent.bottom = max(rtExtent.top+1, rtExtent.bottom);		   // guarantee some extent - at least a pixel
	rtExtent.right = max(rtExtent.left+1, rtExtent.right);

	// Intersect the extent rect with the viewport to figure out x/y clipping
	if(!boolClipped)
	{

		ChRect viewRect(xmin, ymin, xmax, ymax), r;
											  // Put a buffer area around the viewport
											  // so objects nearby are indicated as not clipped
		if(boolBeGenerous)
		{
			viewRect.InflateRect((xmax - xmin) / 3, (ymax - ymin) / 3);	
		}

		boolClipped = !r.IntersectRect(&rtExtent, &viewRect);
	}



	if(pboolClipped)
	{
		if(boolClipped)
		{							 // weird code here to set breakpoints
		 	*pboolClipped = true;	 // set the return if desired
		}
		else
		{
		 	*pboolClipped = false;	 // set the return if desired
		}
	}
	return rtExtent;
	
	#else

	// Even older attempt - using our own transforms

	GxVec3f lower, upper;
	#if DEBUG
	GxTransform3Wf modelWorld = GetTransform();
	#endif

	GxTransform3Wf modelCamera = pRC->GetWorldToCameraTransform();	// world to camera
	modelCamera *= GetTransform();						// now it's model to camera
	ChQvBounds bounds;
	if(pBounds)
	{
		bounds = *pBounds;
	}
	else
	{
		GetBounds(bounds);
	}
	bounds.GetTransformedBounds(lower, upper, modelCamera);

	GxTransform3Wf cameraToClip = pRC->GetCameraToClipTransform();
	GxTransform3Wf clipToScreen = pRC->GetClipToScreenTransform();
	float wu, wl;
	lower = cameraToClip.TransformW(lower, wl);
	lower *= 1. / wl;
	upper = cameraToClip.TransformW(upper, wu);
	upper *= 1. / wu;
	lower = clipToScreen * lower;
	upper = clipToScreen * upper;
	ChRect rtExtent(int(lower.x()), int(lower.y()), int(upper.x()), int(upper.y()));
	return rtExtent;
	#endif
}

// end of file

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品美女久久福利网站| 午夜欧美在线一二页| 亚洲成人精品一区| 国产成人精品午夜视频免费| 欧美精品一二三区| 亚洲欧洲三级电影| 国产成人自拍网| 欧美一区二区三区婷婷月色| 亚洲欧美成人一区二区三区| 国产美女精品人人做人人爽| 欧美一级国产精品| 婷婷久久综合九色国产成人| 91老司机福利 在线| 中文无字幕一区二区三区 | 久久久亚洲精品石原莉奈| 亚洲一级在线观看| 91亚洲午夜精品久久久久久| 日本一区二区三区dvd视频在线 | 一区二区三区在线视频观看| 成人午夜视频免费看| 久久这里只有精品视频网| 日本欧美加勒比视频| 欧美三级一区二区| 亚洲图片欧美一区| 欧美无人高清视频在线观看| 一区二区三区四区不卡在线 | 91美女福利视频| 日韩一区欧美一区| 91色porny在线视频| 亚洲靠逼com| 91性感美女视频| 一区二区三区四区亚洲| 99re视频精品| 亚洲午夜久久久久中文字幕久| 色婷婷一区二区| 亚洲成a天堂v人片| 91精品国产综合久久精品麻豆| 日韩在线卡一卡二| 日韩欧美高清一区| 国产一区二区三区电影在线观看 | 亚洲精品免费看| 91极品美女在线| 日韩av电影一区| 久久一区二区视频| 不卡的电影网站| 亚洲精品videosex极品| 在线观看91视频| 另类小说色综合网站| 久久久久久免费毛片精品| 福利91精品一区二区三区| 亚洲丝袜精品丝袜在线| 欧美日韩一区高清| 麻豆精品久久久| 国产精品水嫩水嫩| 欧美天堂一区二区三区| 免费成人美女在线观看| 中文字幕乱码久久午夜不卡| 色综合婷婷久久| 麻豆一区二区三区| 国产精品美女久久久久久久久久久| 成a人片亚洲日本久久| 午夜a成v人精品| 国产欧美精品在线观看| 色婷婷精品久久二区二区蜜臂av| 五月婷婷另类国产| 中文字幕第一区综合| 欧美日本不卡视频| 国产精品香蕉一区二区三区| 一区二区三区丝袜| 久久精品网站免费观看| 欧洲中文字幕精品| 成人午夜av影视| 首页国产丝袜综合| 中文字幕一区二区在线播放| 51精品秘密在线观看| 福利一区福利二区| 青青草原综合久久大伊人精品优势| 国产日韩一级二级三级| 91精品国产综合久久小美女| jizzjizzjizz欧美| 久久99久久99| 五月天一区二区| 国产精品久久久99| 久久综合色综合88| 在线不卡中文字幕播放| 91色乱码一区二区三区| 国产高清亚洲一区| 激情五月婷婷综合网| 一区二区不卡在线视频 午夜欧美不卡在 | 精品国产青草久久久久福利| 色欧美片视频在线观看在线视频| 激情综合五月天| 日韩中文字幕av电影| 亚洲男同1069视频| 国产精品免费免费| 国产亚洲人成网站| 亚洲精品一区二区在线观看| 欧美一区二区福利视频| 欧美在线综合视频| 在线观看三级视频欧美| 91免费国产在线| 99久久久久久| a级精品国产片在线观看| 国产精品18久久久久久vr | 亚洲综合男人的天堂| 亚洲欧美影音先锋| 亚洲美女屁股眼交3| 国产精品福利电影一区二区三区四区| 精品久久国产老人久久综合| 日韩欧美视频一区| www亚洲一区| 国产农村妇女精品| 中文字幕不卡的av| 亚洲欧洲日产国码二区| 成人欧美一区二区三区黑人麻豆| 国产精品免费观看视频| 亚洲欧洲精品一区二区精品久久久| 国产日本亚洲高清| 国产精品久久久久久久裸模| 国产亚洲精品aa| 欧美韩国日本一区| 中文字幕综合网| 亚洲夂夂婷婷色拍ww47| 亚洲国产一区视频| 午夜精品久久久久久久 | 久久久久久毛片| 国产精品美女久久久久高潮| 亚洲人成网站在线| 午夜久久久久久| 韩国毛片一区二区三区| 成人综合在线视频| 91久久人澡人人添人人爽欧美 | 播五月开心婷婷综合| 91精品欧美综合在线观看最新| 日韩精品综合一本久道在线视频| 日韩三级免费观看| 国产精品无遮挡| 亚洲午夜免费视频| 国产资源精品在线观看| 91影院在线观看| 欧美一区二区三区婷婷月色| 国产欧美中文在线| 亚洲尤物在线视频观看| 开心九九激情九九欧美日韩精美视频电影| 九色综合国产一区二区三区| 久久综合色8888| 最新热久久免费视频| 日韩精品五月天| av在线不卡观看免费观看| 欧美高清性hdvideosex| 中文字幕欧美激情| 日本视频一区二区| 97久久精品人人澡人人爽| 91精品啪在线观看国产60岁| 国产精品色在线| 丝瓜av网站精品一区二区| 成人一级视频在线观看| 5月丁香婷婷综合| 国产精品动漫网站| 麻豆极品一区二区三区| 91成人看片片| 国产精品久久久久久久久久免费看 | 国产在线精品一区二区不卡了| 91色.com| 久久婷婷综合激情| 婷婷开心激情综合| 色综合咪咪久久| 久久日韩粉嫩一区二区三区| 亚洲国产视频直播| 99精品久久99久久久久| 精品国产免费久久 | 不卡的电视剧免费网站有什么| 欧美人动与zoxxxx乱| 亚洲日本免费电影| 豆国产96在线|亚洲| 亚洲成在线观看| 成人福利视频在线看| 欧美成人a在线| 秋霞成人午夜伦在线观看| 欧美日韩精品欧美日韩精品一| 中文字幕一区二区不卡| 国产麻豆精品视频| 精品少妇一区二区| 日本三级韩国三级欧美三级| 91福利在线免费观看| 亚洲三级免费电影| 99视频一区二区| 国产精品美女久久久久久久| 激情五月播播久久久精品| 日韩欧美一区在线| 日韩成人免费电影| 欧美老肥妇做.爰bbww| 亚洲小说春色综合另类电影| 99riav一区二区三区| 国产精品久久夜| av动漫一区二区| 亚洲欧美在线观看| 91黄色在线观看| 午夜电影网亚洲视频| 91精品国产综合久久久久久|