Sign in to follow this  
Ubermeowmix

DX11 DirectX, why can't I do this?

Recommended Posts

Looking specifically for why I can't call these two seperate functions:
 
LoadString( );
LoadSprite( );
 
It compiles but the Fon't aren't there!?
 

#include "D3DTextDemo.h"

#include <xnamath.h>



struct VertexPos

{

    XMFLOAT3 pos;

    XMFLOAT2 tex0;

};



D3DTextDemo::D3DTextDemo( ) : solidColorVS_( 0 ),

                              solidColorPS_( 0 ),

                              inputLayout_( 0 ),

                              vertexBuffer_( 0 ),

                              colorMap_( 0 ),

                              colorMapSampler_( 0 ),



                              iCurrMouseButton( 0 ),

                              bMousePressed( false ),



                              mvpCB_( 0 ),

                              alphaBlendState_( 0 ),

                              spriteTooBig( false )

{

}



D3DTextDemo::~D3DTextDemo( )

{



}



bool D3DTextDemo::LoadContent( )

{

    LoadString( );



    LoadSprite( );



    return true;

}



bool D3DTextDemo::LoadString()

{

    ID3DBlob* vsBuffer = 0;



    bool compileResult = CompileD3DShader( "TextureMap.fx",

                                           "VS_Main",

                                           "vs_4_0",

                                           &vsBuffer );



    if( compileResult == false )

    {

        MessageBox(0,

                   "Error loading vertex shader!",

                   "Compile Error",

                   MB_OK );

        return false;

    }



    HRESULT d3dResult;



    d3dResult = d3dDevice_->CreateVertexShader( vsBuffer->GetBufferPointer( ),

                                                vsBuffer->GetBufferSize( ),

                                                0,

                                                &solidColorVS_ );



    if( FAILED( d3dResult ) )

    {

        if( vsBuffer )

            vsBuffer->Release( );



        return false;

    }



    D3D11_INPUT_ELEMENT_DESC solidColorLayout[] =

    {

        {

            "POSITION",

            0,

            DXGI_FORMAT_R32G32B32_FLOAT,

            0,

            0,

            D3D11_INPUT_PER_VERTEX_DATA,

            0

        },

        {

            "TEXCOORD",

            0,

            DXGI_FORMAT_R32G32_FLOAT,

            0,

            12,

            D3D11_INPUT_PER_VERTEX_DATA,

            0

        }

    };



    unsigned int totalLayoutElements = ARRAYSIZE( solidColorLayout );



    d3dResult = d3dDevice_->CreateInputLayout( solidColorLayout,

                                               totalLayoutElements,

                                               vsBuffer->GetBufferPointer( ),

                                               vsBuffer->GetBufferSize( ),

                                               &inputLayout_ );



    vsBuffer->Release( );



    if( FAILED( d3dResult ) )

    {

        return false;

    }



    ID3DBlob* psBuffer = 0;



    compileResult = CompileD3DShader( "TextureMap.fx",

                                      "PS_Main",

                                      "ps_4_0",

                                      &psBuffer );



    if( compileResult == false )

    {

        MessageBox(0,

                   "Error loading pixel shader!",

                   "Compile error",

                   MB_OK );

        return false;

    }



    d3dResult = d3dDevice_->CreatePixelShader( psBuffer->GetBufferPointer( ),

                                               psBuffer->GetBufferSize( ),

                                               0,

                                               &solidColorPS_ );



    psBuffer->Release( );



    if( FAILED( d3dResult ) )

    {

        return false;

    }



    d3dResult = D3DX11CreateShaderResourceViewFromFile( d3dDevice_,

                                                        "KKfont.dds",

                                                        0,

                                                        0,

                                                        &colorMap_,

                                                        0 );

    if( FAILED( d3dResult ) )

    {

        DXTRACE_MSG( "Failed to load the texture image!" );

        return false;

    }



    D3D11_SAMPLER_DESC colorMapDesc;

    ZeroMemory( &colorMapDesc, sizeof( colorMapDesc ) );

    colorMapDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;

    colorMapDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;

    colorMapDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;

    colorMapDesc.ComparisonFunc = D3D11_COMPARISON_NEVER;

    colorMapDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;

    colorMapDesc.MaxLOD = D3D11_FLOAT32_MAX;



    d3dResult = d3dDevice_->CreateSamplerState( &colorMapDesc,

                                                &colorMapSampler_ );



    if( FAILED( d3dResult ) )

    {

        DXTRACE_MSG( "Failed to create color map sampler state!" );

        return false;

    }



    D3D11_BUFFER_DESC vertexDesc;

    ZeroMemory( &vertexDesc, sizeof( vertexDesc ) );

    vertexDesc.Usage = D3D11_USAGE_DYNAMIC;

    vertexDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;

    vertexDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;



    const int sizeOfSprite = sizeof( VertexPos ) * 6;

    //const int maxLetters = 300;



    vertexDesc.ByteWidth = sizeOfSprite * maxLetters;



    d3dResult = d3dDevice_->CreateBuffer( &vertexDesc, 0, &vertexBuffer_ );



    if( FAILED( d3dResult ) )

    {

        DXTRACE_MSG( "Failed to create the vertex buffer!" );

        return false;

    }



    return true;

}



