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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? ogreopcodemath.h

?? opcode是功能強(qiáng)大
?? H
?? 第 1 頁 / 共 2 頁
字號:
///////////////////////////////////////////////////////////////////////////////
///  @file OgreOpcodeMath.h
///  @brief <TODO: insert file description here>
///
///  @author The OgreOpcode Team
///  
///////////////////////////////////////////////////////////////////////////////
///  
///  This file is part of OgreOpcode.
///  
///  A lot of the code is based on the Nebula Opcode Collision module, see docs/Nebula_license.txt
///  
///  OgreOpcode is free software; you can redistribute it and/or
///  modify it under the terms of the GNU Lesser General Public
///  License as published by the Free Software Foundation; either
///  version 2.1 of the License, or (at your option) any later version.
///  
///  OgreOpcode is distributed in the hope that it will be useful,
///  but WITHOUT ANY WARRANTY; without even the implied warranty of
///  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
///  Lesser General Public License for more details.
///  
///  You should have received a copy of the GNU Lesser General Public
///  License along with OgreOpcode; if not, write to the Free Software
///  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
///  
///////////////////////////////////////////////////////////////////////////////
#ifndef __OgreOpcodeMath_h__
#define __OgreOpcodeMath_h__

#include <Ogre.h>
#include "OgreOpcodeExports.h"

namespace OgreOpcode
{
	namespace Details
	{
		// -----------------------------------------------------------------------
		// Overridden operators

		/// Dot product operator
		inline Ogre::Real operator | ( const Ogre::Vector3& u,  const Ogre::Vector3& v ) 
		{
			return (u.x*v.x + u.y*v.y + u.z*v.z);
		}

		/// Cross product operator
		inline Ogre::Vector3 operator ^ ( const Ogre::Vector3& u,  const Ogre::Vector3& v ) 
		{
			return u.crossProduct( v );
		}

		// forward declarations
		class Capsule;
		class Line;
		class OrientedBox;

		class line3
		{
		public:
			Ogre::Vector3 b;
			Ogre::Vector3 m;

			line3() {};
			line3(const Ogre::Vector3& v0, const Ogre::Vector3& v1) : b(v0), m(v1-v0) {};
			line3(const line3& l) : b(l.b), m(l.m) {};

			void set(const Ogre::Vector3& v0, const Ogre::Vector3& v1)
			{
				b = v0;
				m = v1-v0;
			};

			const Ogre::Vector3& start(void) const
			{
				return b;
			};

			Ogre::Vector3 end(void) const
			{
				return (b+m);
			};

			Ogre::Real length(void) const
			{
				return m.length();
			};

			//--- minimal distance of point to line -------------------------
			Ogre::Real distance(const Ogre::Vector3& p)
			{
				Ogre::Vector3 diff(p-b);
				Ogre::Real l = m.dotProduct(m);
				if (l > 0.0f) {
					Ogre::Real t = m.dotProduct(diff) / l;
					diff = diff - m*t;
					return diff.length();
				} else
				{
					// line is really a point...
					Ogre::Vector3 v(p-b);
					return v.length();
				}
			};

			//--- get 3d point on line given t ------------------------------
			Ogre::Vector3 ipol(const Ogre::Real t) const {
				return Ogre::Vector3(b + m*t);
			};
		};

		//-------------------------------------------------------------------
		//  Triangle points are tri(s,t)=b + s*e0 + t*e1 where
		//  0<=s<=1, 0<=t<=1 and 0<=s+t<=1
		//-------------------------------------------------------------------
		class triangle
		{
		public:
			Ogre::Vector3 b,e0,e1;

			triangle() {};
			triangle(const Ogre::Vector3& v0, const Ogre::Vector3& v1, const Ogre::Vector3& v2) 
				: b(v0), e0(v1-v0), e1(v2-v0) {};
			triangle(const triangle& t) 
				: b(t.b), e0(t.e0), e1(t.e1) {}; 

			void set(const Ogre::Vector3& v0, const Ogre::Vector3& v1, const Ogre::Vector3& v2) {
				b  = v0;
				e0 = v1-v0;
				e1 = v2-v0;
			};

			//--- get the face normal of the triangle ---------------------------------
			Ogre::Vector3 normal(void) const
			{
				Ogre::Vector3 cross = e0.crossProduct(e1);
				cross.normalise();
				return cross;
			};

			//--- get the midpoint (center of gravity) of the triangle ----------------
			Ogre::Vector3 midpoint(void) const {
				return b + ((e0+e1)/3.0f);
			};

