forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Проблема с созданием банка (http://forum.boolean.name/showthread.php?t=12119)

Comment 05.03.2010 12:27

Проблема с созданием банка
 
Есть функция на B3D вот её код:
Код:

Function BodyCreateHull%(mesh%, mass#)

    Local nsurf = CountSurfaces(mesh)
    Local nvert = 0
    For ns = 1 To nsurf
        Local surf = GetSurface(mesh,ns)
        nvert = nvert + CountVertices(surf)
    Next
        vbank = CreateBank(nvert*4*3)
    nv = 0
    For ns = 1 To nsurf
        surf = GetSurface(mesh,ns)
        nvv = CountVertices(surf)
        For nvc = 0 To nvv - 1
            PokeFloat vbank,nv*12+0,VertexX(surf,nvc)
            PokeFloat vbank,nv*12+4,VertexY(surf,nvc)
            PokeFloat vbank,nv*12+8,VertexZ(surf,nvc)
            nv = nv+1
        Next
    Next
    Local bbb%= pxBodyCreateHull(vbank, nvert, mass)
    FreeBank vbank
    Return bbb
End Function

Нашел её я здесь же на форуме, в разделе по PhysiX, но мне нужно переделать её на Blitz3D под C++, проблема в том что я почти не понимаю бэйски о некоторых функция догадался, а некоторые ввели меня в заблуждение например PokeFloat, или CreateBank... Кто понимает с++ и бэйсик помогите пожалуста её переделать, не могу создать банк

H@NON 05.03.2010 13:21

Ответ: Проблема с созданием банка
 
CreateBank резервирует место в памяти под запись информации, а PokeFloat непосредственно записывает эту информацию с указанным сдвигом. Тебе остается найти аналогичные команды в С++

Comment 05.03.2010 13:28

Ответ: Проблема с созданием банка
 
Цитата:

Сообщение от H@NON (Сообщение 140645)
CreateBank резервирует место в памяти под запись информации, а PokeFloat непосредственно записывает эту информацию с указанным сдвигом. Тебе остается найти аналогичные команды в С++

Дело в том что я и не могу найти их, для Xors есть встроеные команды типа

Код:

int BodyCreateHull(Entity meshh,float mass)
{
float *VB = xGetMeshVB(meshh);
int VB_size = xGetMeshVBSize(meshh);
int vvv;
vvv = pxBodyCreateHull(VB,VB_size,mass);
return vvv;
}

но аналога им найти я не могу, нету в Блитце xGetMeshVB и т д
понять бы структуру этого банка в памяти

Dream 05.03.2010 13:59

Ответ: Проблема с созданием банка
 
в с++ есть Деки и иже с ними. которые практически такиеже в обращении как банки в блице

Comment 05.03.2010 14:03

Ответ: Проблема с созданием банка
 
Цитата:

Сообщение от Dream (Сообщение 140649)
в с++ есть Деки и иже с ними. которые практически такиеже в обращении как банки в блице

Никогда раньше не слышал, помоги понять или подкинь ссылку чтобы разобраться.:rolleyes:

Dream 05.03.2010 14:10

Ответ: Проблема с созданием банка
 
первая ссылка в гугле
Рекомендую прочитать обучающую литературу по С++, дабы не лезь после каждой непонятки в интернет.

Knightmare 05.03.2010 14:49

Ответ: Проблема с созданием банка
 
Dream ты щас насоветуешь хрени. Тупо аллочим N байт и юзая смещение указателя записываем туда значения (или memcpy). Быстро и просто. Можно даже аналог банков написать свой и я даже где-то выкладывал реализацию их.
Но насчет чтения литературы таки поддерживаю.

Dream 05.03.2010 14:57

Ответ: Проблема с созданием банка
 
Ну я хз как там в Blitz3DSDK и физик сделано работа с банками. но банки блица вроде как аналог сишных стёков

Comment 05.03.2010 19:04

Ответ: Проблема с созданием банка
 
Цитата:

Сообщение от Knightmare (Сообщение 140657)
Dream ты щас насоветуешь хрени. Тупо аллочим N байт и юзая смещение указателя записываем туда значения (или memcpy). Быстро и просто. Можно даже аналог банков написать свой и я даже где-то выкладывал реализацию их.
Но насчет чтения литературы таки поддерживаю.

Можешь привести небольшой пример, буду очень благодарин. Как я понимаю memcpy копирует значение в указатель, указатель объявить какого типа, как все сделать. Насчет чтения литературы вы все правы, но у меня больше опыта Паскаль, Делфи чем с++, из за этого и выбрал делать все на с++, чтобы изучить новое. За пример буду очень благодарный.

Knightmare 05.03.2010 19:07

Ответ: Проблема с созданием банка
 
http://forum.xors3d.com/viewtopic.php?f=19&t=150#p746

Comment 05.03.2010 19:45

Ответ: Проблема с созданием банка
 
Цитата:

Сообщение от Knightmare (Сообщение 140713)

Код:

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);

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

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

Knightmare 05.03.2010 19:53

Ответ: Проблема с созданием банка
 
Да ты вообще в С++ не шаришь да.
В первом случае нельзя использовать смещение для void*, поэтому достаточно привести его к char* например:
PHP код:

return *((BYTE*)(((char*)bank) + offset); 

Чтобы не взрывать себе моск можно писать типа такого:
PHP код:

BYTE result;
memcpy((void*)&result, ((char*)bank) + offsetsizeof(BYTE));
return 
result

Со вторым еще проще:
PHP код:

int mvbank = (int)GetVertBank(mesh); 


Comment 05.03.2010 19:54

Ответ: Проблема с созданием банка
 
Про приведение типов я знал, просто не знал что это можно здесь применить, и да ты прав в с++ моих знаний мало, я только учусь.

Comment 06.03.2010 11:56

Ответ: Проблема с созданием банка
 
Код:

#include <windows.h>
#include <cstring>
#include <string>
#include <fstream>
#include <ctime>
#include "blitz3dsdk.h"
#include "Blitzpx.h"
using namespace std;

/*
Function BodyCreateHull%(mesh%, mass#)

    Local nsurf = CountSurfaces(mesh)
    Local nvert = 0
    For ns = 1 To nsurf
        Local surf = GetSurface(mesh,ns)
        nvert = nvert + CountVertices(surf)
    Next
        vbank = CreateBank(nvert*4*3)
    nv = 0
    For ns = 1 To nsurf
        surf = GetSurface(mesh,ns)
        nvv = CountVertices(surf)
        For nvc = 0 To nvv - 1
            PokeFloat vbank,nv*12+0,VertexX(surf,nvc)
            PokeFloat vbank,nv*12+4,VertexY(surf,nvc)
            PokeFloat vbank,nv*12+8,VertexZ(surf,nvc)
            nv = nv+1
        Next
    Next
    Local bbb%= pxBodyCreateHull(vbank, nvert, mass)
    FreeBank vbank
    Return bbb
End Function
*/

void * CreateBank(int size)
{
    return new BYTE[size];
}

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

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

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

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

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

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

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

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

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

int GetVertCount(int mesh)
{
    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("obj.b3d");
    bbFlipMesh(mesh);
    int mvn = GetVertCount(mesh);
    float* mvbank =(float*)GetVertBank(mesh);
    SB=pxBodyCreateHull(mvbank, mvn, 1);
    FreeBank((void*)mvbank);
}

class cBox
{
public:
        cBox();
        ~cBox();
        int Entity;
        int Body;
        void Pick();
        cBox* Next;
};

cBox::cBox()
{
        srand(time(0));
        int r,g,b;
        r=rand()%255;
        g=rand()%255;
        b=rand()%255;
        Next=NULL;
       
        Entity=bbLoadMesh("obj.b3d");
        Body=pxBodyCreateSphere(1,1);
        pxBodySetPosition(Body,0,20,0);
        bbEntityColor(Entity,r,g,b);
}

cBox::~cBox()
{
        bbFreeEntity(Entity);
        pxDeleteBody(Body);
}

void cBox::Pick()
{
        bbPositionEntity(Entity,pxBodyGetPositionX(Body),pxBodyGetPositionY(Body),pxBodyGetPositionZ(Body));
        bbRotateEntity(Entity,pxBodyGetRotationPitch(Body),pxBodyGetRotationYaw(Body),pxBodyGetRotationRoll(Body));
}

class cList
{
public:
        cList();
        void AddObj();
        void PickObj();
        void ClearObj();
        int GetCount();
private:
        cBox *first;
};

cList::cList()
{
        first=NULL;
}

void cList::AddObj()
{
        if(first)
        {
                cBox *temp=first;
                while(temp->Next)  temp=temp->Next;
                temp->Next=new cBox();
        }
        else first=new cBox();
}

void cList::ClearObj()
{
        if(first)
        {
                cBox *temp=first,*buff;
                while(temp->Next)
                {
                        buff=temp;
                        temp=temp->Next;
                        delete buff;
                }
                delete temp;
                first=NULL;
        }
}

int cList::GetCount()
{
        cBox *temp=first;
        int count=0;
        while(temp)
        {
                count++;
                temp=temp->Next;
        }
        return count;
}

void SetPhysx(int Entity, int Body)
{
        bbPositionEntity(Entity,pxBodyGetPositionX(Body),pxBodyGetPositionY(Body),pxBodyGetPositionZ(Body));
        bbRotateEntity(Entity,pxBodyGetRotationPitch(Body),pxBodyGetRotationYaw(Body),pxBodyGetRotationRoll(Body));
}

void cList::PickObj()
{
        if(first!=NULL)
        {
        cBox* temp=first;                       
                while(temp)
                {       
                        temp->Pick();               
                        temp=temp->Next;
                }
        }
}

extern int WINAPI WinMain(HINSTANCE hThisInst,HINSTANCE hPrevInst,LPSTR lpszArgs,int nWinMode)
{
        bbBeginBlitz3D();
        bbGraphics3D(800,600,32,2);
       
        int cam=bbCreateCamera();
        bbPositionEntity(cam,0,10,-20);
        int plane=bbCreatePlane();
        bbEntityColor(plane,64,128,128);
        int light=bbCreateLight();
       
        pxCreateWorld(1,"");
        pxSetGravity(0,-10,0);
        int Obj;
        int Bank;

        GenSB(Obj, Bank);

        cList BoxList;
       
        char buffer[10];
        while(!bbKeyHit(KEY_ESCAPE))
        {
                pxRenderPhysic(60,0);
                if(bbKeyHit(KEY_SPACE)) BoxList.AddObj();
                if(bbKeyHit(KEY_E)) BoxList.ClearObj();
                BoxList.PickObj();
                bbUpdateWorld();
            bbRenderWorld();
                sprintf_s(buffer, "%i", BoxList.GetCount());
                bbText(100,100,buffer);
                bbFlip();
        }
        bbEndBlitz3D();
        return 0;
}

Выдает ошибку, причем сам блитц: Surface Index Out of Range. По виду все работает и компилируется правильно. Думал что цикл выскакивает за память, или за количество точек, пересмотрел циклы кажется все правильно...

Comment 06.03.2010 19:29

Ответ: Проблема с созданием банка
 
Цитата:

Сообщение от Knightmare (Сообщение 140713)

Помоги пожалуста разобратся с кодом, а то я в ступоре. И еще я не понял почему мы именно безтипа указатель в начале создали или это нужно чтобы можно было привести его к любому другому типу... Поможешь буду безгранично благодарин. Насчет знаний с++ я прочитал 2 книги "С++ без страха" и "с++ за 21 день", но про методы которые описываешь ты там ничего не сказано, может я читаю не правильные книги.


Часовой пояс GMT +4, время: 19:12.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot