その3。サンプルのビルド
samples/Samples_Express.sln
をVC#2010 ExpressEditionで開く(ダブルクリックだと何故か開かないので、vc#のファイルを開くを使う)。
ソリューションに含まれる各プロジェクトで
参照コンポーネント'SlimDX'が見つかりませんと出る。
インストールしてあるSlimDXとバージョンがあっていないようだ。
参照で!マークのついているSlimDXを削除して、インストールしてあるSlimDXを追加しなおす。
"*.csproj"の内容を直接置換しても直せた。
SlimDX, Version=2.0.12.43
↓
SlimDX, Version=2.0.13.43
blender2.63でimprter/exporterプラグインに必要な修正
Blender2.63でBMeshが組み込まれて4角形より多いNゴンが可能になった。
その影響でAPIが変更されているようだが、インポータ/エクスポータは少し修正するだけで対応できる。
まず、Meshクラスの変数名が変更になったところ。
mesh.faces -> mesh.tessfaces mesh.uv_textures -> mesh.tessface_uv_textures mesh.vertex_colors -> mesh.tessface_vertex_colors
次にエクスポータで必要なtessfacesを生成する方法。
mesh.update(calc_tessface=True)
詳しくは、
を読むべし。
bpy.types.Mesh
その2
本家サイトのチュートリアルその3に目を通してDirectX11で三角形を表示した。たぶん説明が丁寧すぎるのが原因でチュートリアルは三角形で打ち止めになっているw
DirectX9の小さいサンプルを見つけた。
動いた。
サンプルを求めて本家のリポジトリをチェックアウト
samplesにいろいろ発見
Direct2D/ Direct3D10/ Direct3D11/ Direct3D9/ DirectInput/ DirectSound/ DirectWrite/ RawInput/ SampleFramework/ Samples.sln Samples_Express.sln XAudio2/
今日はここまで
SlimDXはじめてみる
ちょっと気になったのではじめてみる。
チュートリアルの細かいところで詰まったのでメモを残す。
Windows7にVC#2010 ExpressEditionが入っている。
http://slimdx.org/download.php
からdevelopers SDKをダウンロードしてインストールする。
まずはチュートリアルから。
http://slimdx.org/tutorials/BasicWindow.php
一番下にサンプルソースがあるので、ダウンロードしてvc#で実行してみる。
うまく動いたらチュートリアルの先頭からやってみる。
C#のプロジェクトを作成。空を選択。
ソリューションエクスプローラの参照設定を右クリックして、参照の追加を選ぶ。.NETタブから
- System
- System.Drawing
- SYstem.WIndows.Forms
を選ぶ。
あと
を選ぶ
保存してソリューションを閉じる。
ソリューションのディレクトリの中のプロジェクトのでぃくれぅとりの中にProject1.csprojがあるので開く。
先ほどSlimDXの参照を追加したところがあるので、
そこから
processorArchitecture=
という記述を削除する。x86とamd64を自動選択するらしい?
ソリューションを開いてソースファイルを追加してマルッとコピペ。
using SlimDX.Windows; namespace BasicWindow { static class Program { static void Main() { var form = new RenderForm("Tutorial 1: Basic Window"); MessagePump.Run(form, () => { }); } } }
以上で、第1回空ウインドウの生成が完了。
配列から逆引きマップを作る
memo
boneMap=dict([(b.name, i) for i, b in enumerate(bones)])
久しぶりにビルド・・・
Windows7(64bit)上のVC2010express editionでcmakeを使ってビルド。
http://wiki.blender.org/index.php/Dev:2.5/Doc/Building_Blender/Windows
に書いてあるとおりでおおむねいけるが微妙に手を入れる必要があった。
cmakeでsvnでチェックアウトしたソースからvcソリューションを作成。
configオプションのOPENEXRのチェックをはずす。
OpenEXRは以前からビルドしにくい問題を抱えているのだがなんとかならんのかね・・・
で、ソリューションからvcを起動してビルドするとcp932がどうこうという警告がたくさん出て、下記のファイルではエラーになる。
source/blender/makesdna/DNA_modifier_types.h
の
ordered - provided
というコメントの-が謎の全角文字になっているのでこれを消すとコンパイルは通る。
必要なdllをコピーする
BUILD_DIR/bin/DEBUG/blender.exe
を起動するにはblender.exeがアクセスできるところにこの辺のdllを配置する必要がある。
svn/lib/windows/binaries/gettext/libasprintf-0.dll svn/lib/windows/binaries/gettext/libgcc_s_dw2-1.dll svn/lib/windows/binaries/gettext/libgettextlib-0-18-1.dll svn/lib/windows/binaries/gettext/libgettextpo-0.dll svn/lib/windows/binaries/gettext/libgettextsrc-0-18-1.dll svn/lib/windows/binaries/gettext/libgomp-1.dll svn/lib/windows/binaries/gettext/libiconv-2.dll svn/lib/windows/binaries/gettext/libintl-8.dll svn/lib/windows/binaries/gettext/libstdc++-6.dll svn/lib/windows/binaries/gettext/pthreadGC2.dll svn/lib/windows/CRTL/lib/msvcrtd.dll svn/lib/windows/ffmpeg/lib/avcodec-53.dll svn/lib/windows/ffmpeg/lib/avdevice-53.dll svn/lib/windows/ffmpeg/lib/avformat-53.dll svn/lib/windows/ffmpeg/lib/avutil-51.dll svn/lib/windows/ffmpeg/lib/swscale-2.dll svn/lib/windows/gcc/sdl/lib/SDL.dll svn/lib/windows/gettext/lib/gnu_gettext.dll svn/lib/windows/iconv/lib/iconv.dll svn/lib/windows/openal/lib/OpenAL32.dll svn/lib/windows/openal/lib/wrap_oal.dll svn/lib/windows/openimageio/bin/OpenImageIO.dll svn/lib/windows/pthreads/lib/pthreadGC2.dll svn/lib/windows/pthreads/lib/pthreadGCE2.dll svn/lib/windows/pthreads/lib/pthreadVC2.dll svn/lib/windows/pthreads/lib/pthreadVSE2.dll svn/lib/windows/python/lib/python32.dll svn/lib/windows/python/lib/python32_d.dll svn/lib/windows/sdl/lib/SDL.dll svn/lib/windows/sdl/vs2003/lib/SDL.dll svn/lib/windows/sndfile/lib/libsndfile-1.dll svn/lib/windows/thumbhandler/lib/BlendThumb.dll svn/lib/windows/thumbhandler/lib/BlendThumb64.dll svn/lib/windows/vc2010/python/lib/python32.dll svn/lib/windows/vc2010/python/lib/python32_d.dll svn/lib/windows/zlib/lib/zlib.dll
BUILD_DIR/bin/DEBUG
にコピーした。
で、起動すると
アプリケーションを正しく初期化できませんでした0xc0000022
と出た。
cygwinで上記のdll群に
$ chmod 755 *.dll
したらエラーが出なくなった。Windows的にどういう操作するのかはよくわからない。
win32apiのメモ
#include <windows.h> #include <assert.h> #include <memory> #include <string> class Window { HWND hwnd_; public: Window() : hwnd_(0) { } void setHwnd(HWND hwnd) { hwnd_=hwnd; } void show() { ShowWindow(hwnd_, SW_SHOWNORMAL); UpdateWindow(hwnd_); } LRESULT WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); RECT rect; GetClientRect(hwnd, &rect); DrawText(hdc, "Hello Windows" , -1, &rect, DT_SINGLELINE|DT_CENTER|DT_VCENTER); EndPaint(hwnd, &ps); return 0; } case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc(hwnd, message, wParam, lParam); } } static LRESULT CALLBACK WndProcProxy( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { return ((Window*)GetWindowLongPtr( hwnd, GWL_USERDATA))->WndProc(hwnd, message, wParam, lParam); } }; class WindowFactory { public: WindowFactory() { } bool register_class(const std::string &className) { WNDCLASSEX wndclass; ZeroMemory(&wndclass, sizeof(wndclass)); wndclass.cbSize=sizeof(WNDCLASSEX); wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WindowFactory::WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = GetModuleHandle(NULL); wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = className.c_str(); return RegisterClassEx(&wndclass)!=0; } std::shared_ptr<Window> create(const std::string &title, const std::string &className) { std::shared_ptr<Window> window(new Window()); HWND hwnd=CreateWindowEx(0, className.c_str(), title.c_str(), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, GetModuleHandle(NULL), window.get()); if(hwnd==0){ return std::shared_ptr<Window>(); } window->setHwnd(hwnd); return window; } static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_CREATE: { Window *window=(Window*)((LPCREATESTRUCT)lParam)->lpCreateParams; SetWindowLongPtr(hwnd, GWL_USERDATA, (LONG_PTR)window); SetWindowLongPtr(hwnd, GWL_WNDPROC, (LONG_PTR)Window::WndProcProxy); return window->WndProc(hwnd, message, wParam, lParam); } case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc(hwnd, message, wParam, lParam); } } static int loop() { MSG msg; while(GetMessage(&msg, NULL, 0, 0) != 0){ TranslateMessage(&msg); DispatchMessageA(&msg); } return msg.wParam; } }; int WINAPI WinMain( HINSTANCE hInstance , HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nCmdShow ) { auto CLASS_NAME="HelloWindow"; WindowFactory factory; if(!factory.register_class(CLASS_NAME)){ return 1; } std::shared_ptr<Window> window=factory.create("Hello Window", CLASS_NAME); if(!window){ return 2; } window->show(); return WindowFactory::loop(); }
Windowクラスのメモ
premake4.lua
-- A solution contains projects, and defines the available configurations solution "Sample" configurations { "Release", "Debug" } configuration "gmake Debug" do buildoptions { "-g" } linkoptions { "-g" } end configuration "gmake" do buildoptions { "-Wall", } end configuration "gmake windows" do buildoptions { "-U__CYGWIN__", } end configuration "vs*" do linkoptions { "/NODEFAULTLIB:LIBCMT" } end configuration "windows*" do defines { 'WIN32', '_WIN32', '_WINDOWS', } end configuration "Debug" do defines { "DEBUG" } flags { "Symbols" } targetdir "debug" end configuration "Release" do defines { "NDEBUG" } flags { "Optimize" } targetdir "release" end configuration {} ------------------------------------------------------------------------------ -- Project ------------------------------------------------------------------------------ project "Sample" --language "C" language "C++" --kind "StaticLib" --kind "DynamicLib" --kind "ConsoleApp" kind "WindowedApp" flags { "WinMain", } files { "**.cpp", "**.h", } defines { } includedirs { } libdirs { } links { }