その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

を選ぶ。

あと

  • SlimDX(Version4のx86/amd64どっちでもいい)

を選ぶ

保存してソリューションを閉じる。
ソリューションのディレクトリの中のプロジェクトのでぃくれぅとりの中にProject1.csprojがあるので開く。
先ほどSlimDXの参照を追加したところがあるので、
そこから

processorArchitecture=

という記述を削除する。x86amd64を自動選択するらしい?

ソリューションを開いてソースファイルを追加してマルッとコピペ。

using SlimDX.Windows;

namespace BasicWindow
{
    static class Program
    {
        static void Main()
        {
            var form = new RenderForm("Tutorial 1: Basic Window");

            MessagePump.Run(form, () => { });
        }
    }
}

以上で、第1回空ウインドウの生成が完了。

久しぶりにビルド・・・

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的にどういう操作するのかはよくわからない。

必要なリソース

blender.exeのあるディレクトリに

2.62
 + datafiles
 + python
 + scripts

ディレクトリをコピーする必要がある。
とりあえずblender-2.62-release-windows32.zipの中身をコピーすることで済ませた。

以上でdebugビルドを起動できた。

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 {
}