Показать сообщение отдельно
Старый 05.03.2010, 19:45   #11
Comment
Оператор ЭВМ
 
Регистрация: 16.09.2009
Сообщений: 23
Написано одно полезное сообщение
Ответ: Проблема с созданием банка

Сообщение от Knightmare Посмотреть сообщение
void *CreateBank(int size)
{
    return new BYTE[size];
}

void FreeBank(void * bank)
{
    delete [] bank;
}

BYTE PeekByte(void * bank, int offset)
{
    return *(BYTE*(bank + offset));
}

WORD PeekShort(void * bank, int offset)
{
    return *(WORD*(bank + offset));
}

int PeekInt(void * bank, int offset)
{
    return *(int*(bank + offset));
}

float PeekFloat(void * bank, int offset)
{
    return *(float*(bank + offset));
}

void PokeByte(void * bank, int offset, BYTE value)
{
    *(BYTE*(bank + offset)) = value;
}

void PokeShort(void * bank, int offset, WORD value)
{
    *(WORD*(bank + offset)) = value;
}

void PokeInt(void * bank, int offset, int value)
{
    *(int*(bank + offset)) = value;
}

void PokeFloat(void * bank, int offset, float value)
{
    *(float*(bank + offset)) = value;
}

// getting total vertices count in mesh
int GetVertCount(int mesh)
{
    // getting vertices count
    int verticesCount = 0;
    for(int i = 0; i < bbCountSurfaces(mesh); i++)
    {
        verticesCount  += bbCountVertices(bbGetSurface(mesh, i));
    }
    return verticesCount ;
}

void * GetVertBank(int mesh)
{
    void *bank = CreateBank(GetVertCount(mesh)*12);
    int offset = 0;
    for(int i = 0; i < bbCountSurfaces(mesh); i++)
    {
        int surface = bbGetSurface(mesh, i);
        for(int j = 0; j < bbCountVertices(surface); j++)
        {
            PokeFloat(bank, offset + 0, bbVertexX(surface, j));
            PokeFloat(bank, offset + 4, bbVertexY(surface, j));
            PokeFloat(bank, offset + 8, bbVertexZ(surface, j));
            offset += 12;
        }
    }
    return bank;
}

void GenSB(int &mesh, int &SB)
{
    mesh=bbLoadMesh("Data/models/te.3ds");
    bbFlipMesh(mesh);
    int mvn = GetVertCount(mesh);
    int mvbank = GetVertBank(mesh);
    SB = pxCreateSoftBody("Data/physics/te_SB.obj", "Data/physics/te_SB.tet", mvbank, mvn, 0, 60, 0, 0, 0, 0);
    pxSoftBodySetStretchingStiffness(SB, 0.01);
    FreeBank(mvbank);
}
Как я понял bank, это указатель который ссылается на место в памяти где хранится некий динамический массив вершин. Только проблема в том что когда мы задаем смещение(если я не ошибаюсь) компилятор выдает ошибку,
.\source.cpp(77) : error C2061: syntax error : identifier 'bank'
.\source.cpp(77) : error C2066: cast to function type is illegal

*(BYTE*(bank + offset));

В чем дело, суть этой записи мне понятна(никий вариант [x+SI] из ассемблера), но вот в чем ошибка понять не могу. Возможно в версии моего кампилятора VS 2005.

.\source.cpp(150) : error C2440: 'initializing' : cannot convert from 'void *' to 'int'

int mvbank = GetVertBank(mesh);

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

Я не спорю, моих знаний с++ маловато, но если пойму это их станет больше, искал на болеане решение этого нигде не нашел, т.е либо под с++ на блитце никто не пишет, либо никто не знает как сделать.
(Offline)
 
Ответить с цитированием