			//--- get the plane of the triangle ---------------------------------------
			Ogre::Plane getplane(void) const
			{
				return Ogre::Plane(b,b+e0,b+e1);
			};

			//--- get one the edge points ---------------------------------------------
			Ogre::Vector3 point(int i) const
			{
				switch (i)
				{
				case 0: return b;
				case 1: return b + e0;
				case 2: return b + e1;
				default: return Ogre::Vector3(0.0f, 0.0f, 0.0f);
				}
			};

			bool isPointInsideFast(Ogre::Vector3 &p)
			{
				Ogre::Vector3 f = point(1) - point(0);
				Ogre::Vector3 g = point(2) - point(0);

				Ogre::Real a = f.dotProduct(f);
				Ogre::Real _b = f.dotProduct(g);
				Ogre::Real c = g.dotProduct(g);

				Ogre::Real ac_bb = (a*c)-(_b*_b);
				Ogre::Vector3 vp = p - point(0);

				Ogre::Real d = vp.dotProduct(f);
				Ogre::Real e = vp.dotProduct(g);
				Ogre::Real x = (d*c)-(e*_b);
				Ogre::Real y = (e*a)-(d*_b);
				Ogre::Real z = x+y-ac_bb;

				return (( ((unsigned int&)z)& ~(((unsigned int&)x)|((unsigned int&)y))) & 0x80000000)!=0;
			}

			//--- check if and where line intersects triangle -------------------------
			//  Taken from Magic Software (http://www.cs.unc.edu/~eberly)
			//  Return false if line is parallel to triangle or hits its backside.
			//
			bool intersect(const line3& line, Ogre::Real& ipos)
			{

				// Compute plane of triangle, Dot(normal,X-tri.b) = 0 where 'normal' is
				// the plane normal.  If the angle between the line direction and normal
				// is small, then the line is effectively parallel to the triangle.
				const Ogre::Real fTolerance = 1e-04f;
				Ogre::Vector3 norm = e0.crossProduct(e1);
				Ogre::Real fDenominator = norm.dotProduct(line.m);
				//Real fLLenSqr     = line.m % line.m;
				//Real fNLenSqr     = norm % norm;

				// check if intersecting backface or parallel...
				if (fDenominator >= -fTolerance) return false;

				//if ((fDenominator*fDenominator) <= (fTolerance*fLLenSqr*fNLenSqr)) {
				//    // line and triangle are parallel
				//    return false;
				//}

				// The line is X(t) = line.b + t*line.m.  Compute line parameter t for
				// intersection of line and plane of triangle.  Substitute in the plane
				// equation to get Dot(normal,line.b-tri.b) + t*Dot(normal,line.m)   
				Ogre::Vector3 kDiff0(line.b - b);
				Ogre::Real fTime = -(norm.dotProduct(kDiff0)) / fDenominator;
				if ((fTime<-fTolerance) || (fTime>(1.0f+fTolerance))) return false;

				// Find difference of intersection point of line with plane and vertex
				// of triangle.
				Ogre::Vector3 kDiff1(kDiff0 + line.m*fTime);

				// Compute if intersection point is inside triangle.  Write
				// kDiff1 = s0*E0 + s1*E1 and solve for s0 and s1.
				Ogre::Real fE00 = e0.dotProduct(e0);
				Ogre::Real fE01 = e0.dotProduct(e1);
				Ogre::Real fE11 = e1.dotProduct(e1);
				Ogre::Real fDet = (Ogre::Real) fabs(fE00*fE11-fE01*fE01);     // = |normal|^2 > 0
				Ogre::Real fR0  = e0.dotProduct(kDiff1);
				Ogre::Real fR1  = e1.dotProduct(kDiff1);

				Ogre::Real fS0 = fE11*fR0 - fE01*fR1;
				Ogre::Real fS1 = fE00*fR1 - fE01*fR0;

				if ((fS0>=-fTolerance) && (fS1>=-fTolerance) && (fS0+fS1<=fDet+fTolerance)) {
					// intersection is inside triangle
					ipos = fTime;
					return true;
				} else {
					// intersection is outside triangle
					return false;
				}
			};

