forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Xors3D (http://forum.boolean.name/forumdisplay.php?f=126)
-   -   Странное. (http://forum.boolean.name/showthread.php?t=15405)

HolyDel 05.02.2012 16:47

Ответ: Странное.
 
ну косяк и так и так будет лишь при переполнении буфера, если работать в одном потоке.

просто вариант с локальной переменной самодостаточен, а для варианта со статические определенной глобальной переменной нужно ее еще определить где-то.

pozitiffcat 06.02.2012 09:34

Ответ: Странное.
 
Цитата:

Сообщение от dsd (Сообщение 218326)
Мой первый макрос :)
Вроде работает, вроде удобно :)
Код:

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 функцию, а не макрос. ИМХО

HolyDel 06.02.2012 13:05

Ответ: Странное.
 
кстати да.

Код:

inlinte text(int x, int y, const char *foo, ...)
{
char buff[16535];
sprintf_s(buff,foo);
xtext(x,y,buff);
}

так наверное будет лучшее

dsd 06.02.2012 15:21

Ответ: Странное.
 
А по-моему макрос лучше.
И если макросу в принципе пофиг какие там типы входных данных, то для функции либо писать дополнительные варианты, либо писать шаблоном. Так что на мой вкус в данном случае функции лишнее, а макрос самое то.

HolyDel 06.02.2012 17:33

Ответ: Странное.
 
я извиняюсь, так просто все не работает.

работает с 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 специфик версию?

dsd 06.02.2012 18:30

Ответ: Странное.
 
Цитата:

Сообщение от HolyDel (Сообщение 218805)

а в твоем варианте ограниченно только одной переменной.

Это единственное, что я понял из всего поста.

Кстати инлайн значит, что компилятор вместо имени функции подставляет её код. Макрос делает тоже самое но на уровне препроцессора. Так что я не вижу особой разницы. Тем более, что в интернетах вычитал, что современные компиляторы игнорируют слово инлайн и сами решают что лучше, а также посыл начинающим прогерам типа меня, сильно не умничать и не пытаться бестолку оптимизировать код с учетом того, что компилятор почти всегда справится лучше на не оптимизированном по сравнению с криво оптимизированным текстом.

HolyDel 06.02.2012 19:38

Ответ: Странное.
 
макросы всегда зло.

им пофиг на тип переменных, они вычисляют значения своих параметров каждый раз, и самое главное они ничего не знают об области видимости.
в частности WinAPI мне портит немало нервов из за того, что назвала макрос LoadImage. А у меня так метод называется. Ошибку трудно найти сразу, потому, что препроцессор. И хорошо, что оно еще не скомпилировалось :)

impersonalis 07.02.2012 01:57

Ответ: Странное.
 
Цитата:

Сообщение от HolyDel (Сообщение 218805)
я извиняюсь, так просто все не работает.

работает с 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 чего опустили?

pozitiffcat 07.02.2012 09:32

Ответ: Странное.
 
Цитата:

Сообщение от dsd (Сообщение 218812)
Это единственное, что я понял из всего поста.

Кстати инлайн значит, что компилятор вместо имени функции подставляет её код. Макрос делает тоже самое но на уровне препроцессора. Так что я не вижу особой разницы. Тем более, что в интернетах вычитал, что современные компиляторы игнорируют слово инлайн и сами решают что лучше, а также посыл начинающим прогерам типа меня, сильно не умничать и не пытаться бестолку оптимизировать код с учетом того, что компилятор почти всегда справится лучше на не оптимизированном по сравнению с криво оптимизированным текстом.

макросы используются в других вещях. Нахера ты все в кучу мешаешь. Вот макрос с циклом ты правильно написал, тут можно использовать, но нахера макросом описывать функцию O_o

dsd 07.02.2012 12:58

Ответ: Странное.
 
Цитата:

Сообщение от pozitiffcat (Сообщение 218875)
макросы используются в других вещях. Нахера ты все в кучу мешаешь. Вот макрос с циклом ты правильно написал, тут можно использовать, но нахера макросом описывать функцию O_o

Примерно по тем же причинам по которым ты высказываешь негодование по этому поводу, потому что я могу это.

pozitiffcat 07.02.2012 14:19

Ответ: Странное.
 
Цитата:

Сообщение от dsd (Сообщение 218888)
потому что я могу это.

дык не только ты можешь :-D

HolyDel 07.02.2012 14:56

Ответ: Странное.
 
да ладно, чо вы пристали к парню )) один раз потратит ночь на отладку программы из-за некстати объявленного макроса, и не будет их пользовать больше в случаях, где можно без них обойтись :)

Цитата:

inline ? А void чего опустили?
сорри. в браузере набирал.

dsd 12.02.2012 21:54

Ответ: Странное.
 
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;
Или я не туда лезу? Справку я не понял :)

HolyDel 12.02.2012 23:19

Ответ: Странное.
 
второе - это число индексов. Так как сейчас единственный способ рисования сюрфейсов - это 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();
справку сложно понять - ее ведь нет ))

dsd 13.02.2012 13:55

Ответ: Странное.
 
Испытал проблемы с прорисовкой моего треугольника.
Оно стало рисоваться только после добавления моей поверхности к сцене из стандартного примера.
Так и надо? Или просто мой треугольник не попадал в кадр?

Код:

#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();
}

Нормали оно само пересчитывать не умеет?


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

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