Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > 3D-программирование

3D-программирование Вопросы, касающиеся программирования 3D мира

Ответ
 
Опции темы
Старый 05.03.2010, 12:27   #1
Comment
Оператор ЭВМ
 
Регистрация: 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
H@NON
Дэвелопер
 
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений
(для 774 пользователей)
Ответ: Проблема с созданием банка

CreateBank резервирует место в памяти под запись информации, а PokeFloat непосредственно записывает эту информацию с указанным сдвигом. Тебе остается найти аналогичные команды в С++
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Comment (06.03.2010)
Старый 05.03.2010, 13:28   #3
Comment
Оператор ЭВМ
 
Регистрация: 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
Dream
быдло
 
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений
(для 1,489 пользователей)
Ответ: Проблема с созданием банка

в с++ есть Деки и иже с ними. которые практически такиеже в обращении как банки в блице
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Comment (06.03.2010)
Старый 05.03.2010, 14:03   #5
Comment
Оператор ЭВМ
 
Регистрация: 16.09.2009
Сообщений: 23
Написано одно полезное сообщение
Ответ: Проблема с созданием банка

Сообщение от Dream Посмотреть сообщение
в с++ есть Деки и иже с ними. которые практически такиеже в обращении как банки в блице
Никогда раньше не слышал, помоги понять или подкинь ссылку чтобы разобраться.
(Offline)
 
Ответить с цитированием
Старый 05.03.2010, 14:10   #6
Dream
быдло
 
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений
(для 1,489 пользователей)
Ответ: Проблема с созданием банка

первая ссылка в гугле
Рекомендую прочитать обучающую литературу по С++, дабы не лезь после каждой непонятки в интернет.
(Offline)
 
Ответить с цитированием
Старый 05.03.2010, 14:49   #7
Knightmare
Дэвелопер
 
Регистрация: 14.02.2007
Сообщений: 1,471
Написано 824 полезных сообщений
(для 2,920 пользователей)
Ответ: Проблема с созданием банка

Dream ты щас насоветуешь хрени. Тупо аллочим N байт и юзая смещение указателя записываем туда значения (или memcpy). Быстро и просто. Можно даже аналог банков написать свой и я даже где-то выкладывал реализацию их.
Но насчет чтения литературы таки поддерживаю.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Comment (06.03.2010)
Старый 05.03.2010, 14:57   #8
Dream
быдло
 
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений
(для 1,489 пользователей)
Ответ: Проблема с созданием банка

Ну я хз как там в Blitz3DSDK и физик сделано работа с банками. но банки блица вроде как аналог сишных стёков
(Offline)
 
Ответить с цитированием
Старый 05.03.2010, 19:04   #9
Comment
Оператор ЭВМ
 
Регистрация: 16.09.2009
Сообщений: 23
Написано одно полезное сообщение
Ответ: Проблема с созданием банка

Сообщение от Knightmare Посмотреть сообщение
Dream ты щас насоветуешь хрени. Тупо аллочим N байт и юзая смещение указателя записываем туда значения (или memcpy). Быстро и просто. Можно даже аналог банков написать свой и я даже где-то выкладывал реализацию их.
Но насчет чтения литературы таки поддерживаю.
Можешь привести небольшой пример, буду очень благодарин. Как я понимаю memcpy копирует значение в указатель, указатель объявить какого типа, как все сделать. Насчет чтения литературы вы все правы, но у меня больше опыта Паскаль, Делфи чем с++, из за этого и выбрал делать все на с++, чтобы изучить новое. За пример буду очень благодарный.
(Offline)
 
Ответить с цитированием
Старый 05.03.2010, 19:07   #10
Knightmare
Дэвелопер
 
Регистрация: 14.02.2007
Сообщений: 1,471
Написано 824 полезных сообщений
(для 2,920 пользователей)
Ответ: Проблема с созданием банка

http://forum.xors3d.com/viewtopic.php?f=19&t=150#p746
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Comment (06.03.2010)
Старый 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)
 
Ответить с цитированием
Старый 05.03.2010, 19:53   #12
Knightmare
Дэвелопер
 
Регистрация: 14.02.2007
Сообщений: 1,471
Написано 824 полезных сообщений
(для 2,920 пользователей)
Ответ: Проблема с созданием банка

Да ты вообще в С++ не шаришь да.
В первом случае нельзя использовать смещение для void*, поэтому достаточно привести его к char* например:
return *((BYTE*)(((char*)bank) + offset); 
Чтобы не взрывать себе моск можно писать типа такого:
BYTE result;
memcpy((void*)&result, ((char*)bank) + offsetsizeof(BYTE));
return 
result
Со вторым еще проще:
int mvbank = (int)GetVertBank(mesh); 
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Comment (06.03.2010)
Старый 05.03.2010, 19:54   #13
Comment
Оператор ЭВМ
 
Регистрация: 16.09.2009
Сообщений: 23
Написано одно полезное сообщение
Ответ: Проблема с созданием банка

Про приведение типов я знал, просто не знал что это можно здесь применить, и да ты прав в с++ моих знаний мало, я только учусь.
(Offline)
 
Ответить с цитированием
Старый 06.03.2010, 11:56   #14
Comment
Оператор ЭВМ
 
Регистрация: 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
Comment
Оператор ЭВМ
 
Регистрация: 16.09.2009
Сообщений: 23
Написано одно полезное сообщение
Ответ: Проблема с созданием банка

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


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com