			//--- check if and where line intersects triangle -------------------------
			//  Taken from Magic Software (http://www.cs.unc.edu/~eberly)
			//  Return false if line is parallel to triangle
			//
			bool intersect_both_sides(const line3& line, Ogre::Real& ipos) {

				// Compute plane of triangle, Dot(normal,X-tri.b) = 0 where 'normal' is
				// the plane normal.  If the angle between the line direction and normal
				// is small, then the line is effectively parallel to the triangle.
				const Ogre::Real fTolerance = 1e-04f;
				Ogre::Vector3 norm = e0.crossProduct(e1);
				Ogre::Real fDenominator = norm.dotProduct(line.m);
				Ogre::Real fLLenSqr     = line.m.dotProduct(line.m);
				Ogre::Real fNLenSqr     = norm.dotProduct(norm);

				// check if intersecting backface or parallel...
				if (fDenominator*fDenominator <= fTolerance*fLLenSqr*fNLenSqr) return false;

				//if ((fDenominator*fDenominator) <= (fTolerance*fLLenSqr*fNLenSqr)) {
				//    // line and triangle are parallel
				//    return false;
				//}

				// The line is X(t) = line.b + t*line.m.  Compute line parameter t for
				// intersection of line and plane of triangle.  Substitute in the plane
				// equation to get Dot(normal,line.b-tri.b) + t*Dot(normal,line.m)   
				Ogre::Vector3 kDiff0(line.b - b);
				Ogre::Real fTime = -(norm.dotProduct(kDiff0)) / fDenominator;
				if ((fTime<-fTolerance) || (fTime>(1.0f+fTolerance))) return false;

				// Find difference of intersection point of line with plane and vertex
				// of triangle.
				Ogre::Vector3 kDiff1(kDiff0 + line.m*fTime);

				// Compute if intersection point is inside triangle.  Write
				// kDiff1 = s0*E0 + s1*E1 and solve for s0 and s1.
				Ogre::Real fE00 = e0.dotProduct(e0);
				Ogre::Real fE01 = e0.dotProduct(e1);
				Ogre::Real fE11 = e1.dotProduct(e1);
				Ogre::Real fDet = (Ogre::Real) fabs(fE00*fE11-fE01*fE01);     // = |normal|^2 > 0
				Ogre::Real fR0  = e0.dotProduct(kDiff1);
				Ogre::Real fR1  = e1.dotProduct(kDiff1);

				Ogre::Real fS0 = fE11*fR0 - fE01*fR1;
				Ogre::Real fS1 = fE00*fR1 - fE01*fR0;

				if ((fS0>=-fTolerance) && (fS1>=-fTolerance) && (fS0+fS1<=fDet+fTolerance)) {
					// intersection is inside triangle
					ipos = fTime;
					return true;
				} else {
					// intersection is outside triangle
					return false;
				}
			};
		};

#define TINY (0.0000001)
#define n_max(a,b)      (((a) > (b)) ? (a) : (b))
#define n_min(a,b)      (((a) < (b)) ? (a) : (b))

		class bbox3
		{
		public:
			Ogre::Vector3 vmin;
			Ogre::Vector3 vmax;

			enum
			{
				CLIP_LEFT   = (1<<0),
				CLIP_RIGHT  = (1<<1),
				CLIP_BOTTOM = (1<<2),
				CLIP_TOP    = (1<<3),
				CLIP_NEAR   = (1<<4),
				CLIP_FAR    = (1<<5),
			};

			enum
			{
				OUTSIDE     = 0,
				ISEQUAL     = (1<<0),
				ISCONTAINED = (1<<1),
				CONTAINS    = (1<<2),
				CLIPS       = (1<<3),
			};

			//--- constructors ----------------------------------------------
			bbox3() {};
			bbox3(const Ogre::Vector3& _vmin, const Ogre::Vector3& _vmax) : vmin(_vmin), vmax(_vmax) {};
			bbox3(const bbox3& bb) : vmin(bb.vmin), vmax(bb.vmax) {};

			//--- initialize from Vector3 cloud -----------------------------
			bbox3(Ogre::Vector3 *varray, int num)
			{
				vmin = varray[0];
				vmax = varray[0];
				int i;
				for (i=0; i<num; i++)
				{
					if      (varray[i].x<vmin.x) vmin.x=varray[i].x;
					else if (varray[i].x>vmax.x) vmax.x=varray[i].x;
					if      (varray[i].y<vmin.y) vmin.y=varray[i].y;
					else if (varray[i].y>vmax.y) vmax.y=varray[i].y;
					if      (varray[i].z<vmin.z) vmin.z=varray[i].z;
					else if (varray[i].z>vmax.z) vmax.z=varray[i].z;
				}
			};

