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

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

?? coldet.cpp

?? Direct3D游戲編程入門教程源代碼.rar
?? CPP
字號:
/*   ColDet - C++ 3D Collision Detection Library
 *   Copyright (C) 2000   Amir Geva
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 * 
 * This library 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
 * Library General Public License for more details.
 * 
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA  02111-1307, USA.
 *
 * Any comments, questions and bug reports send to:
 *   photon@photoneffect.com
 *
 * Or visit the home page: http://photoneffect.com/coldet/
 */
#include "sysdep.h"
#include "coldetimpl.h"
#include "mytritri.h"
#include <assert.h>

__CD__BEGIN

class Check
{
public:
  Check() {}
  Check(BoxTreeNode* f, BoxTreeNode* s, int d)
    : m_first(f), m_second(s), depth(d) {}
  BoxTreeNode* m_first;
  BoxTreeNode* m_second;
  int depth;
};

bool CollisionModel3DImpl::collision(CollisionModel3D* other, 
                                     int AccuracyDepth, 
                                     int MaxProcessingTime,
                                     float* other_transform)
{
  m_ColType=Models;
  CollisionModel3DImpl* o=static_cast<CollisionModel3DImpl*>(other);
  if (!m_Final) throw Inconsistency();
  if (!o->m_Final) throw Inconsistency();
  Matrix3D t=( other_transform==NULL ? o->m_Transform : *((Matrix3D*)other_transform) );
  if (m_Static) t *= m_InvTransform;
  else          t *= m_Transform.Inverse();
  RotationState rs(t);

  if (AccuracyDepth<0) AccuracyDepth=0xFFFFFF;
  if (MaxProcessingTime==0) MaxProcessingTime=0xFFFFFF;
  
  DWORD EndTime,BeginTime = GetTickCount();
  int num=Max(m_Triangles.size(),o->m_Triangles.size());
  int Allocated=Max(64,(num>>4));
  std::vector<Check> checks(Allocated);
  
  int queue_idx=1;
  Check& c=checks[0];
  c.m_first=&m_Root;
  c.depth=0;
  c.m_second=&o->m_Root;
  while (queue_idx>0)
  {
    if (queue_idx>(Allocated/2)) // enlarge the queue.
    {
      Check c;
      checks.insert(checks.end(),Allocated,c);
      Allocated*=2;
    }
    EndTime=GetTickCount();
    if (EndTime >= (BeginTime+MaxProcessingTime)) throw TimeoutExpired();

    // @@@ add depth check
    //Check c=checks.back();
    Check& c=checks[--queue_idx];
    BoxTreeNode* first=c.m_first;
    BoxTreeNode* second=c.m_second;
    assert(first!=NULL);
    assert(second!=NULL);
    if (first->intersect(*second,rs))
    {
      int tnum1=first->getTrianglesNumber();
      int tnum2=second->getTrianglesNumber();
      if (tnum1>0 && tnum2>0)
      {
        {
          for(int i=0;i<tnum2;i++)
          {
            BoxedTriangle* bt2=second->getTriangle(i);
            Triangle tt(Transform(bt2->v1,rs.t),Transform(bt2->v2,rs.t),Transform(bt2->v3,rs.t));
            for(int j=0;j<tnum1;j++)
            {
              BoxedTriangle* bt1=first->getTriangle(j);
              if (tt.intersect(*bt1)) 
              {
                m_ColTri1=*bt1;
                m_iColTri1=getTriangleIndex(bt1);
                m_ColTri2=tt;
                m_iColTri2=o->getTriangleIndex(bt2);
                return true;
              }
            }
          }
        }
      }
      else
      if (first->getSonsNumber()==0)
      {
        BoxTreeNode* s1=second->getSon(0);
        BoxTreeNode* s2=second->getSon(1);
        assert(s1!=NULL);
        assert(s2!=NULL);
        
        Check& c1=checks[queue_idx++];
        c1.m_first=first;
        c1.m_second=s1;

        Check& c2=checks[queue_idx++];
        c2.m_first=first;
        c2.m_second=s2;
      }
      else
      if (second->getSonsNumber()==0)
      {
        BoxTreeNode* f1=first->getSon(0);
        BoxTreeNode* f2=first->getSon(1);
        assert(f1!=NULL);
        assert(f2!=NULL);
        
        Check& c1=checks[queue_idx++];
        c1.m_first=f1;
        c1.m_second=second;

        Check& c2=checks[queue_idx++];
        c2.m_first=f2;
        c2.m_second=second;
      }
      else
      {
        float v1=first->getVolume();
        float v2=second->getVolume();
        if (v1>v2)
        {
          BoxTreeNode* f1=first->getSon(0);
          BoxTreeNode* f2=first->getSon(1);
          assert(f1!=NULL);
          assert(f2!=NULL);

          Check& c1=checks[queue_idx++];
          c1.m_first=f1;
          c1.m_second=second;

          Check& c2=checks[queue_idx++];
          c2.m_first=f2;
          c2.m_second=second;
        }
        else
        {
          BoxTreeNode* s1=second->getSon(0);
          BoxTreeNode* s2=second->getSon(1);
          assert(s1!=NULL);
          assert(s2!=NULL);

          Check& c1=checks[queue_idx++];
          c1.m_first=first;
          c1.m_second=s1;

          Check& c2=checks[queue_idx++];
          c2.m_first=first;
          c2.m_second=s2;
        }
      }
    }
  }
  return false;
}

