Неожиданное поведение статической функции - PullRequest
0 голосов
/ 12 декабря 2011

Я работаю над проектом DX11 и получаю странное поведение со статической функцией. Я немного не разбираюсь в статических функциях, поэтому я, вероятно, где-то ошибаюсь.

Моя функция проста:

namespace Rendering
{
    static bool PlaceObjectInMatrix(EntityBase* obj, D3DXMATRIX world)
    {

        D3DXMatrixTranslation(&world, obj->GetPosition()->x, obj->GetPosition()->y, obj->GetPosition()->z); 
        return true;
    }
}

и вызывается в цикле для рендеринга всех объектов:

for(unsigned int i = 0; i < listSize; i++)
    {

        if(entities[i].taken == false)
            continue; 
        entities[i].entry->Render(deviceContext, shader);

        PlaceObjectInMatrix(entities[i].entry, worldMatrix);

        if(entities[i].entry->GetIndexCount() != 0) 
        {
            shader->Render(deviceContext, entities[i].entry->GetIndexCount(), worldMatrix, viewMatrix, projectionMatrix, entities[i].entry->GetTexture(), m_debugLight->GetDirection(), m_debugLight->GetDiffuseColor());
            objectsRendered++;
        }

        d3d->GetWorldMatrix(worldMatrix); //reset world matrix
    }

Однако это не работает. Однако когда я заменяю строку вызовом функции на то, что находится в самой функции, она работает. Как будто что-то теряется в вызове функции.

Класс EntityBase является абстрактным, и класс, с которым я на самом деле рендеринг, называется EntityModelStatic, который является производным от EntityModel.

Ответы [ 2 ]

2 голосов
/ 12 декабря 2011

Функция PlaceObjectInMatrix () работает с копией worldMatrix.Чтобы изменить исходную матрицу, вы должны объявить функцию следующим образом:

static bool PlaceObjectInMatrix(EntityBase* obj, D3DXMATRIX& world);

Более обычным способом является использование указателей, например:

static bool PlaceObjectInMatrix(const EntityBase& obj, D3DXMATRIX* world);

Таким образом, любой, кто читает код вызова, напримерPlaceObjectInMatrix (* entity [i] .entry, & worldMatrix) поймет, что функция изменит объект worldMatrix

2 голосов
/ 12 декабря 2011
static bool PlaceObjectInMatrix(EntityBase* obj, D3DXMATRIX world)

Аргумент world передается по значению, поэтому функция получает свою собственную копию, а переменная в вызывающей программе не изменяется. Это, вероятно, ваша проблема.

Используйте указатель (например, D3DXMatrixTranslation) или ссылку, и ваша проблема, скорее всего, исчезнет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...