			//--- utility getters ------------------------------------------
			Ogre::Vector3 getCenter() const { return (vmin + vmax)*0.5; }
			void getCenter(Ogre::Vector3& v) const { v = (vmin + vmax)*0.5; }

			Ogre::Vector3 getExtents() const { return (vmax - vmin)*0.5; }
			void getExtents( Ogre::Vector3& v) const { v = (vmax - vmin)*0.5; }

			//--- setting elements ------------------------------------------
			void set(const Ogre::Vector3& _vmin, const Ogre::Vector3& _vmax)
			{
				vmin = _vmin;
				vmax = _vmax;
			};
			void set(Ogre::Vector3 *varray, int num)
			{
				vmin = varray[0];
				vmax = varray[0];
				int i;
				for (i=0; i<num; i++)
				{
					if      (varray[i].x<vmin.x) vmin.x=varray[i].x;
					else if (varray[i].x>vmax.x) vmax.x=varray[i].x;
					if      (varray[i].y<vmin.y) vmin.y=varray[i].y;
					else if (varray[i].y>vmax.y) vmax.y=varray[i].y;
					if      (varray[i].z<vmin.z) vmin.z=varray[i].z;
					else if (varray[i].z>vmax.z) vmax.z=varray[i].z;
				}
			};

			//--- invalidate bounding box to prepare for growing ------------
			void begin_grow(void)
			{
				vmin = Ogre::Vector3(+1000000.0f,+1000000.0f,+1000000.0f);
				vmax = Ogre::Vector3(-1000000.0f,-1000000.0f,-1000000.0f);
			};
			void grow(const Ogre::Vector3& v)
			{
				if (v.x<vmin.x) vmin.x=v.x;
				if (v.x>vmax.x) vmax.x=v.x;
				if (v.y<vmin.y) vmin.y=v.y;
				if (v.y>vmax.y) vmax.y=v.y;
				if (v.z<vmin.z) vmin.z=v.z;
				if (v.z>vmax.z) vmax.z=v.z;
			};
			void grow(Ogre::Vector3 *varray, int num)
			{
				int i;
				for (i=0; i<num; i++)
				{
					grow(varray[i]);
				}
			};

			void grow(const bbox3& bb)
			{
				if (bb.vmin.x<vmin.x) vmin.x=bb.vmin.x;
				if (bb.vmin.y<vmin.y) vmin.y=bb.vmin.y;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品一级片| 欧美经典一区二区| 国产精品亚洲一区二区三区在线| 最新成人av在线| 日韩一二三区视频| 91在线观看美女| 国内精品国产成人国产三级粉色| 日韩激情av在线| 中文字幕第一区二区| 日韩一区二区三区高清免费看看| 色综合欧美在线| 国产一区二区免费视频| 日本在线不卡视频| 亚洲一区视频在线| 日韩毛片高清在线播放| 国产欧美日韩综合| 精品免费一区二区三区| 538在线一区二区精品国产| 色婷婷综合激情| av影院午夜一区| 国产精品伊人色| 激情国产一区二区| 美国欧美日韩国产在线播放| 亚洲一区二区三区视频在线播放| 国产精品福利影院| 久久精品人人爽人人爽| 精品国产第一区二区三区观看体验| 欧美日韩免费观看一区二区三区 | 天堂影院一区二区| 一区二区免费看| 亚洲乱码国产乱码精品精小说| 中文字幕不卡在线播放| 欧美国产精品专区| 国产欧美日韩在线观看| 久久久久久夜精品精品免费| 欧美成人在线直播| 日韩欧美一区在线观看| 欧美成人a视频| 欧美精品一区二区在线播放| 精品少妇一区二区| 精品欧美一区二区久久 | 日韩欧美国产三级| 日韩一区二区三区电影在线观看 | 欧洲精品在线观看| 欧美午夜一区二区三区| 欧美日韩黄色一区二区| 538在线一区二区精品国产| 在线综合+亚洲+欧美中文字幕| 在线播放国产精品二区一二区四区| 欧美日本免费一区二区三区| 欧美高清精品3d| 日韩三级免费观看| 国产亚洲成年网址在线观看| 国产欧美日产一区| 国产精品欧美一级免费| 亚洲视频中文字幕| 五月天激情综合| 久久成人久久爱| 国产成人一级电影| 91丨porny丨户外露出| 欧美熟乱第一页| 精品美女在线播放| 欧美国产日本韩| 亚洲高清久久久| 久久aⅴ国产欧美74aaa| 成人免费视频播放| 欧美三级韩国三级日本三斤| 欧美一级夜夜爽| 欧美高清在线精品一区| 亚洲黄色片在线观看| 日本不卡视频在线| 成人一道本在线| 欧美日韩亚洲综合一区二区三区 | 91精品国产综合久久精品性色 | 综合分类小说区另类春色亚洲小说欧美| 亚洲欧美日韩综合aⅴ视频| 午夜精品视频一区| 国产91高潮流白浆在线麻豆 | 日韩国产欧美在线视频| 成人美女视频在线看| 欧美日韩免费在线视频| 国产亚洲精久久久久久| 亚洲电影中文字幕在线观看| 国产一区二区三区精品欧美日韩一区二区三区 | 免费高清视频精品| 不卡一卡二卡三乱码免费网站| 欧美日韩国产bt| 国产精品久久久久久亚洲毛片 | 国产真实乱偷精品视频免| 91在线观看成人| 精品区一区二区| 亚洲国产日韩在线一区模特| 国产成人精品综合在线观看| 一区二区三区自拍| 一区二区三区欧美日韩| 久久综合综合久久综合| 色综合色狠狠天天综合色| 久久综合色一综合色88| 午夜日韩在线观看| 成人97人人超碰人人99| 欧美成人一区二区| 亚洲一级二级三级在线免费观看| 国产成人亚洲综合a∨猫咪| 欧美色精品在线视频| 国产精品成人免费精品自在线观看| 日本少妇一区二区| 色综合久久综合网97色综合| 久久久蜜臀国产一区二区| 日韩电影免费在线看| 91免费看`日韩一区二区| 久久无码av三级| 美女一区二区在线观看| 91麻豆精品一区二区三区| 欧美激情综合五月色丁香| 精品影视av免费| 欧美成人精品二区三区99精品| 国产午夜亚洲精品不卡| 蜜臀va亚洲va欧美va天堂| 欧美日韩中字一区| 亚洲乱码日产精品bd | 欧美性受xxxx| 日韩久久一区二区| 日本韩国精品一区二区在线观看| 久久夜色精品一区| 精品午夜一区二区三区在线观看| 欧美精品粉嫩高潮一区二区| 亚洲综合清纯丝袜自拍| 在线免费观看日本欧美| 亚洲精选免费视频| 91激情在线视频| 一区二区三区蜜桃| 欧美在线影院一区二区| 亚洲综合色成人| 欧美日韩亚洲综合在线 | 国产女人水真多18毛片18精品视频| 久久精品久久综合| 精品美女被调教视频大全网站| 韩国视频一区二区| 久久午夜电影网| www.66久久| 一区二区三区中文免费| 欧美在线三级电影| 丝袜诱惑制服诱惑色一区在线观看| 在线电影一区二区三区| 人人爽香蕉精品| 欧美变态口味重另类| 国产乱国产乱300精品| 日本一二三四高清不卡| av成人老司机| 亚洲韩国精品一区| 91精品国产色综合久久不卡电影| 久久精品国产久精国产爱| 久久久亚洲综合| 国产成都精品91一区二区三 | 日本一区中文字幕| 精品免费99久久| www.成人网.com| 欧美日韩不卡一区| 91久久精品网| 视频一区视频二区中文字幕| 欧美一级午夜免费电影| 国产成人在线色| 亚洲综合色在线| 久久综合丝袜日本网| 99视频精品免费视频| 午夜精品免费在线| 国产日产欧美精品一区二区三区| av成人老司机| 蜜臀久久99精品久久久久久9| 久久精品人人做人人爽人人| 色综合久久综合中文综合网| 美国毛片一区二区| 国产精品久久久久久久久晋中| 欧美性受极品xxxx喷水| 国产精品影视网| 亚洲影视资源网| 久久久另类综合| 色哟哟在线观看一区二区三区| 日本伊人精品一区二区三区观看方式 | 成人午夜免费av| 亚洲第一成人在线| 国产日韩精品视频一区| 欧美性色黄大片手机版| 国产综合一区二区| 亚洲国产日韩在线一区模特| 国产日韩欧美精品在线| 欧美日韩日日骚| 久热成人在线视频| 国产拍欧美日韩视频二区| 欧美亚洲尤物久久| 国产精品一区二区久激情瑜伽| 亚洲精品美国一| 久久久久久久久久久久久久久99 | 777久久久精品| 国产成人高清视频| 日本欧美加勒比视频| 亚洲乱码日产精品bd| 欧美激情资源网| 欧美大片在线观看| 欧美午夜理伦三级在线观看|