bool D3DTextDemo::LoadSprite()

{

    ID3DBlob* vsBuffer = 0;



    bool compileResult = CompileD3DShader( "TextureMapSprite.fx", "VS_Main", "vs_4_0", &vsBuffer );



    if( compileResult == false )

    {

        DXTRACE_MSG( "Error compiling the vertex shader!" );

        return false;

    }



    HRESULT d3dResult;



    d3dResult = d3dDevice_->CreateVertexShader( vsBuffer->GetBufferPointer( ),

        vsBuffer->GetBufferSize( ), 0, &solidColorVS_ );



    if( FAILED( d3dResult ) )

    {

        DXTRACE_MSG( "Error creating the vertex shader!" );



        if( vsBuffer )

            vsBuffer->Release( );



        return false;

    }



    D3D11_INPUT_ELEMENT_DESC solidColorLayout[] =

    {

        { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },

        { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }

    };



    unsigned int totalLayoutElements = ARRAYSIZE( solidColorLayout );



    d3dResult = d3dDevice_->CreateInputLayout( solidColorLayout, totalLayoutElements,

        vsBuffer->GetBufferPointer( ), vsBuffer->GetBufferSize( ), &inputLayout_ );



    vsBuffer->Release( );



    if( FAILED( d3dResult ) )

    {

        DXTRACE_MSG( "Error creating the input layout!" );

        return false;

    }



    ID3DBlob* psBuffer = 0;



    compileResult = CompileD3DShader( "TextureMap.fx",

                                      "PS_Main",

                                      "ps_4_0",

                                      &psBuffer );



    if( compileResult == false )

    {

        DXTRACE_MSG( "Error compiling pixel shader!" );

        return false;

    }



    d3dResult = d3dDevice_->CreatePixelShader( psBuffer->GetBufferPointer( ),

                                               psBuffer->GetBufferSize( ),

                                               0,

                                               &solidColorPS_ );



    psBuffer->Release( );



    if( FAILED( d3dResult ) )

    {

        DXTRACE_MSG( "Error creating pixel shader!" );

        return false;

    }



    d3dResult = D3DX11CreateShaderResourceViewFromFile( d3dDevice_,

        "Waiter_001.dds", 0, 0, &colorMap_, 0 );



    if( FAILED( d3dResult ) )

    {

        DXTRACE_MSG( "Failed to load the texture image!" );

        return false;

    }



    D3D11_SAMPLER_DESC colorMapDesc;

    ZeroMemory( &colorMapDesc, sizeof( colorMapDesc ) );

    colorMapDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;

    colorMapDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;

    colorMapDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;

    colorMapDesc.ComparisonFunc = D3D11_COMPARISON_NEVER;

    colorMapDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;

    colorMapDesc.MaxLOD = D3D11_FLOAT32_MAX;



    d3dResult = d3dDevice_->CreateSamplerState( &colorMapDesc, &colorMapSampler_ );



    if( FAILED( d3dResult ) )

    {

        DXTRACE_MSG( "Failed to create color map sampler state!" );

        return false;

    }



    ID3D11Resource* colorTex;

    colorMap_->GetResource( &colorTex);



    D3D11_TEXTURE2D_DESC colorTexDesc;

    ( ( ID3D11Texture2D* )colorTex )->GetDesc( &colorTexDesc );

    colorTex->Release( );



    float halfWidth = ( float )colorTexDesc.Width / 2.0f;

    float halfHeight = ( float )colorTexDesc.Height / 2.0f;



    VertexPos vertices[] =

    {

        { XMFLOAT3(  halfWidth,  halfHeight, 1.0f ), XMFLOAT2( 1.0f, 0.0f ) },

        { XMFLOAT3(  halfWidth, -halfHeight, 1.0f ), XMFLOAT2( 1.0f, 1.0f ) },

        { XMFLOAT3( -halfWidth, -halfHeight, 1.0f ), XMFLOAT2( 0.0f, 1.0f ) },



        { XMFLOAT3( -halfWidth, -halfHeight, 1.0f ), XMFLOAT2( 0.0f, 1.0f ) },

        { XMFLOAT3( -halfWidth,  halfHeight, 1.0f ), XMFLOAT2( 0.0f, 0.0f ) },

        { XMFLOAT3(  halfWidth,  halfHeight, 1.0f ), XMFLOAT2( 1.0f, 0.0f ) },

    };



    D3D11_BUFFER_DESC vertexDesc;

    ZeroMemory( &vertexDesc, sizeof( vertexDesc ) );

    vertexDesc.Usage = D3D11_USAGE_DEFAULT;

    vertexDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;

    vertexDesc.ByteWidth = sizeof( VertexPos ) * 6;



    D3D11_SUBRESOURCE_DATA resourceData;

    ZeroMemory( &resourceData, sizeof( resourceData ) );

    resourceData.pSysMem = vertices;



    d3dResult = d3dDevice_->CreateBuffer( &vertexDesc,

                                          &resourceData,

                                          &vertexBuffer_ );



    if( FAILED( d3dResult ) )

    {

        DXTRACE_MSG( "Failed to create vertex buffer!" );

        return false;

    }



    D3D11_BUFFER_DESC constDesc;

    ZeroMemory( &constDesc, sizeof( constDesc ) );

    constDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;

    constDesc.ByteWidth = sizeof( XMMATRIX );

    constDesc.Usage = D3D11_USAGE_DEFAULT;



    d3dResult = d3dDevice_->CreateBuffer( &constDesc,

                                          0,

                                          &mvpCB_ );



    if( FAILED( d3dResult ) )

    {

        return false;

    }



    XMFLOAT2 sprite1Pos( 0.0f, 0.0f );

    XMFLOAT2 sprite1ScaleMod( 1.0f, 1.0f );



    sprites_[0].SetPosition( sprite1Pos );

    sprites_[0].SetScale( sprite1ScaleMod );

    sprites_[0].SetDimensions( Dx11DemoBase::GetWindowWidth( ), Dx11DemoBase::GetWindowHeight( ), ( float )colorTexDesc.Width, ( float )colorTexDesc.Height );



    XMFLOAT2 sprite2Pos( 640.0, 480.0f );

    sprites_[1].SetPosition( sprite2Pos );

    sprites_[1].SetScale( sprite1ScaleMod );

    sprites_[1].SetDimensions( Dx11DemoBase::GetWindowWidth( ), Dx11DemoBase::GetWindowHeight( ), ( float )colorTexDesc.Width, ( float )colorTexDesc.Height );



    XMMATRIX view = XMMatrixIdentity( );

    XMMATRIX projection = XMMatrixOrthographicOffCenterLH( 0.0f, 800.0f, 0.0f, 600.0f, 0.1f, 100.0f );



    vpMatrix_ = XMMatrixMultiply( view, projection );



    D3D11_BLEND_DESC blendDesc;

    ZeroMemory( &blendDesc, sizeof( blendDesc ) );

    blendDesc.RenderTarget[0].BlendEnable = TRUE;

    blendDesc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;

    blendDesc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;

    blendDesc.RenderTarget[0].DestBlend = D3D11_BLEND_ONE;

    blendDesc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;

    blendDesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ZERO;

    blendDesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO;

    blendDesc.RenderTarget[0].RenderTargetWriteMask = 0x0f;



    float blendFactor[4] = { 0.0f, 0.0f, 0.0f, 0.0f };



    d3dDevice_->CreateBlendState( &blendDesc,

                                  &alphaBlendState_ );

    d3dContext_->OMSetBlendState( alphaBlendState_,

                                  blendFactor,

                                  0xFFFFFFFF );



    return true;

}





