|
3D-программирование Вопросы, касающиеся программирования 3D мира |
05.03.2010, 12:27
|
#1
|
Оператор ЭВМ
Регистрация: 16.09.2009
Сообщений: 23
Написано одно полезное сообщение
|
Проблема с созданием банка
Есть функция на 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... Кто понимает с++ и бэйсик помогите пожалуста её переделать, не могу создать банк
|
(Offline)
|
|
05.03.2010, 13:21
|
#2
|
Дэвелопер
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений (для 774 пользователей)
|
Ответ: Проблема с созданием банка
CreateBank резервирует место в памяти под запись информации, а PokeFloat непосредственно записывает эту информацию с указанным сдвигом. Тебе остается найти аналогичные команды в С++
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
05.03.2010, 13:28
|
#3
|
Оператор ЭВМ
Регистрация: 16.09.2009
Сообщений: 23
Написано одно полезное сообщение
|
Ответ: Проблема с созданием банка
Сообщение от H@NON
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 и т д
понять бы структуру этого банка в памяти
|
(Offline)
|
|
05.03.2010, 13:59
|
#4
|
быдло
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений (для 1,489 пользователей)
|
Ответ: Проблема с созданием банка
в с++ есть Деки и иже с ними. которые практически такиеже в обращении как банки в блице
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
05.03.2010, 14:03
|
#5
|
Оператор ЭВМ
Регистрация: 16.09.2009
Сообщений: 23
Написано одно полезное сообщение
|
Ответ: Проблема с созданием банка
Сообщение от Dream
в с++ есть Деки и иже с ними. которые практически такиеже в обращении как банки в блице
|
Никогда раньше не слышал, помоги понять или подкинь ссылку чтобы разобраться.
|
(Offline)
|
|
05.03.2010, 14:10
|
#6
|
быдло
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений (для 1,489 пользователей)
|
Ответ: Проблема с созданием банка
первая ссылка в гугле
Рекомендую прочитать обучающую литературу по С++, дабы не лезь после каждой непонятки в интернет.
|
(Offline)
|
|
05.03.2010, 14:49
|
#7
|
Дэвелопер
Регистрация: 14.02.2007
Сообщений: 1,471
Написано 824 полезных сообщений (для 2,920 пользователей)
|
Ответ: Проблема с созданием банка
Dream ты щас насоветуешь хрени. Тупо аллочим N байт и юзая смещение указателя записываем туда значения (или memcpy). Быстро и просто. Можно даже аналог банков написать свой и я даже где-то выкладывал реализацию их.
Но насчет чтения литературы таки поддерживаю.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
05.03.2010, 14:57
|
#8
|
быдло
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений (для 1,489 пользователей)
|
Ответ: Проблема с созданием банка
Ну я хз как там в Blitz3DSDK и физик сделано работа с банками. но банки блица вроде как аналог сишных стёков
|
(Offline)
|
|
05.03.2010, 19:04
|
#9
|
Оператор ЭВМ
Регистрация: 16.09.2009
Сообщений: 23
Написано одно полезное сообщение
|
Ответ: Проблема с созданием банка
Сообщение от Knightmare
Dream ты щас насоветуешь хрени. Тупо аллочим N байт и юзая смещение указателя записываем туда значения (или memcpy). Быстро и просто. Можно даже аналог банков написать свой и я даже где-то выкладывал реализацию их.
Но насчет чтения литературы таки поддерживаю.
|
Можешь привести небольшой пример, буду очень благодарин. Как я понимаю memcpy копирует значение в указатель, указатель объявить какого типа, как все сделать. Насчет чтения литературы вы все правы, но у меня больше опыта Паскаль, Делфи чем с++, из за этого и выбрал делать все на с++, чтобы изучить новое. За пример буду очень благодарный.
|
(Offline)
|
|
05.03.2010, 19:07
|
#10
|
Дэвелопер
Регистрация: 14.02.2007
Сообщений: 1,471
Написано 824 полезных сообщений (для 2,920 пользователей)
|
Ответ: Проблема с созданием банка
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
05.03.2010, 19:45
|
#11
|
Оператор ЭВМ
Регистрация: 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)
|
|
05.03.2010, 19:53
|
#12
|
Дэвелопер
Регистрация: 14.02.2007
Сообщений: 1,471
Написано 824 полезных сообщений (для 2,920 пользователей)
|
Ответ: Проблема с созданием банка
Да ты вообще в С++ не шаришь да.
В первом случае нельзя использовать смещение для void*, поэтому достаточно привести его к char* например:
return *((BYTE*)(((char*)bank) + offset);
Чтобы не взрывать себе моск можно писать типа такого:
BYTE result; memcpy((void*)&result, ((char*)bank) + offset, sizeof(BYTE)); return result;
Со вторым еще проще:
int mvbank = (int)GetVertBank(mesh);
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
05.03.2010, 19:54
|
#13
|
Оператор ЭВМ
Регистрация: 16.09.2009
Сообщений: 23
Написано одно полезное сообщение
|
Ответ: Проблема с созданием банка
Про приведение типов я знал, просто не знал что это можно здесь применить, и да ты прав в с++ моих знаний мало, я только учусь.
|
(Offline)
|
|
06.03.2010, 11:56
|
#14
|
Оператор ЭВМ
Регистрация: 16.09.2009
Сообщений: 23
Написано одно полезное сообщение
|
Ответ: Проблема с созданием банка
#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. По виду все работает и компилируется правильно. Думал что цикл выскакивает за память, или за количество точек, пересмотрел циклы кажется все правильно...
|
(Offline)
|
|
06.03.2010, 19:29
|
#15
|
Оператор ЭВМ
Регистрация: 16.09.2009
Сообщений: 23
Написано одно полезное сообщение
|
Ответ: Проблема с созданием банка
Сообщение от Knightmare
|
Помоги пожалуста разобратся с кодом, а то я в ступоре. И еще я не понял почему мы именно безтипа указатель в начале создали или это нужно чтобы можно было привести его к любому другому типу... Поможешь буду безгранично благодарин. Насчет знаний с++ я прочитал 2 книги "С++ без страха" и "с++ за 21 день", но про методы которые описываешь ты там ничего не сказано, может я читаю не правильные книги.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:22.
|