Есть желание обменяться опытом по Nebula2. Список изученых или почти изученых вопросов:
- физика (ode)
- часть эффектов и renderpath`ов
- gui
- освещение, тени, сцена
- редактор уровней на движке
- звук
- экспортер из макса и материалы
- разное
Т. к. инфы мало, предлагаю взаимовыгодный обмен опытом, который будет всем полезен )))
Я немного слежу за развитием Небулы. Начинал еще с ее первой версии.
Более менее разбираюсь в ее структуре. Правда с Мангалором пока не очень дружу. :)
Сейчас в меру своих возможностей работаю над OpenGL сервером для Небулы.
Сам в программировании я не сильно разбираюсь, потому любые наработки, которые общественность покажет, как пример успешной реализации, будут оч. полезными.
Не представляю, как можно выложить комплексный пример.
Nebula - движок, предоставляющий необходимые возможности, которые должен предоставлять 3D-движок.
Если у вас нет вопросов по nebula, значит, что скорее всего, вы еще не начали с ней работать.
Попробую для затравки беседы и возможных вопросов с чего-нибудь начать.
Например, нам для проекта нужна была хорошая поддержка динамической (процедурной) геометрии и динамических текстур.
Для текстуры написали враппер над nD3d9Texture, имеющий дополнительный nSurface*:
Процедурная геометрия - это всего лишь обертка над nD3D9Mesh* с методом типа
SetGeometry(void*, uint*)
{
void * meshVertices = mesh_->LockVertices();
memcpy(meshVertices, rowVertices, mesh_->GetVertexBufferByteSize());
mesh_->UnlockVertices();
}
который обновляет вертексный буфер. Индексный буфер задается только один раз при создании меша.
Не забыть про mesh_->SetUsage( nMesh2::WriteOnly )!
==============================================================================
Пожалуйста, задавайте ваши вопросы.
Будем стараться помочь
// берём сюрфэйс
nTexture2::LockInfo li;
m_tSky->Lock( nTexture2::LockType::WriteOnly, 0, li );
// пишем в текстуру
int color;
for ( int x = 0; x < SKY_RES_X; ++x ) {
for ( int y = 0; y < SKY_RES_Y; ++y ) {
char *pixel0 = (char *)li.surfPointer + (int)(x) * 4 + (int)(y) * li.surfPitch;
color = D3DCOLOR_ARGB( 255, RED, GREEN, BLUE );
*((int *)pixel0) = color;
}
}
// закрываем
m_tSky->Unlock(0);
// -----------------------------
после этого текстура уже обновлена - её можно подавать в шейдер, либо сохранять, либо ещё обрабатывать.
И что, товарищ pbmaster, этот код - в лоб Lock( nTexture2::LockType::WriteOnly, 0, li ) - писать каждый раз, когда мне нужно проапдейтить текстуру???
А если мне ее еще нужно в файлик сохранить?
А если я хочу загрузить в текстуру содержимое рендертаргета?
Каждый раз это делать руками без всяких оберток?
Меня программированию не так учили...
А потом, Lock( nTexture2::LockType::WriteOnly, 0, li ), которая вызывает LockRect и для которой потом нужен UnlockRect работает чуток медленнее, чем прямая загрузка в surface.
Вариантов, как сделать одно и то же действие в nebula - как минимум несколько.
Я предложил свой.
> И что, товарищ pbmaster, этот код - в лоб Lock( nTexture2::LockType::WriteOnly, 0, li ) - писать каждый раз, когда мне нужно проапдейтить текстуру??? > А если мне ее еще нужно в файлик сохранить? > А если я хочу загрузить в текстуру содержимое рендертаргета?
не понимаю, зачем писать обёртку для лока. там же параметры чтения/записи и уровня? если писать нормальную обёртку, то она то же самое и сделает.
чтобы сохранить в файл, нужно просто вызвать метод сэйва, при этом ничего лочить не надо. если работать с рендертаргетом, то это другой разговор, там уже нужно использовать сэрфейсы.
> А потом, Lock( nTexture2::LockType::WriteOnly, 0, li ), которая вызывает LockRect и для которой потом нужен UnlockRect работает чуток медленнее, чем прямая > загрузка в surface.
а разве прямой доступ к сюрфейсу, не то же самое, что вызов метода лок и получения указателя на данные? почему медленнее?
я не делал LockRect, просто вызывал D3DXLoadSurfaceFromMemory();
Указатель на surface сохранял заранее.
Пытался оптимизировать.
Получилось ни одного Lock'а или Get'тера. Просто D3DXLoadSurfaceFromMemory.