<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Cgwolver</title><subtitle type="text">QQ:419780024</subtitle><id>http://feed.cnblogs.com/blog/u/41225/rss</id><updated>2011-05-21T01:53:15Z</updated><author><name>cgwolver</name><uri>http://www.cnblogs.com/cgwolver/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cgwolver/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/41225/rss"/><entry><id>http://www.cnblogs.com/cgwolver/archive/2011/05/21/2052609.html</id><title type="text">hook com vtable entry</title><summary type="text">com interface 包括 d3d interface 都采用了 __stdcall 调用协议来声明成员函数，这样的声明使得编译出的汇编代码的传参中多出一个push，所有参数push stack后，还会将对象对地址也push stack；这样做的目的，使得可以用__stdcall 的 c函数来替换vtable中的函数，要求第一个参数是对象指针；其他参数和对应成员函数的参数相同；因为com设计之初，就支持CINTERFACE. #include&amp;quot;objbase.h&amp;quot;__declspec(novtable)interfaceAA:publicIUnknown{public</summary><published>2011-05-21T01:49:00Z</published><updated>2011-05-21T01:49:00Z</updated><author><name>cgwolver</name><uri>http://www.cnblogs.com/cgwolver/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cgwolver/archive/2011/05/21/2052609.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cgwolver/archive/2011/05/21/2052609.html"/><content type="html">&lt;p&gt;com interface 包括 d3d interface 都采用了 __stdcall 调用协议来声明成员函数，这样的声明使得编译出的汇编代码的传参中多出一个push，&lt;/p&gt;&lt;p&gt;所有参数push stack后，还会将对象对地址也push stack；&lt;/p&gt;&lt;p&gt;这样做的目的，使得可以用__stdcall 的 c函数来替换vtable中的函数，要求第一个参数是对象指针；其他参数和对应成员函数的参数相同；&lt;/p&gt;&lt;p&gt;因为com设计之初，就支持CINTERFACE. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;#include&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;objbase.h&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;__declspec(novtable)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;interface&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;AA:&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;IUnknown&lt;br /&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;virtual&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;HRESULT&amp;nbsp;STDMETHODCALLTYPE&amp;nbsp;QueryInterface(&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;[in]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;REFIID&amp;nbsp;riid,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;[iid_is][out]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;__RPC__deref_out&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;__RPC_FAR&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;__RPC_FAR&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;ppvObject)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;S_OK;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;virtual&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;ULONG&amp;nbsp;STDMETHODCALLTYPE&amp;nbsp;AddRef(&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;virtual&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;ULONG&amp;nbsp;STDMETHODCALLTYPE&amp;nbsp;Release(&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;成员函数采用__stdcall&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;virtual&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;__stdcall&amp;nbsp;v1(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;p)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;virtual&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;__stdcall&amp;nbsp;v2(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;p)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;virtual&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;__stdcall&amp;nbsp;v3(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;p)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;};&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;c函数声明比AA::v1要多出一个AA*&amp;nbsp;pthis参数&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;__stdcall&amp;nbsp;fpv1(&amp;nbsp;AA&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;pthis,&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;p&amp;nbsp;)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pthis&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;v2(p);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;_tmain(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;argc,&amp;nbsp;_TCHAR&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;argv[])&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AA&amp;nbsp;aa1,aa2;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;p1&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;(unsigned&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;aa1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;p2&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;(unsigned&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;aa2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;v&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(unsigned&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;)p1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DWORD&amp;nbsp;dwProtected&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VirtualProtect(v,&lt;/span&gt;&lt;span style="color: #800080;"&gt;256&lt;/span&gt;&lt;span style="color: #000000;"&gt;,PAGE_EXECUTE_READWRITE,&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;dwProtected&amp;nbsp;);&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;去掉可执行代码的写保护&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v[&lt;/span&gt;&lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(unsigned&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;fpv1;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;替换v1所在的vtable条目&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AA&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;pp1&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;aa1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pp1&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;v1(&amp;nbsp;NULL&amp;nbsp;);&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;将会跳转到fpv1，查看汇编代码回看到push&amp;nbsp;0&amp;nbsp;之后还会有一个push&amp;nbsp;pp1&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/cgwolver/aggbug/2052609.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cgwolver/archive/2011/05/21/2052609.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cgwolver/archive/2010/12/05/1896704.html</id><title type="text">鼠标拖动客户区移动的方法和问题</title><summary type="text">最简单的方法是在WM_NCHITTEST消息处理中返回HTCAPTION,当鼠标按下并拖动客户区,就会移动窗口;然而这个时候会导致客户区消息WM_LBUTTONDOWN不再响应：因为这个时候已经视为无客户区了;我的简单GUI实现中HOOK了低级鼠标输入,所以可以自己处理WM_LBUTTONDOWN,不过仍然有问题,一旦发生断点后,WH_MOUSE_LL就失效了</summary><published>2010-12-04T16:19:00Z</published><updated>2010-12-04T16:19:00Z</updated><author><name>cgwolver</name><uri>http://www.cnblogs.com/cgwolver/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cgwolver/archive/2010/12/05/1896704.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cgwolver/archive/2010/12/05/1896704.html"/><content type="html">&lt;p&gt;最简单的方法是在WM_NCHITTEST消息处理中返回HTCAPTION,当鼠标按下并拖动客户区,就会移动窗口;&lt;/p&gt;&#xD;
&lt;p&gt;然而这个时候会导致客户区消息WM_LBUTTONDOWN不再响应：因为这个时候已经视为无客户区了;&lt;/p&gt;&#xD;
&lt;p&gt;我的简单GUI实现中HOOK了低级鼠标输入,所以可以自己处理WM_LBUTTONDOWN,不过仍然有问题,一旦发生断点后,WH_MOUSE_LL就失效了&lt;img src="http://www.cnblogs.com/Emoticons/face/003.gif"  alt="" /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/cgwolver/aggbug/1896704.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cgwolver/archive/2010/12/05/1896704.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cgwolver/archive/2010/11/24/1886478.html</id><title type="text">svn c++ api</title><summary type="text">http://sourceforge.net/projects/win32svn/files/dev sdk：svn-win32-1.6.13_dev.zipwin32 binarysvn-win32-1.6.13.zipopensource project:rapidsvnhttp://rapidsvn.org/构建rapid svn所需依赖：wxWidgetsBerkeley DB 4.4li...</summary><published>2010-11-24T05:35:00Z</published><updated>2010-11-24T05:35:00Z</updated><author><name>cgwolver</name><uri>http://www.cnblogs.com/cgwolver/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cgwolver/archive/2010/11/24/1886478.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cgwolver/archive/2010/11/24/1886478.html"/><content type="html">&lt;p&gt;&lt;a href="http://sourceforge.net/projects/win32svn/files/"&gt;http://sourceforge.net/projects/win32svn/files/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;dev sdk：&lt;/p&gt;&#xD;
&lt;p&gt;svn-win32-1.6.13_dev.zip&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;win32 binary&lt;/p&gt;&#xD;
&lt;p&gt;svn-win32-1.6.13.zip&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;opensource project:&lt;/p&gt;&#xD;
&lt;p&gt;rapidsvn&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://rapidsvn.org/"&gt;http://rapidsvn.org/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;构建rapid svn所需依赖：&lt;/p&gt;&#xD;
&lt;p&gt;wxWidgets&lt;/p&gt;&#xD;
&lt;p&gt;Berkeley DB 4.4&lt;/p&gt;&#xD;
&lt;p&gt;libintl&lt;/p&gt;&#xD;
&lt;p&gt;svn-win32-dev&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/cgwolver/aggbug/1886478.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cgwolver/archive/2010/11/24/1886478.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cgwolver/archive/2010/11/20/1882794.html</id><title type="text">visual studio 自定义 c++ 源文件扩展名类型</title><summary type="text">1. Tools\Option\Projets And Solutions\VC++ Project Settings\C/C++ File Extensions: and new extension for c++ compile2. Tools\Option\Text Editor\File Extension: and new extension for sytax highlight</summary><published>2010-11-20T14:09:00Z</published><updated>2010-11-20T14:09:00Z</updated><author><name>cgwolver</name><uri>http://www.cnblogs.com/cgwolver/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cgwolver/archive/2010/11/20/1882794.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cgwolver/archive/2010/11/20/1882794.html"/><content type="html">&lt;p&gt;1. Tools\Option\Projets And Solutions\VC++ Project Settings\C/C++ File Extensions: and new extension for c++ compile&lt;/p&gt;&#xD;
&lt;p&gt;2. Tools\Option\Text Editor\File Extension:&amp;nbsp; and new extension for sytax highlight&lt;/p&gt;&lt;img src="http://www.cnblogs.com/cgwolver/aggbug/1882794.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cgwolver/archive/2010/11/20/1882794.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cgwolver/archive/2010/11/13/1876520.html</id><title type="text">C++ final class</title><summary type="text">[代码]当 DerivedClass 不定义默认构造函数时，虽然能够编译通过，但是无法实例化</summary><published>2010-11-13T08:36:00Z</published><updated>2010-11-13T08:36:00Z</updated><author><name>cgwolver</name><uri>http://www.cnblogs.com/cgwolver/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cgwolver/archive/2010/11/13/1876520.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cgwolver/archive/2010/11/13/1876520.html"/><content type="html">&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;template&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;typename&amp;nbsp;_Ty&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;FinalTemplate&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt;:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;　　FinalTemplate()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;　　{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;　　}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;　　&lt;/span&gt;&lt;span style="color: #000000"&gt;~&lt;/span&gt;&lt;span style="color: #000000"&gt;FinalTemplate()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;　　{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;10&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;　　}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;11&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;　　friend&amp;nbsp;_Ty;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;12&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;};&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;13&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;FinalClass:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;virtual&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;FinalTemplate&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;FinalClass&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;14&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;15&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;16&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;　　FinalClass()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;17&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;　　{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;18&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;　　}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;19&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;　　&lt;/span&gt;&lt;span style="color: #000000"&gt;~&lt;/span&gt;&lt;span style="color: #000000"&gt;FinalClass()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;20&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;　　{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;21&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;　　}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;22&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;};&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;23&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;/*&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;error:&amp;nbsp;Final&amp;nbsp;class&amp;nbsp;not&amp;nbsp;deriveable&lt;/span&gt;&lt;span style="color: #008000"&gt;*/&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;24&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;25&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;DerivedClass:&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;FinalClass&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;26&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;27&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;28&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;　　DerivedClass()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;29&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;　　{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;30&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;　　}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;31&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;　　&lt;/span&gt;&lt;span style="color: #000000"&gt;~&lt;/span&gt;&lt;span style="color: #000000"&gt;DerivedClass()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;32&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;　　{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;33&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;　　}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;34&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;当 DerivedClass 不定义默认构造函数时，虽然能够编译通过，但是无法实例化&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt; &lt;img src="http://www.cnblogs.com/cgwolver/aggbug/1876520.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cgwolver/archive/2010/11/13/1876520.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cgwolver/archive/2010/10/05/1843896.html</id><title type="text">SHBrowseForFolder 用法</title><summary type="text">[代码]</summary><published>2010-10-05T04:03:00Z</published><updated>2010-10-05T04:03:00Z</updated><author><name>cgwolver</name><uri>http://www.cnblogs.com/cgwolver/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cgwolver/archive/2010/10/05/1843896.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cgwolver/archive/2010/10/05/1843896.html"/><content type="html">&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;char&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;path[&lt;/span&gt;&lt;span style="color: #800080"&gt;500&lt;/span&gt;&lt;span style="color: #000000"&gt;];&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;BROWSEINFO&amp;nbsp;br;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;ITEMIDLIST&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;*&lt;/span&gt;&lt;span style="color: #000000"&gt;item;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;br.hwndOwner&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;span style="color: #000000"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;GetSafeHwnd();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;br.iImage&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;br.pszDisplayName&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;br.lParam&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;br.lpfn&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;br.lpszTitle&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;请选择路径:&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;10&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;br.pidlRoot&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;11&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;br.ulFlags&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;BIF_RETURNONLYFSDIRS&lt;/span&gt;&lt;span style="color: #000000"&gt;|&lt;/span&gt;&lt;span style="color: #000000"&gt;BIF_USENEWUI&lt;/span&gt;&lt;span style="color: #000000"&gt;|&lt;/span&gt;&lt;span style="color: #000000"&gt;BIF_BROWSEINCLUDEFILES;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;12&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;item&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;SHBrowseForFolder(&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000"&gt;br);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;13&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;14&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;(&amp;nbsp;item&lt;/span&gt;&lt;span style="color: #000000"&gt;!=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;NULL&amp;nbsp;)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;Non-CANCEL&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;15&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000"&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;16&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;　　&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(SHGetPathFromIDList(item,path)&lt;/span&gt;&lt;span style="color: #000000"&gt;==&lt;/span&gt;&lt;span style="color: #000000"&gt;TRUE)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;17&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;　　{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;18&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;　　}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;19&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;20&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/cgwolver/aggbug/1843896.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cgwolver/archive/2010/10/05/1843896.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cgwolver/archive/2010/08/13/1798715.html</id><title type="text">3DSMAX convert OGRE（D3D）</title><summary type="text">1. 坐标转换：坐标变换比较简单，按照轴的对应关系转换就可以了，按照多数插件的做法是yz互换，但是会发现场景是左右颠倒的，因为3dsmax是右手坐标系（Z向上，Y向内），而D3D是左手坐标系（Y向上，Z向内），所以x应该取负。void MaxVtx2DX( Point3&amp;amp; p,Vec3&amp;amp; v ){v.x = -p.x;v.y = p.z;v.z = p.y;}2.旋转转换通常动画场...</summary><published>2010-08-13T01:45:00Z</published><updated>2010-08-13T01:45:00Z</updated><author><name>cgwolver</name><uri>http://www.cnblogs.com/cgwolver/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cgwolver/archive/2010/08/13/1798715.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cgwolver/archive/2010/08/13/1798715.html"/><content type="html">&lt;p&gt;1. 坐标转换：&lt;/p&gt;&#xD;
&lt;p&gt;坐标变换比较简单，按照轴的对应关系转换就可以了，按照多数插件的做法是yz互换，但是会发现场景是左右颠倒的，因为3dsmax是右手坐标系（Z向上，Y向内），而D3D是左手坐标系（Y向上，Z向内），所以x应该取负。&lt;/p&gt;&#xD;
&lt;p&gt;void MaxVtx2DX( Point3&amp;amp; p,Vec3&amp;amp; v )&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;v.x = -p.x;&lt;br /&gt;&amp;nbsp;v.y = p.z;&lt;br /&gt;&amp;nbsp;v.z = p.y;&lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;2.旋转转换&lt;/p&gt;&#xD;
&lt;p&gt;通常动画场景我们需要独立的旋转分量，一般是Quatnion，quat的转换就不是这么简单了。因为quat包含了正余弦值。&lt;/p&gt;&#xD;
&lt;p&gt;一个可以保证正确性的方法是，把Quat转成旋转矩阵，取得三根轴向，把轴看作矢量，按照上面规则进行处理。轴取自于行，还是取自于列，可能不同系统规定不同，但是我们可以用普适的方法去获得：用矩阵去变换基向量：&lt;/p&gt;&#xD;
&lt;p&gt;比如 M.Transform( Vector(1,0,0)) 得到的一定是X轴的朝向。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;void MaxMtx2OgreTransform( Matrix3&amp;amp; mtx,Ogre::Vector3&amp;amp; pos,Ogre::Vector3&amp;amp; scale,Ogre::Quaternion&amp;amp;quat )&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;Point3 p,s;&lt;br /&gt;&amp;nbsp;Quat q;&lt;/p&gt;&#xD;
&lt;p&gt;AffineParts ap;&lt;br /&gt;&amp;nbsp;decomp_affine(mtx,&amp;amp;ap);&lt;/p&gt;&#xD;
&lt;p&gt;s = Point3( ap.f,ap.f,ap.f);&lt;br /&gt;&amp;nbsp;p = ap.t;&lt;br /&gt;&amp;nbsp;q = ap.q;&lt;br /&gt;&amp;nbsp;AngAxis aa(q);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;Matrix3 rtm;&lt;/p&gt;&#xD;
&lt;p&gt;rtm.SetRotate(q);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;Vec3 ax,ay,az;&lt;/p&gt;&#xD;
&lt;p&gt;Point3 right(1,0,0);&lt;br /&gt;&amp;nbsp;Point3 up(0,0,1);&lt;br /&gt;&amp;nbsp;Point3 dir(0,1,0);&lt;/p&gt;&#xD;
&lt;p&gt;right = rtm.VectorTransform( right );&lt;br /&gt;&amp;nbsp;up = rtm.VectorTransform( up );&lt;br /&gt;&amp;nbsp;dir = rtm.VectorTransform( dir );&lt;/p&gt;&#xD;
&lt;p&gt;MaxVtx2DX( right,ax );&lt;br /&gt;&amp;nbsp;MaxVtx2DX( up,ay );&lt;br /&gt;&amp;nbsp;MaxVtx2DX( dir,az );&lt;/p&gt;&#xD;
&lt;p&gt;Vec3 tr,sc;&lt;br /&gt;&amp;nbsp;MaxVtx2DX( p,tr );&lt;/p&gt;&#xD;
&lt;p&gt;sc.x = s.x;&lt;br /&gt;&amp;nbsp;sc.y = s.y;&lt;br /&gt;&amp;nbsp;sc.z = s.z;&lt;/p&gt;&#xD;
&lt;p&gt;quat.FromAxes( &lt;br /&gt;&amp;nbsp;&amp;nbsp;Ogre::Vector3(-ax.x,-ax.y,-ax.z),&lt;br /&gt;&amp;nbsp;&amp;nbsp;Ogre::Vector3(ay.x,ay.y,ay.z),&lt;br /&gt;&amp;nbsp;&amp;nbsp;Ogre::Vector3(az.x,az.y,az.z)&lt;br /&gt;&amp;nbsp;&amp;nbsp;);&lt;/p&gt;&#xD;
&lt;p&gt;pos = Ogre::Vector3( tr.x,tr.y,tr.z );&lt;br /&gt;&amp;nbsp;scale = Ogre::Vector3( sc.x,sc.y,sc.z );&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;3.相对变换&lt;/p&gt;&#xD;
&lt;p&gt;3DSMAX自身取相对变换是 Invert(ptm)*ntm,但是对于OGRE-D3D应该是反过来。&lt;/p&gt;&#xD;
&lt;p&gt;Matrix3 GetRelativeTM( Matrix3 ptm,Matrix3 ntm )&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;Matrix3 iptm = ptm;&lt;br /&gt;&amp;nbsp;iptm.Invert();&lt;br /&gt;&amp;nbsp;Matrix3 tm = ntm *iptm ;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;return tm;&lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;4.骨骼动画&lt;/p&gt;&#xD;
&lt;p&gt;骨骼动画的相对变换，应该是相对BindingPose，并且是局部变换对局部变换求相对变换：&lt;/p&gt;&#xD;
&lt;p&gt;AnimTransofrmMatrix = GetRelativeTM（BindingPoseLocalMatrix,NodeLocalMatrix(t)）&lt;/p&gt;&#xD;
&lt;p&gt;t是time。&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/cgwolver/aggbug/1798715.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cgwolver/archive/2010/08/13/1798715.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cgwolver/archive/2010/04/11/1709394.html</id><title type="text">BSP场景管理方法简介</title><summary type="text">BSP（Binary Space Partition,二叉空间分割）方法，在大型3d游戏场景管理方面，可以认为是已经证明了的，最成熟的，最经得起考验的场景管理方法。诸如虚幻系列引擎（Unreal 1,2,3），ID系列以及衍生产品（Quake,DOOM,Half-Life2），都采用了BSP方法来管理场景，尽管他们各自在实现上略有不同，但是基本原理都是相同的，下面将以Quake3的实现为例，简要介...</summary><published>2010-04-11T02:59:00Z</published><updated>2010-04-11T02:59:00Z</updated><author><name>cgwolver</name><uri>http://www.cnblogs.com/cgwolver/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cgwolver/archive/2010/04/11/1709394.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cgwolver/archive/2010/04/11/1709394.html"/><content type="html">&lt;span  style="font-family: 'lucida Grande', Verdana; line-height: 22px; "&gt;&lt;p  style="line-height: 22px; word-wrap: break-word; "&gt;&lt;span lang="EN-US"&gt;BSP&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;（&lt;/span&gt;&lt;span lang="EN-US"&gt;Binary Space Partition,&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;二叉空间分割）方法，在大型&lt;/span&gt;&lt;span lang="EN-US"&gt;3d&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;游戏场景管理方面，可以认为是已经证明了的，最成熟的，最经得起考验的场景管理方法。诸如虚幻系列引擎（&lt;/span&gt;&lt;span lang="EN-US"&gt;Unreal 1,2,3&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;），&lt;/span&gt;&lt;span lang="EN-US"&gt;ID&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;系列以及衍生产品（&lt;/span&gt;&lt;span lang="EN-US"&gt;Quake,DOOM,Half-Life2&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;），都采用了&lt;/span&gt;&lt;span lang="EN-US"&gt;BSP&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;方法来管理场景，尽管他们各自在实现上略有不同，但是基本原理都是相同的，下面将以&lt;/span&gt;&lt;span lang="EN-US"&gt;Quake3&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;的实现为例，简要介绍一下&lt;/span&gt;&lt;span lang="EN-US"&gt;BSP&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;的原理：&lt;/span&gt;&lt;/p&gt;&lt;p  style="line-height: 22px; word-wrap: break-word; "&gt;&lt;span lang="EN-US"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style="line-height: 22px; word-wrap: break-word; margin-left: 18pt; text-indent: -18pt; "&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;1.&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;选取分割平面：用这个平面将全部空间分成两个半空间，比如这个平面可以取简单凸体的侧表面，或者复杂物体（曲面或者静态模型）的&lt;/span&gt;&lt;span lang="EN-US"&gt;boundingbox&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;的侧表面，或者来自于等分格子的边界平面：假定所有参与分割的都是凸体表面；&lt;/span&gt;&lt;/p&gt;&lt;p  style="line-height: 22px; word-wrap: break-word; margin-left: 18pt; text-indent: 0cm; "&gt;&lt;span lang="EN-US"&gt;1&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;）每次取得分割平面后，都会将所有物体分为两组，所有物体的侧表面将分为&lt;/span&gt;&lt;span lang="EN-US"&gt;4&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;类：&lt;/span&gt;&lt;/p&gt;&lt;p  style="line-height: 22px; word-wrap: break-word; margin-left: 54pt; text-indent: -18pt; "&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;a）&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;位于平面之前的侧面&lt;/span&gt;&lt;/p&gt;&lt;p  style="line-height: 22px; word-wrap: break-word; margin-left: 15pt; text-indent: 21pt; "&gt;&lt;span lang="EN-US"&gt;b&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;）位于平面之后的侧面&lt;/span&gt;&lt;/p&gt;&lt;p  style="line-height: 22px; word-wrap: break-word; margin-left: 33pt; text-indent: 3pt; "&gt;&lt;span lang="EN-US"&gt;c&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;）和平面重合的侧面，根据朝向决定分到哪个子空间。&lt;/span&gt;&lt;/p&gt;&lt;p  style="line-height: 22px; word-wrap: break-word; margin-left: 30pt; text-indent: 6pt; "&gt;&lt;span lang="EN-US"&gt;d&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;）跨越平面两侧的侧面，用平面分割成两半，分别放入子空间。&lt;/span&gt;&lt;/p&gt;&lt;p  style="line-height: 22px; word-wrap: break-word; text-indent: 21pt; "&gt;&lt;span lang="EN-US"&gt;2&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;）分割平面评优原则：&lt;/span&gt;&lt;/p&gt;&lt;p  style="line-height: 22px; word-wrap: break-word; margin-left: 54pt; text-indent: -18pt; "&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;a）&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;位于平面之前和位于之后的侧面数量差尽可能小&lt;/span&gt;&lt;/p&gt;&lt;p  style="line-height: 22px; word-wrap: break-word; margin-left: 54pt; text-indent: -18pt; "&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;b）&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;和平面重合的侧面尽可能多&lt;/span&gt;&lt;/p&gt;&lt;p  style="line-height: 22px; word-wrap: break-word; margin-left: 54pt; text-indent: -18pt; "&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;c）&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;跨越平面两侧的平面尽可能少&lt;/span&gt;&lt;/p&gt;&lt;p  style="line-height: 22px; word-wrap: break-word; margin-left: 54pt; text-indent: -18pt; "&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;d）&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;轴对齐分割加分&lt;/span&gt;&lt;/p&gt;&lt;p  style="line-height: 22px; word-wrap: break-word; margin-left: 18pt; text-indent: -18pt; "&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;2.&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;在子空间的所有凸体侧面中选取分割平面，备选平面中选取一个平面来递归分割子空间。&lt;/span&gt;&lt;/p&gt;&lt;p  style="line-height: 22px; word-wrap: break-word; text-indent: 18pt; "&gt;&lt;span lang="EN-US"&gt;1&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;）递归结束的条件：是找不到分割平面为止。&lt;/span&gt;&lt;/p&gt;&lt;p  style="line-height: 22px; word-wrap: break-word; margin-left: 18pt; "&gt;&lt;span lang="EN-US"&gt;2&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;）控制二叉树的深度：可以采取以下策略，比如限定叶子结点的最小体积。当分割的子空间达到最小体积，或者树深到达了最大深度而又找不到更好的平面，也可以强行结束。因为太小的体积，人无法进入，也就没有比较继续分割，原则上叶子空间不小于可进入实体的体积；太大的树深，会增大定位叶子结点的开销。另外，控制平衡本身也会影响树深。&lt;/span&gt;&lt;/p&gt;&lt;p  style="line-height: 22px; word-wrap: break-word; margin-left: 18pt; text-indent: -18pt; "&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;3.&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;分割的最终结果：形成一个二分层次空间。每个子空间结点包含的必要信息：&lt;/span&gt;&lt;/p&gt;&lt;p  style="line-height: 22px; word-wrap: break-word; margin-left: 36pt; text-indent: -18pt; "&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;1）&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;分割平面&lt;/span&gt;&lt;/p&gt;&lt;p  style="line-height: 22px; word-wrap: break-word; margin-left: 36pt; text-indent: -18pt; "&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;2）&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;围成凸空间的顶点和侧面（不一定是可渲染得表面）&lt;/span&gt;&lt;/p&gt;&lt;p  style="line-height: 22px; word-wrap: break-word; margin-left: 36pt; text-indent: -18pt; "&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;3）&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;BRUSH&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;：属于自己的一组侧表面。&lt;/span&gt;&lt;/p&gt;&lt;p  style="line-height: 22px; word-wrap: break-word; margin-left: 36pt; text-indent: -18pt; "&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;4）&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;叶子结点无缝、网状连接。叶子空间形成一个&lt;/span&gt;&lt;span lang="EN-US"&gt;CELL&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;，&lt;/span&gt;&lt;span lang="EN-US"&gt;CELL&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;侧表面也可能是可以通过的&lt;/span&gt;&lt;span lang="EN-US"&gt;PORTAL&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;，也可能是实体表面。&lt;/span&gt;&lt;/p&gt;&lt;p  style="line-height: 22px; word-wrap: break-word; margin-left: 18pt; text-indent: -18pt; "&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;4.&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;运行时定位相机位置所在的叶子空间：从顶层开始，根据观察点相对分割平面前后关系确定在那个半空间，直到到达一个叶子结点。&lt;/span&gt;&lt;/p&gt;&lt;p  style="line-height: 22px; word-wrap: break-word; margin-left: 18pt; text-indent: -18pt; "&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;5.&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;渲染顺序：&lt;/span&gt;&lt;/p&gt;&lt;p  style="line-height: 22px; word-wrap: break-word; margin-left: 36pt; text-indent: -18pt; "&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;1）&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;不透明&lt;/span&gt;&lt;span lang="EN-US"&gt;PASS&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;：从相机所在叶子结点开始，从前往后绘制空间内包含的可渲染表面。&lt;/span&gt;&lt;/p&gt;&lt;p  style="line-height: 22px; word-wrap: break-word; margin-left: 36pt; text-indent: -18pt; "&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;2）&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;透明&lt;/span&gt;&lt;span lang="EN-US"&gt;PASS&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;：从相机所在叶子节点开始，从后往前绘制空间内包含的可渲染表面&lt;/span&gt;&lt;/p&gt;&lt;p  style="line-height: 22px; word-wrap: break-word; margin-left: 36pt; text-indent: -18pt; "&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;3）&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;在过去没有&lt;/span&gt;&lt;span lang="EN-US"&gt;Z BUFFER&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;的时代，可以采用一个&lt;/span&gt;&lt;span lang="EN-US"&gt;PASS&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;全部从后往前的顺序来保证正确的前后关系。现代显卡都有硬件&lt;/span&gt;&lt;span lang="EN-US"&gt;Z BUFFER&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;，所有对于不透明的&lt;/span&gt;&lt;span lang="EN-US"&gt;PASS&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;，可以从前往后绘制，来优化填充率。&lt;/span&gt;&lt;/p&gt;&lt;p  style="line-height: 22px; word-wrap: break-word; margin-left: 36pt; text-indent: -18pt; "&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;4）&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;每个&lt;/span&gt;&lt;span lang="EN-US"&gt;BSP&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;结点都有一个分割平面，每个分割平面连接两个结点，从相机所在叶子结点，找到兄弟节点，再找到父亲节点，递归的到达根节点。然后进入另一个分支，遍历完所有节点。&lt;/span&gt;&lt;/p&gt;&lt;p  style="line-height: 22px; word-wrap: break-word; margin-left: 18pt; text-indent: -18pt; "&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;6.&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;碰撞检测：有了网状连接的&lt;/span&gt;&lt;span lang="EN-US"&gt;CELL&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;，只需要检测活动实体所在得&lt;/span&gt;&lt;span lang="EN-US"&gt;CELL&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;周围的侧壁碰撞检测，以及位于&lt;/span&gt;&lt;span lang="EN-US"&gt;CELL&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;内的其他实体。大大缩小检测范围。&lt;/span&gt;&lt;/p&gt;&lt;p  style="line-height: 22px; word-wrap: break-word; margin-left: 18pt; text-indent: -18pt; "&gt;&lt;span lang="EN-US"&gt;&lt;span&gt;7.&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;PVS&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;：淹灌法找到每个&lt;/span&gt;&lt;span lang="EN-US"&gt;CELL&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;可以到达的&lt;/span&gt;&lt;span lang="EN-US"&gt;PORTAL&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;（注意，不是光线可以到达，是行走可以到达）。然后从行走可以到达的&lt;/span&gt;&lt;span lang="EN-US"&gt;PORTAL&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;集合中寻找光线可以到达的&lt;/span&gt;&lt;span lang="EN-US"&gt;PORTAL&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;；对于一个&lt;/span&gt;&lt;span lang="EN-US"&gt;CELL&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;来说，能够看到另一个&lt;/span&gt;&lt;span lang="EN-US"&gt;CELL&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;的&lt;/span&gt;&lt;span lang="EN-US"&gt;PORTAL&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;，说明可以看到那个&lt;/span&gt;&lt;span lang="EN-US"&gt;CELL&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;；水淹法得到的可行走到达的&lt;/span&gt;&lt;span lang="EN-US"&gt;CELL&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;可以用作&lt;/span&gt;&lt;span lang="EN-US"&gt;AI&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;判断是否可以到达，另外也也可以加速寻找光线可以到达的&lt;/span&gt;&lt;span lang="EN-US"&gt;cell&lt;/span&gt;&lt;span style="font-family: 宋体; "&gt;集合。&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;img src="http://www.cnblogs.com/cgwolver/aggbug/1709394.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cgwolver/archive/2010/04/11/1709394.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cgwolver/archive/2010/01/19/1651331.html</id><title type="text">[转]3dmax导出插件-tiamo</title><summary type="text">3dmax导出插件-tiamo　转自：http://www.gpgame.net/docs/program/3dmaxexporter.htm 新年第一贴,说说3dmax的导出插件 3dmax的导出插件是用来把做好的3d模型导出成自己引擎需要的格式的一个dll,它由3dmax加载调用.具体怎样去写一个插件,小T不多说,在3dmax的sdk里面有比较详细的介绍,在google上面也能搜索到不少的源代...</summary><published>2010-01-19T02:54:00Z</published><updated>2010-01-19T02:54:00Z</updated><author><name>cgwolver</name><uri>http://www.cnblogs.com/cgwolver/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cgwolver/archive/2010/01/19/1651331.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cgwolver/archive/2010/01/19/1651331.html"/></entry><entry><id>http://www.cnblogs.com/cgwolver/archive/2010/01/15/1648590.html</id><title type="text">about wingdip.h</title><summary type="text">inc\wingdi.x inc\wingdip.x: inc\wingdi.w hsplit -e -o inc\wingdi.x inc\wingdip.x inc\wingdi.winc\wingdip.h: inc\wingdip.x wcshdr &amp;lt; inc\wingdip.x &amp;gt; inc\wingdip.h$(SDKINC)\wingdi.h: inc\wingdi.x w...</summary><published>2010-01-15T06:45:00Z</published><updated>2010-01-15T06:45:00Z</updated><author><name>cgwolver</name><uri>http://www.cnblogs.com/cgwolver/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cgwolver/archive/2010/01/15/1648590.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cgwolver/archive/2010/01/15/1648590.html"/></entry></feed>