bool D3DTextDemo::DrawString( const char* message, float startX, float startY )

{

    // size in bytes for a single sprite

    const int sizeOfSrite = sizeof( VertexPos ) * 6;



    // demo's dynamic buffer set up for max letters

    //const int maxLetters = 300;



    int length = strlen( message );



    //clamp for strings too long

    if( length > maxLetters )

        length = maxLetters;



    //chars width on screen

    // this could be pulled in for the height of the loaded font if it's a single line, or even divided by itself if it can be squared.

    float charWidth = 32.0f / 800.0f;

    float charHeight = 32.0f / 600.0f;



    //chars texel width

    // this could be pulled in for the width of the loaded font

    float texelWidth = 32.0f / 1024.0f;

    float texelHeight = 32.0f / 96.0f;



    //verts per-triangle (3) * total triangles (2) = 6

    const int verticesPerLetter = 6;



    D3D11_MAPPED_SUBRESOURCE mapResource;

    HRESULT d3dResult = d3dContext_->Map( vertexBuffer_,

                                          0,

                                          D3D11_MAP_WRITE_DISCARD,

                                          0,

                                          &mapResource );



    if( FAILED( d3dResult ) )

    {

        DXTRACE_MSG( "Failed to map resource!" );

        return false;

    }



    //point to our vertex buffer's internal data.

    VertexPos *spritePtr = ( VertexPos* )mapResource.pData;



    const int indexStart = static_cast<char>( ' ' );

    const int indexEnd = static_cast<char>( '~' );



    int iCurrLetterInc = 0;

    int iLineCount = 0;

    int iLineReset = 0;

    int iCurrCrop = 45;

    

    std::stringstream wss;

    for( int i = 0; i < length; ++i )                                        //FOR LOOP to check each character in message

    {

        //if current char count is over #

            //then increment the line number to X

            //reset the current startX to zero

                //increment the values of startY to incorporate an extra multiple of height

        //set the code going again



        if(iCurrLetterInc >= iCurrCrop)                                    //if i is greater than iCurrCrop, increment the line

        {

            iLineCount++;

            iCurrLetterInc = 0;

        }



        int newX = iLineCount * iCurrCrop;

        

        float thisStartX = startX + ( charWidth * static_cast<float>( i - newX ) );

        float thisEndX = thisStartX + charWidth;



        float thisStartY = startY - ( iLineCount * charHeight );                    //because of multiple lines the thisStartY will be lower everytime we start a new line

        float thisEndY = ( startY + charHeight ) - ( iLineCount * charHeight );        //VERY IMPORTANT... the second brackets mean that they are doubling up the x value in the down direction, otherwise it will turn the polygon away from the camera.



        /*

        wss << "i: ";

        wss << i;

        wss << ", ";

        wss << "newX: ";

        wss << newX;

        wss << ", ";

        */



        spritePtr[0].pos = XMFLOAT3( thisEndX,        thisEndY,        1.0f );

        spritePtr[1].pos = XMFLOAT3( thisEndX,        thisStartY,        1.0f );

        spritePtr[2].pos = XMFLOAT3( thisStartX,    thisStartY,        1.0f );

        spritePtr[3].pos = XMFLOAT3( thisStartX,    thisStartY,        1.0f );

        spritePtr[4].pos = XMFLOAT3( thisStartX,    thisEndY,        1.0f );

        spritePtr[5].pos = XMFLOAT3( thisEndX,        thisEndY,        1.0f );



        int texLookup = 0;

        int letter = static_cast<char>( message[i] );



        if( letter < indexStart || letter > indexEnd )

        {

            texLookup = indexStart;                                    //if it's out of bounds use a space

        } else {

            texLookup = ( letter - indexStart ) ;

        }



        float tuStart    = 0.0f;

        float tuEnd        = 0.0f;

        float tuTop        = 0.0f;

        float tuBottom    = 0.0f;



        if( letter > 63 )                                            //if letter is > ?(1024 pixel width 1st line ends) but less than ~ (third row's start)

        {

            if ( letter > 95 )

            {

                tuStart = 0.0f + ( texelWidth * static_cast<float>( texLookup ) );

                tuEnd = tuStart + texelWidth;



                tuTop = 0.0f + ( texelHeight * 2 );

                tuBottom = tuTop + texelHeight;                        //OutputDebugString( "THIRD LINE LOADED!\n" );

            } else {

                tuStart = 0.0f + ( texelWidth * static_cast<float>( texLookup ) );

                tuEnd = tuStart + texelWidth;



                tuTop = 0.0f + ( texelHeight * 1 );

                tuBottom = tuTop + texelHeight;                        //OutputDebugString( "SECOND LINE LOADED!\n" );

            }

        } else {

            tuStart = 0.0f + ( texelWidth * static_cast<float>( texLookup ) );

            tuEnd = tuStart + texelWidth;



            tuTop = 0.0f;

            tuBottom = tuTop + texelHeight;                            //OutputDebugString( "FIRST LINE LOADED!\n" );

        }



        spritePtr[0].tex0 = XMFLOAT2( tuEnd, tuTop );

        spritePtr[1].tex0 = XMFLOAT2( tuEnd, tuBottom );

        spritePtr[2].tex0 = XMFLOAT2( tuStart, tuBottom );

        spritePtr[3].tex0 = XMFLOAT2( tuStart, tuBottom );

        spritePtr[4].tex0 = XMFLOAT2( tuStart, tuTop );

        spritePtr[5].tex0 = XMFLOAT2( tuEnd, tuTop );



        spritePtr += 6;

        iCurrLetterInc++;

    }

    OutputDebugString( wss.str().c_str()  );

    

    d3dContext_->Unmap( vertexBuffer_, 0 );

    d3dContext_->Draw( 6 * length, 0 );



    return true;

}