bool CollisionModel3DImpl::rayCollision(float origin[3], 
                                        float direction[3],
                                        bool closest,
                                        float segmin, 
                                        float segmax)
{
  float mintparm=9e9f,tparm;
  Vector3D col_point;
  m_ColType=Ray;
  Vector3D O;
  Vector3D D;
  if (m_Static)
  {
    O=Transform(*(Vector3D*)origin,m_InvTransform);
    D=rotateVector(*(Vector3D*)direction,m_InvTransform);
  }
  else
  {
    Matrix3D inv=m_Transform.Inverse();
    O=Transform(*(Vector3D*)origin,inv);
    D=rotateVector(*(Vector3D*)direction,inv);
  }
  if (segmin!=0.0f) // normalize ray
  {
    O+=segmin*D;
    segmax-=segmin;
    segmin=0.0f;
  }
  if (segmax<segmin) 
  {
    D=-D;
    segmax=-segmax;
  }
  std::vector<BoxTreeNode*> checks;
  checks.push_back(&m_Root);
  while (!checks.empty())
  {
    BoxTreeNode* b=checks.back();
    checks.pop_back();
    if (b->intersect(O,D,segmax))
    {
      int sons=b->getSonsNumber();
      if (sons)
        while (sons--) checks.push_back(b->getSon(sons));
      else
      {
        int tri=b->getTrianglesNumber();
        while (tri--)
        {
          BoxedTriangle* bt=b->getTriangle(tri);
          Triangle* t=static_cast<Triangle*>(bt);
          if (t->intersect(O,D,col_point,tparm,segmax)) 
          {
            if (closest)
            {
              if (tparm<mintparm)
              {
                mintparm=tparm;
                m_ColTri1=*bt;
                m_iColTri1=getTriangleIndex(bt);
                m_ColPoint=col_point;
              }
            }
            else
            {
              m_ColTri1=*bt;
              m_iColTri1=getTriangleIndex(bt);
              m_ColPoint=col_point;
              return true;
            }
          }
        }
      }
    }
  }
  if (closest && mintparm<9e9f) return true;
  return false;
}

bool CollisionModel3DImpl::sphereCollision(float origin[3], float radius)
{
  m_ColType=Sphere;
  Vector3D O;
  if (m_Static)
    O=Transform(*(Vector3D*)origin,m_InvTransform);
  else
  {
    Matrix3D inv=m_Transform.Inverse();
    O=Transform(*(Vector3D*)origin,inv);
  }
  std::vector<BoxTreeNode*> checks;
  checks.push_back(&m_Root);
  while (!checks.empty())
  {
    BoxTreeNode* b=checks.back();
    checks.pop_back();
    if (b->intersect(O,radius))
    {
      int sons=b->getSonsNumber();
      if (sons)
        while (sons--) checks.push_back(b->getSon(sons));
      else
      {
        int tri=b->getTrianglesNumber();
        while (tri--)
        {
          BoxedTriangle* bt=b->getTriangle(tri);
          Triangle* t=static_cast<Triangle*>(bt);
          if (t->intersect(O,radius,m_ColPoint))
          {
            m_ColTri1=*bt;
            m_iColTri1=getTriangleIndex(bt);
            return true;
          }
        }
      }
    }
  }
  return false;
}

