Load_Vertex Class

Dolphin Animation に適した Load_Vertex Class を作成します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

Load_Vertex Class

  1. Dolphin Animation は "dolphin1.x", "dolphin2.x", "dolphin3.x" の頂点データをブレンドしながらアニメーションします。
    頂点データとインデックスの領域は Load_X.cpp で次のように定義されています。
    頂点データをブレンドするには *Vertices を参照して演算します。
        VertexPosition *Vertices = new VertexPosition[vtx_size];
        unsigned short *Indices = new unsigned short[vtx_size];
    
    これらの領域はメッシュが生成されると削除されます。
    そこで Load_X Class を修正して Dolphin Animation に適した Load_Vertex Class を作成することにします。
    Load_Vertex.h と Load_Vertex.cpp をプロジェクトに加えて、Load_X.h と Load_X.cpp を削除して下さい。
  2. Load_Vertex.h に Destructor を追加します。
    public: で *m_Vertex, *m_Index, m_indexCount の領域を定義します。
    また Load() 関数のパラメータも修正して下さい。
        public:
            Load_Vertex(const std::shared_ptr<DX::DeviceResources>& deviceResources);
            ~Load_Vertex();
            void Load(Platform::String ^str);
            VertexPosition  *m_Vertex;
            unsigned short  *m_Index;
            uint32          m_indexCount;
    
  3. Load() 関数では *m_Vertex と *m_Index を設定したら終了します。
    void Load_Vertex::Load(Platform::String ^str)
    {
        ・・・
    
        // 法線ベクトルの計算
        if (m_idxN3.size()<vtx_size)
            ComputeNorm(m_Vertex, vtx_size);
    }
    
  4. Destructor を追加して *m_Vertex と *m_Index を開放します。
    Load_Vertex::~Load_Vertex()
    {
        if (m_Vertex)   delete m_Vertex;
        if (m_Index)    delete m_Index;
    }
    
  5. Sample3DSceneRenderer.cpp からモデルをロードします。
    Load() 関数では X-FILE の名前だけを渡します。
    CreateModel() は新しく追加した m_vertexBuffer と m_indexBuffer を生成する関数です。
        auto createCubeTask = (createPSTask && createVSTask).then([this] () {
            model = new Load_Vertex(m_deviceResources);
            model->Load("Dolphin1.x");
            CreateModel(model->m_Vertex, model->m_Index, model->m_indexCount);
        });
    
        // メッシュが読み込まれたら、オブジェクトを描画する準備が完了します。
        createCubeTask.then([this] () {
            m_loadingComplete = true;
        });
    
  6. m_vertexBuffer と m_indexBuffer を生成する CreateModel() 関数です。
    // モデルを生成
    void Sample3DSceneRenderer::CreateModel(
        VertexPosition *Vertices,
        uint16 *Indices,
        uint32 indexCount)
    {
        D3D11_SUBRESOURCE_DATA vertexBufferData = { 0 };
        vertexBufferData.pSysMem = Vertices;
        vertexBufferData.SysMemPitch = 0;
        vertexBufferData.SysMemSlicePitch = 0;
        CD3D11_BUFFER_DESC vertexBufferDesc(sizeof(VertexPosition)*indexCount, D3D11_BIND_VERTEX_BUFFER);
        DX::ThrowIfFailed(
            m_deviceResources->GetD3DDevice()->CreateBuffer(
                &vertexBufferDesc,
                &vertexBufferData,
                &m_vertexBuffer
            ));
    
        D3D11_SUBRESOURCE_DATA indexBufferData = { 0 };
        indexBufferData.pSysMem = Indices;
        indexBufferData.SysMemPitch = 0;
        indexBufferData.SysMemSlicePitch = 0;
        CD3D11_BUFFER_DESC indexBufferDesc(indexCount * 2, D3D11_BIND_INDEX_BUFFER);
        DX::ThrowIfFailed(
            m_deviceResources->GetD3DDevice()->CreateBuffer(
                &indexBufferDesc,
                &indexBufferData,
                &m_indexBuffer));
    }
    
  7. カリングの設定は Render() 関数で行います。
        // カリング設定
        D3D11_RASTERIZER_DESC rasterizerDesc;
        ZeroMemory(&rasterizerDesc, sizeof(D3D11_RASTERIZER_DESC));
        //rasterizerDesc.CullMode = D3D11_CULL_BACK;
        rasterizerDesc.CullMode = D3D11_CULL_FRONT;
        rasterizerDesc.FillMode = D3D11_FILL_SOLID;
        rasterizerDesc.DepthClipEnable = FALSE;
        rasterizerDesc.MultisampleEnable = TRUE;
        rasterizerDesc.DepthBiasClamp = 0;
        rasterizerDesc.SlopeScaledDepthBias = 0;
        DX::ThrowIfFailed(
            m_deviceResources->GetD3DDevice()->CreateRasterizerState(
                &rasterizerDesc, &m_RasterizerState));
        context->RSSetState(m_RasterizerState);
    
        // オブジェクトを描画します。
        context->DrawIndexed(model->m_indexCount, 0, 0);
    }
    
  8. Update() と Rotate() 関数は変わりません。
    CreateModel() 関数で m_vertexBuffer と m_indexBuffer が設定されているので Dolphin1.x が描画されます。

[Next Chapter ↓] Animation
[Previous Chapter ↑] Dolphin Model

超初心者のプログラム入門(DirectX Store)