void D3DTextDemo::UnloadContent( )

{

    if( colorMapSampler_ ) colorMapSampler_->Release( );

    if( colorMap_ ) colorMap_->Release( );

    if( solidColorVS_ ) solidColorVS_->Release( );

    if( solidColorPS_ ) solidColorPS_->Release( );

    if( inputLayout_ ) inputLayout_->Release( );

    if( vertexBuffer_ ) vertexBuffer_->Release( );



    if( mvpCB_ ) mvpCB_->Release( );

    if( alphaBlendState_ ) alphaBlendState_->Release( );



    colorMapSampler_ = 0;

    colorMap_ = 0;

    solidColorVS_ = 0;

    solidColorPS_ = 0;

    inputLayout_ = 0;

    vertexBuffer_ = 0;



    mvpCB_ = 0;

    alphaBlendState_ = 0;

}



void D3DTextDemo::Update( float dt )

{

    mouseDevice_->GetDeviceState( sizeof ( mouseState_ ),

                                     ( LPVOID )&mouseState_ );



    /*

        MOUSE STATE

    //constants for mouse buttons (NEW)

    #define DIMOUSE_LEFTBUTTON   0

    #define DIMOUSE_RIGHTBUTTON  1

    #define DIMOUSE_MIDDLEBUTTON 2

    #define DIMOUSE_4BUTTON      3

    #define DIMOUSE_5BUTTON      4

    #define DIMOUSE_6BUTTON      5

    #define DIMOUSE_7BUTTON      6

    #define DIMOUSE_8BUTTON      7

    */



    if( BUTTONDOWN( mouseState_, 0 ) )

    {

        iCurrMouseButton = 0;

        bMousePressed = true;

    }

    else if ( BUTTONDOWN( mouseState_, 1 ) )

    {

        iCurrMouseButton = 1;

        bMousePressed = true;

    }

    else if ( BUTTONDOWN( mouseState_, 2 ) )

    {

        iCurrMouseButton = 2;

        bMousePressed = true;

    }

    else if ( BUTTONDOWN( mouseState_, 3 ) )

    {

        iCurrMouseButton = 3;

        bMousePressed = true;

    }

    else if ( BUTTONDOWN( mouseState_, 4 ) )

    {

        iCurrMouseButton = 4;

        bMousePressed = true;

    }

    else if ( BUTTONDOWN( mouseState_, 5 ) )

    {

        iCurrMouseButton = 5;

        bMousePressed = true;

    }

    else if ( BUTTONDOWN( mouseState_, 6 ) )

    {

        iCurrMouseButton = 6;

        bMousePressed = true;

    }

    else if ( BUTTONDOWN( mouseState_, 7 ) )

    {

        iCurrMouseButton = 7;

        bMousePressed = true;

    } else {

        bMousePressed = false;

    }

    

    memcpy( &prevMouseState_,                //take note that this is a reference

            &mouseState_,                    //take note that this is a reference

            sizeof( mouseState_ ) );



}