bool CollisionModel3DImpl::getCollidingTriangles(float t1[9], float t2[9], bool ModelSpace)
{
  if (ModelSpace)
  {
    if (t1!=NULL)
    {
      *((Vector3D*)&t1[0]) = m_ColTri1.v1;
      *((Vector3D*)&t1[3]) = m_ColTri1.v2;
      *((Vector3D*)&t1[6]) = m_ColTri1.v3;
    }
    if (t2!=NULL)
    {
      *((Vector3D*)&t2[0]) = m_ColTri2.v1;
      *((Vector3D*)&t2[3]) = m_ColTri2.v2;
      *((Vector3D*)&t2[6]) = m_ColTri2.v3;
    }
  }
  else
  {
    if (t1!=NULL)
    {
      *((Vector3D*)&t1[0]) = Transform(m_ColTri1.v1,m_Transform);
      *((Vector3D*)&t1[3]) = Transform(m_ColTri1.v2,m_Transform);
      *((Vector3D*)&t1[6]) = Transform(m_ColTri1.v3,m_Transform);
    }
    if (t2!=NULL)
    {
      *((Vector3D*)&t2[0]) = Transform(m_ColTri2.v1,m_Transform);
      *((Vector3D*)&t2[3]) = Transform(m_ColTri2.v2,m_Transform);
      *((Vector3D*)&t2[6]) = Transform(m_ColTri2.v3,m_Transform);
    }
  }
  return true;
}

bool CollisionModel3DImpl::getCollidingTriangles(int& t1, int& t2)
{
  t1=m_iColTri1;
  t2=m_iColTri2;
  return true;
}

bool CollisionModel3DImpl::getCollisionPoint(float p[3], bool ModelSpace)
{
  Vector3D& v=*((Vector3D*)p);
  switch (m_ColType) 
  {
    case Models: v=my_tri_tri_intersect(m_ColTri1,m_ColTri2); break;
    case Sphere:
    case Ray:    v=m_ColPoint; break;
    default:     v=Vector3D::Zero;
  }
  if (!ModelSpace) v=Transform(v,m_Transform);
  return true;
}

bool SphereRayCollision(float center[3], float radius,
                        float origin[3], float direction[3],
                        float point[3])
{
  Vector3D& C=*((Vector3D*)center);
  Vector3D& O=*((Vector3D*)origin);
  Vector3D  D=((Vector3D*)direction)->Normalized();
  Vector3D& P=*((Vector3D*)point);
  Vector3D EO=C-O;
  float v=EO*D;
  float disc=radius*radius - (EO*EO - v*v);
  if (disc<0.0f) return false;
  float d=sqrt(disc);
  P=O+(v-d)*D;
  return true;
}

bool SphereSphereCollision(float c1[3], float r1,
                           float c2[3], float r2)
{
  Vector3D& C1=*((Vector3D*)c1);
  Vector3D& C2=*((Vector3D*)c2);
  float dist=(C2-C1).SquareMagnitude();
  float sum=r1+r2;
  return (dist < sum*sum);
}

__CD__END

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩精品乱码av一区二区| 国产精品一区不卡| 亚洲午夜久久久久久久久电影院| 中文在线资源观看网站视频免费不卡| 久久久久久久久久久电影| www日韩大片| 久久久久九九视频| 国产精品色呦呦| 亚洲视频在线观看三级| 亚洲欧洲在线观看av| 亚洲婷婷综合久久一本伊一区| 综合自拍亚洲综合图不卡区| 日韩毛片在线免费观看| 亚洲精品国产精华液| 亚洲福利一二三区| 免费av网站大全久久| 国内成+人亚洲+欧美+综合在线| 国产乱人伦精品一区二区在线观看| 国产剧情一区在线| 成人午夜精品一区二区三区| 99视频在线精品| 欧美日韩综合在线免费观看| 91精品久久久久久久99蜜桃| 精品久久久久久久久久久久久久久久久 | 久久亚洲精华国产精华液| 久久毛片高清国产| 国产精品成人在线观看| 亚洲综合色区另类av| 日本成人超碰在线观看| 国产精品1024| 色先锋久久av资源部| 这里是久久伊人| 久久久九九九九| 亚洲视频你懂的| 五月天婷婷综合| 国产精品91一区二区| 91国内精品野花午夜精品| 日韩一区二区在线播放| 中文成人综合网| 亚洲大片一区二区三区| 黄色资源网久久资源365| 成人ar影院免费观看视频| 欧美性感一区二区三区| 日韩精品一区二区三区视频在线观看| 国产日韩欧美精品一区| 亚洲国产日韩a在线播放性色| 美女视频一区二区| 99re视频这里只有精品| 日韩欧美综合在线| 亚洲欧美国产77777| 免费美女久久99| 91丨九色丨尤物| 日韩丝袜美女视频| 亚洲精品成人a在线观看| 国产在线播精品第三| 日本高清视频一区二区| 久久久久久久精| 天堂在线一区二区| caoporen国产精品视频| 日韩亚洲欧美在线观看| 亚洲三级在线播放| 狠狠色综合日日| 欧美日韩亚洲国产综合| 国产精品理伦片| 久久国产精品99久久人人澡| 欧美性视频一区二区三区| 国产日产欧产精品推荐色| 日韩精品一二三四| 在线观看一区二区视频| 亚洲国产成人午夜在线一区| 免费在线观看精品| 欧美日韩中文国产| 亚洲免费伊人电影| 成人激情开心网| 成人伦理片在线| 久久综合久久综合久久| 久久精品欧美日韩| 亚洲最大成人网4388xx| 丁香激情综合五月| 26uuu精品一区二区三区四区在线| 亚洲一二三区在线观看| 成人视屏免费看| 久久久久9999亚洲精品| 久久er99精品| 日韩欧美aaaaaa| 日产欧产美韩系列久久99| 色婷婷久久久亚洲一区二区三区| 日本一区二区三区免费乱视频 | 91浏览器在线视频| 国产亚洲综合色| 国产美女在线精品| 亚洲精品一线二线三线无人区| 日一区二区三区| 欧美久久久一区| 亚洲va在线va天堂| 欧美日韩免费一区二区三区| 亚洲制服丝袜av| 欧美伊人久久大香线蕉综合69| 一区二区在线看| 欧美午夜一区二区三区免费大片| 亚洲精品福利视频网站| 日本韩国精品在线| 夜夜操天天操亚洲| 欧美吻胸吃奶大尺度电影| 亚洲午夜精品17c| 欧美日韩小视频| 日本中文一区二区三区| 欧美日韩精品欧美日韩精品一| 夜夜嗨av一区二区三区四季av| 欧美怡红院视频| 三级一区在线视频先锋| 日韩亚洲欧美在线| 国产一区二区三区免费| 国产偷v国产偷v亚洲高清| 成人av资源下载| 亚洲欧美日韩在线播放| 91久久精品一区二区三区| 亚洲国产精品一区二区www在线| 欧美色网一区二区| 日韩av不卡在线观看| 久久一区二区三区四区| 丁香激情综合国产| 又紧又大又爽精品一区二区| 精品视频在线免费| 日韩av一区二| 久久精品日韩一区二区三区| 北条麻妃一区二区三区| 亚洲精品中文在线观看| 欧美美女黄视频| 国产一区日韩二区欧美三区| 国产精品污污网站在线观看| 91美女精品福利| 日本aⅴ精品一区二区三区 | 亚洲激情网站免费观看| 欧美日韩不卡视频| 国产一区二区毛片| 亚洲精品国久久99热| 91精品国产综合久久国产大片| 国内不卡的二区三区中文字幕| 国产精品不卡在线观看| 欧美日韩成人综合在线一区二区| 久久99精品久久久久婷婷| 中文字幕乱码日本亚洲一区二区| 在线影院国内精品| 久久成人久久爱| 亚洲欧美色图小说| 日韩一区二区三区视频在线| 成人精品gif动图一区| 丝袜脚交一区二区| 国产欧美精品一区二区三区四区 | 91精品国产综合久久久蜜臀粉嫩| 国产乱码精品一区二区三| 亚洲欧美日韩一区二区三区在线观看 | 欧美午夜影院一区| 国产伦精品一区二区三区免费| 亚洲女人小视频在线观看| 日韩欧美亚洲国产精品字幕久久久| 福利电影一区二区| 天天综合色天天综合色h| 欧美韩日一区二区三区四区| 欧美精品日日鲁夜夜添| 成人av中文字幕| 免费成人av在线播放| 亚洲精品福利视频网站| 国产女人水真多18毛片18精品视频| 欧美探花视频资源| 成人ar影院免费观看视频| 精品一区二区在线看| 亚洲欧洲日产国码二区| 精品久久久网站| 9191国产精品| 91香蕉视频污在线| 国产精品亚洲综合一区在线观看| 亚洲国产欧美在线| 18欧美乱大交hd1984| 久久久99免费| 欧美xxxxxxxx| 7777精品伊人久久久大香线蕉的 | 99国产欧美久久久精品| 久草精品在线观看| 视频精品一区二区| 亚洲综合图片区| 中文字幕亚洲在| 欧美国产成人在线| 久久久综合网站| 日韩视频在线观看一区二区| 欧美日韩国产天堂| 欧美性大战久久| 色综合 综合色| 91丨porny丨蝌蚪视频| 成人一区二区视频| 国产福利精品导航| 国产一区二区不卡| 国产久卡久卡久卡久卡视频精品| 蜜臀久久99精品久久久画质超高清| 亚洲成人在线免费| 亚洲成人动漫在线免费观看| 亚洲精品亚洲人成人网| 亚洲日本成人在线观看| 国产精品福利一区|