|
Xors3D Графический движок с поддержкой DirectX9 |
05.02.2012, 16:47
|
#391
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Странное.
ну косяк и так и так будет лишь при переполнении буфера, если работать в одном потоке.
просто вариант с локальной переменной самодостаточен, а для варианта со статические определенной глобальной переменной нужно ее еще определить где-то.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
06.02.2012, 09:34
|
#392
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: Странное.
Сообщение от dsd
Мой первый макрос
Вроде работает, вроде удобно
char msgBuffer[129];
#define text(a,b,c,d) \
sprintf(msgBuffer,c,d);\
xText(a,b,msgBuffer)
text(120,120,"current FPS is: %d",xGetFPS());
и сразу же второй
#define b_for(a,b) for(int a=0;a<b;a++)
|
вот для цикла макрос прокатит, а для функции text лучше написать inline функцию, а не макрос. ИМХО
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
06.02.2012, 13:05
|
#393
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Странное.
кстати да.
inlinte text(int x, int y, const char *foo, ...)
{
char buff[16535];
sprintf_s(buff,foo);
xtext(x,y,buff);
}
так наверное будет лучшее
|
(Offline)
|
|
06.02.2012, 15:21
|
#394
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
А по-моему макрос лучше.
И если макросу в принципе пофиг какие там типы входных данных, то для функции либо писать дополнительные варианты, либо писать шаблоном. Так что на мой вкус в данном случае функции лишнее, а макрос самое то.
|
(Offline)
|
|
06.02.2012, 17:33
|
#395
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Странное.
я извиняюсь, так просто все не работает.
работает с ms-специфик функцией vsprintf
inlinte text(int x, int y, const char *foo, ...)
{
va_list ap;
char buff[16535];
va_start(ap, foo);
vsprintf_s(buff,foo,ap);
va_end(ap);
xtext(x,y,buff);
}
просто так можно ее использовать как то так:
Print(L"The FPS:%d, Tris:%d, MousePos(%d,%d)",eng->GetStatistics()->GetFPS(),eng->GetStatistics()->TrisRendered(), MouseX(), MouseY());
а в твоем варианте ограниченно только одной переменной.
кстати, объясните мне пожалуйста почему первая функция не работает? можно ли как то сделать не ms специфик версию?
Последний раз редактировалось HolyDel, 06.02.2012 в 18:54.
|
(Offline)
|
|
06.02.2012, 18:30
|
#396
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
Сообщение от HolyDel
а в твоем варианте ограниченно только одной переменной.
|
Это единственное, что я понял из всего поста.
Кстати инлайн значит, что компилятор вместо имени функции подставляет её код. Макрос делает тоже самое но на уровне препроцессора. Так что я не вижу особой разницы. Тем более, что в интернетах вычитал, что современные компиляторы игнорируют слово инлайн и сами решают что лучше, а также посыл начинающим прогерам типа меня, сильно не умничать и не пытаться бестолку оптимизировать код с учетом того, что компилятор почти всегда справится лучше на не оптимизированном по сравнению с криво оптимизированным текстом.
|
(Offline)
|
|
06.02.2012, 19:38
|
#397
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Странное.
макросы всегда зло.
им пофиг на тип переменных, они вычисляют значения своих параметров каждый раз, и самое главное они ничего не знают об области видимости.
в частности WinAPI мне портит немало нервов из за того, что назвала макрос LoadImage. А у меня так метод называется. Ошибку трудно найти сразу, потому, что препроцессор. И хорошо, что оно еще не скомпилировалось
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо HolyDel за это полезное сообщение:
|
|
07.02.2012, 01:57
|
#398
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Странное.
Сообщение от HolyDel
я извиняюсь, так просто все не работает.
работает с ms-специфик функцией vsprintf
inlinte text(int x, int y, const char *foo, ...)
{
va_list ap;
char buff[16535];
va_start(ap, foo);
vsprintf_s(buff,foo,ap);
va_end(ap);
xtext(x,y,buff);
}
|
Страуструп не рекомендует использовать эту возможность языка.
inline ? А void чего опустили?
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
07.02.2012, 09:32
|
#399
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: Странное.
Сообщение от dsd
Это единственное, что я понял из всего поста.
Кстати инлайн значит, что компилятор вместо имени функции подставляет её код. Макрос делает тоже самое но на уровне препроцессора. Так что я не вижу особой разницы. Тем более, что в интернетах вычитал, что современные компиляторы игнорируют слово инлайн и сами решают что лучше, а также посыл начинающим прогерам типа меня, сильно не умничать и не пытаться бестолку оптимизировать код с учетом того, что компилятор почти всегда справится лучше на не оптимизированном по сравнению с криво оптимизированным текстом.
|
макросы используются в других вещях. Нахера ты все в кучу мешаешь. Вот макрос с циклом ты правильно написал, тут можно использовать, но нахера макросом описывать функцию O_o
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
07.02.2012, 12:58
|
#400
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
Сообщение от pozitiffcat
макросы используются в других вещях. Нахера ты все в кучу мешаешь. Вот макрос с циклом ты правильно написал, тут можно использовать, но нахера макросом описывать функцию O_o
|
Примерно по тем же причинам по которым ты высказываешь негодование по этому поводу, потому что я могу это.
|
(Offline)
|
|
07.02.2012, 14:19
|
#401
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: Странное.
Сообщение от dsd
потому что я могу это.
|
дык не только ты можешь
|
(Offline)
|
|
07.02.2012, 14:56
|
#402
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Странное.
да ладно, чо вы пристали к парню )) один раз потратит ночь на отладку программы из-за некстати объявленного макроса, и не будет их пользовать больше в случаях, где можно без них обойтись
inline ? А void чего опустили?
|
сорри. в браузере набирал.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
12.02.2012, 21:54
|
#403
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
HolyDel, в общем э...
CSurface *surf = new CSurface(24,36);
Смотрел на примере куба. Перовое число это количество точек в поверхности. Второе я не понял. Что это?
Из конструктора сplane я не догнал что это и как мне посчитать кол-во этих индексов, если я захотел сделать свой примитив. Как?
indices_ = new unsigned char[count_indices_*index_size_];
ZeroMemory(indices_,count_indices_ * index_size_);
vao_ =0;
vbo_ =0;
uabo_ =0;
ibo_ =0;
Или я не туда лезу? Справку я не понял
|
(Offline)
|
|
12.02.2012, 23:19
|
#404
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Странное.
второе - это число индексов. Так как сейчас единственный способ рисования сюрфейсов - это triangles list, то его можно понимать как кол-во триугольников * 3.
Те сюрфейсы, что ты смотришь - это часть движка. Я могу ползоваться реализацией (потомучто наглый), а пользователи не должны, для них есть интерфейс. На пользовательской части сюрфейс можно создать както так:
Surface *user_surface = eng->CreateSurface(24,12);
user_surface->Lock();
user_surface->SetVertexPosition(i,i,i,i);
user_surface->SetTriangle(i,v1,v2,v3);
user_surface->UnLock();
|
справку сложно понять - ее ведь нет ))
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
13.02.2012, 13:55
|
#405
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Странное.
Испытал проблемы с прорисовкой моего треугольника.
Оно стало рисоваться только после добавления моей поверхности к сцене из стандартного примера.
Так и надо? Или просто мой треугольник не попадал в кадр?
#include <axelynx/axelynx.h>
using namespace axelynx;
int main()
{
Engine *eng = Engine::Init();
Window *wnd = eng->AddWindow(800,600);
//TODO: Place your resource loading and scene creating code here
Scene *s = eng->AddScene();
Camera *cam = s->AddCamera();
Surface *cube = StandartSurfaces::Cube();
Entity *body = s->Add(cube);
StandartShaders::Render::OnlyNormals()->SetUniform(Shader::SU_LIGHTPOS,vec3(0,5,7));
body->SetShader(StandartShaders::Render::OnlyNormals());
body->SetPosition(0,0,-6);
Entity *turret = s->Add(cube);
turret->SetParent(body);
turret->SetShader(StandartShaders::Render::OnlyNormals());
turret->SetPosition(0,0.0,-1.25);
turret->SetScale(0.25);
turret = turret->Copy();
turret->SetPosition(0,0,1.25);
turret = turret->Copy();
turret->SetPosition(0,-1.25,0);
turret = turret->Copy();
turret->SetPosition(0,1.25,0);
turret = turret->Copy();
turret->SetPosition(-1.25,0,0);
turret = turret->Copy();
turret->SetPosition(1.25,0,0);
//*****************************************************
Surface *user_surface = eng->CreateSurface(3,6);
user_surface->Lock();
user_surface->SetVertexPosition(0,0,-16,6);
user_surface->SetVertexPosition(1,16,0,6);
user_surface->SetVertexPosition(2,-16,0,6);
user_surface->SetVertexTexCoord(0,vec2(0.5,1));
user_surface->SetVertexTexCoord(1,vec2(1,0));
user_surface->SetVertexTexCoord(2,vec2(0,0));
user_surface->SetVertexNormal(0,0,1,0);
user_surface->SetVertexNormal(1,0,1,0);
user_surface->SetVertexNormal(2,0,1,0);
user_surface->SetVertexColor(0,vec4(1.0f,1.0f,1.0f,1.0f));
user_surface->SetVertexColor(1,vec4(1.0f,1.0f,1.0f,1.0f));
user_surface->SetVertexColor(2,vec4(1.0f,1.0f,1.0f,1.0f));
user_surface->SetTriangle(0,0,2,1);
user_surface->SetTriangle(0,0,1,2);
user_surface->RecalcTangents();
user_surface->UnLock();
//отрисовалось только после этого. Это правильно?
s->Add(user_surface);
//****************************************************
float dx=0,dy=0;
while(wnd->isRunning())
{
if(KeyDown('A'))
dx -= 1.0;
if(KeyDown('D'))
dx += 1.0;
if(KeyDown('W'))
dy -= 1.0;
if(KeyDown('S'))
dy += 1.0;
//TODO: Place your rendering code here
float dt = Timer::Delta() * 0.01;
dx *= 0.95;
dy *= 0.95;
body->Turn(dt*dy,dt*dx,0);
s->Render();
wnd->Flip();
}
//TODO: Place your deinitalize code here
eng->Free();
}
Нормали оно само пересчитывать не умеет?
Последний раз редактировалось dsd, 13.02.2012 в 16:53.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 12:48.
|