void D3DTextDemo::Render( )

{

    if( d3dContext_ == 0 )

        return;



    float clearColor[4] = { 0.2f, 0.22f, 0.24f, 1.0f };

    d3dContext_->ClearRenderTargetView( backBufferTarget_,

                                        clearColor );

    unsigned int stride = sizeof( VertexPos );

    unsigned int offset = 0;



    d3dContext_->IASetInputLayout( inputLayout_ );

    d3dContext_->IASetVertexBuffers( 0,

                                     1,

                                     &vertexBuffer_,

                                     &stride,

                                     &offset );



    d3dContext_->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST );

    d3dContext_->VSSetShader( solidColorVS_,

                              0,

                              0 );



    d3dContext_->PSSetShader( solidColorPS_,

                              0,

                              0 );



    d3dContext_->PSSetShaderResources( 0,

                                       1,

                                       &colorMap_  );



    d3dContext_->PSSetSamplers( 0,

                                1,

                                &colorMapSampler_ );

    



    for( int i = 0; i < 2; i++)

    {

        XMMATRIX world = sprites_[i].GetWorldMatrix( );

        XMMATRIX mvp = XMMatrixMultiply( world, vpMatrix_ );

        mvp = XMMatrixTranspose( mvp );



        d3dContext_->UpdateSubresource( mvpCB_,

                                        0,

                                        0,

                                        &mvp,

                                        0,

                                        0 );

        d3dContext_->VSSetConstantBuffers( 0,

                                           1,

                                           &mvpCB_ );



        d3dContext_->Draw( 6, 0 );

    }



    ObjectInit( );



    swapChain_->Present( 0, 0 );

}



void D3DTextDemo::ObjectInit( )

{

    // mouse pos needs to take into consideration the screen pos

    //int x = GetCursorPos( &mouseState_.lX );//(int)(mousePosX_);

    //int y = GetCursorPos( (int)&mouseState_.lY );//(int)(mousePosY_);



    std::stringstream strNew;



    RECT currSPos;

    if ( GetWindowRect( hwnd_, &currSPos) )

    {

        

        strNew << "Screen coords: Left";

        strNew << currSPos.left;

        strNew << ", Right: ";

        strNew << currSPos.right;

        strNew << ", Top: ";

        strNew << currSPos.top;

        strNew << ", Bottom: ";

        strNew << currSPos.bottom;

    }

    

    POINT currMousePos;

    if ( GetCursorPos(&currMousePos) )

    {

        int newX = 0;

        if( currMousePos.x < currSPos.left )

        {

            newX = 0;

        } else {

            //int newX = currMousePos.x;

            if( currMousePos.x > currSPos.right)

            {

                newX = 800;

            } else {

                newX = currMousePos.x - currSPos.left;

            }

        }



        int newY = 0;

        if( currMousePos.y < currSPos.top )

        {

            newY = 0;

        } else {

            //int newY = currMousePos.y;

            if( currMousePos.y > currSPos.bottom)

            {

                newY = 600;

            } else {

                newY = currMousePos.y - currSPos.top;

            }

        }



        strNew << " mouseCoords: ";

        strNew << newX;

        strNew << " - ";

        strNew << newY;



        std::string str(strNew.str());

        const char* chr = str.c_str();



        DrawString( chr, -0.9f, 0.9f );

    }



    std::string str(strNew.str());

    const char* chr = str.c_str();



    DrawString( chr, -0.9f, 0.9f );



    if(bMousePressed)

    {

        // kick out whether or not the mouse buttons are being pressed

        std::string aButtonArray[] = { "Left mouse button",

                                       "Right mouse button",

                                       "Middle mouse button",

                                       "Left side std button",

                                       "Left side extra button",

                                       "Random button!",

                                       "Right side std button",

                                       "Right side extra button"};

        std::stringstream strMouseButtonPressed;

        strMouseButtonPressed << aButtonArray[iCurrMouseButton];

        strMouseButtonPressed << " currently pressed!";



        std::string otherStr(strMouseButtonPressed.str());

        const char* buttonOut = otherStr.c_str();



        DrawString( buttonOut, -0.9f, 0.75f );

    }



    DrawString( "The Quick Brown Fox Jumps Over The Lazy Dog", -1.0f, 0.9f );

}
Edited by swiftcoder
Please use [ code ] [ /code ] tags!

Share this post


Link to post
Share on other sites

I'm having trouble understanding how directx calls the buffers and draws the object.

 

I don't understand how and when I can add the different elements, so for instance when I load the 2D and 3D elements and which order they go in.

 

It's frustration more than anything, but any help would be appreciated. I'm currently going over the directX input assembly process to see if it makes more sense the second time round.

Share this post


Link to post
Share on other sites

If I have a BaseClass that loads the directX basics

 

DXbase main windows window and directX initiailization.

        virtual bool LoadContent( );
        virtual void UnloadContent( );

        virtual void Update( float dt ) = 0;
        virtual void Render( ) = 0;

 

FontsClass : public DXbase;

        sharing all the virtual classes above with SpriteClass

 

SpritesClass : public DXbase;

        sharing all the same as FontsClass

 

How do these two derived classes run if they both have public access to DXbase? Do they run one after another or are they stepping on each others toes and screwing the code up. How do I split them into manageable classes that I can use as easily updateable COM objects?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Forum Statistics

    • Total Topics
      627749
    • Total Posts
      2978912
  • Similar Content

    • By schneckerstein
      Hello,
      I manged so far to implement NVIDIA's NDF-Filtering at a basic level (the paper can be found here). Here is my code so far:
      //... // project the half vector on the normal (?) float3 hppWS = halfVector / dot(halfVector, geometricNormal) float2 hpp = float2(dot(hppWS, wTangent), dot(hppWS, wBitangent)); // compute the pixel footprint float2x2 dhduv = float2x2(ddx(hpp), ddy(hpp)); // compute the rectangular area of the pixel footprint float2 rectFp = min((abs(dhduv[0]) + abs(dhduv[1])) * 0.5, 0.3); // map the area to ggx roughness float2 covMx = rectFp * rectFp * 2; roughness = sqrt(roughness * roughness + covMx); //... Now I want combine this with LEAN mapping as state in Chapter 5.5 of the NDF paper.
      But I struggle to understand what theses sections actually means in Code: 
      I suppose the first-order moments are the B coefficent of the LEAN map, however things like
      float3 hppWS = halfVector / dot(halfVector, float3(lean_B, 0)); doesn't bring up anything usefull.
      Next theres:
      This simply means:
      // M and B are the coefficents from the LEAN map float2x2 sigma_mat = float2x2( M.x - B.x * B.x, M.z - B.x * B.y, M.z - B.x * B.y, M.y - B.y * B.y); does it?
      Finally:
      This is the part confuses me the most: how am I suppose to convolute two matrices? I know the concept of convolution in terms of functions, not matrices. Should I multiple them? That didn't make any usefully output.
      I hope someone can help with this maybe too specific question, I'm really despaired to make this work and i've spend too many hours of trial & error...
      Cheers,
      Julian
    • By Baemz
      Hello,
      I've been working on some culling-techniques for a project. We've built our own engine so pretty much everything is built from scratch. I've set up a frustum with the following code, assuming that the FOV is 90 degrees.
      float angle = CU::ToRadians(45.f); Plane<float> nearPlane(Vector3<float>(0, 0, aNear), Vector3<float>(0, 0, -1)); Plane<float> farPlane(Vector3<float>(0, 0, aFar), Vector3<float>(0, 0, 1)); Plane<float> right(Vector3<float>(0, 0, 0), Vector3<float>(angle, 0, -angle)); Plane<float> left(Vector3<float>(0, 0, 0), Vector3<float>(-angle, 0, -angle)); Plane<float> up(Vector3<float>(0, 0, 0), Vector3<float>(0, angle, -angle)); Plane<float> down(Vector3<float>(0, 0, 0), Vector3<float>(0, -angle, -angle)); myVolume.AddPlane(nearPlane); myVolume.AddPlane(farPlane); myVolume.AddPlane(right); myVolume.AddPlane(left); myVolume.AddPlane(up); myVolume.AddPlane(down); When checking the intersections I am using a BoundingSphere of my models, which is calculated by taking the average position of all vertices and then choosing the furthest distance to a vertex for radius. The actual intersection test looks like this, where the "myFrustum90" is the actual frustum described above.
      The orientationInverse is the viewMatrix in this case.
      bool CFrustum::Intersects(const SFrustumCollider& aCollider) { CU::Vector4<float> position = CU::Vector4<float>(aCollider.myCenter.x, aCollider.myCenter.y, aCollider.myCenter.z, 1.f) * myOrientationInverse; return myFrustum90.Inside({ position.x, position.y, position.z }, aCollider.myRadius); } The Inside() function looks like this.
      template <typename T> bool PlaneVolume<T>::Inside(Vector3<T> aPosition, T aRadius) const { for (unsigned short i = 0; i < myPlaneList.size(); ++i) { if (myPlaneList[i].ClassifySpherePlane(aPosition, aRadius) > 0) { return false; } } return true; } And this is the ClassifySpherePlane() function. (The plane is defined as a Vector4 called myABCD, where ABC is the normal)
      template <typename T> inline int Plane<T>::ClassifySpherePlane(Vector3<T> aSpherePosition, float aSphereRadius) const { float distance = (aSpherePosition.Dot(myNormal)) - myABCD.w; // completely on the front side if (distance >= aSphereRadius) { return 1; } // completely on the backside (aka "inside") if (distance <= -aSphereRadius) { return -1; } //sphere intersects the plane return 0; }  
      Please bare in mind that this code is not optimized nor well-written by any means. I am just looking to get it working.
      The result of this culling is that the models seem to be culled a bit "too early", so that the culling is visible and the models pops away.
      How do I get the culling to work properly?
      I have tried different techniques but haven't gotten any of them to work.
      If you need more code or explanations feel free to ask for it.

      Thanks.
       
    • By evelyn4you
      hi,
      i have read very much about the binding of a constantbuffer to a shader but something is still unclear to me.
      e.g. when performing :   vertexshader.setConstantbuffer ( buffer,  slot )
       is the buffer bound
      a.  to the VertexShaderStage
      or
      b. to the VertexShader that is currently set as the active VertexShader
      Is it possible to bind a constantBuffer to a VertexShader e.g. VS_A and keep this binding even after the active VertexShader has changed ?
      I mean i want to bind constantbuffer_A  to VS_A, an Constantbuffer_B to VS_B  and  only use updateSubresource without using setConstantBuffer command every time.

      Look at this example:
      SetVertexShader ( VS_A )
      updateSubresource(buffer_A)
      vertexshader.setConstantbuffer ( buffer_A,  slot_A )
      perform drawcall       ( buffer_A is used )

      SetVertexShader ( VS_B )
      updateSubresource(buffer_B)
      vertexshader.setConstantbuffer ( buffer_B,  slot_A )
      perform drawcall   ( buffer_B is used )
      SetVertexShader ( VS_A )
      perform drawcall   (now which buffer is used ??? )
       
      I ask this question because i have made a custom render engine an want to optimize to
      the minimum  updateSubresource, and setConstantbuffer  calls
       
       
       
       
       
    • By noodleBowl
      I got a quick question about buffers when it comes to DirectX 11. If I bind a buffer using a command like:
      IASetVertexBuffers IASetIndexBuffer VSSetConstantBuffers PSSetConstantBuffers  and then later on I update that bound buffer's data using commands like Map/Unmap or any of the other update commands.
      Do I need to rebind the buffer again in order for my update to take effect? If I dont rebind is that really bad as in I get a performance hit? My thought process behind this is that if the buffer is already bound why do I need to rebind it? I'm using that same buffer it is just different data
       
    • By Rockmover
      I am really stuck with something that should be very simple in DirectX 11. 
      1. I can draw lines using a PC (position, colored) vertices and a simple shader just fine.
      2. I can draw 3D triangles using PCN (position, colored, normal) vertices just fine (even transparency and SpecularBlinnPhong shaders).
       
      However, if I'm using my 3D shader, and I want to draw my PC lines in the same scene how can I do that?
       
      If I change my lines to PCN and pass them to the 3D shader with my triangles, then the lighting screws them all up.  I only want the lighting for the 3D triangles, but no SpecularBlinnPhong/Lighting for the lines (just PC). 
      I am sure this is because if I change the lines to PNC there is not really a correct "normal" for the lines.  
      I assume I somehow need to draw the 3D triangles using one shader, and then "switch" to another shader and draw the lines?  But I have no clue how to use two different shaders in the same scene.  And then are the lines just drawn on top of the triangles, or vice versa (maybe draw order dependent)?  
      I must be missing something really basic, so if anyone can just point me in the right direction (or link to an example showing the implementation of multiple shaders) that would be REALLY appreciated.
       
      I'm also more than happy to post my simple test code if that helps as well!
       
      THANKS SO MUCH IN ADVANCE!!!
  • Popular Now