Требуется литературка по OpenGL и ООП

0000

По OpenGL:
У кого нить курсы ВУЗ-е есть или хотя бы задания в электронном виде?
Интересует уровень.
Книги особо не нужны. Собрал и так почти все что можно (на торренте есть моя раздача, если кому надо).
По ООП и архитектуре:
Название книги, чтобы прогить концептуально. Что там классикой считается?
Язык программирования С++.

slonishka

GoF, "Современное проектирование" Александреску.
но лучше сразу читай исходники.

0000


Спасибо :)
Надеюсь одолею Александреску.
Посмотрел задачки по OpenGL - уровень начинающий.

kokoc88

Надеюсь одолею Александреску.
Это будет непросто. Ты уже заботал разложившегося страуса?

kokoc88

Осторожно, после заботывания Александреску повышается вероятность написания вот такого кода:
#if !BOOST_PP_IS_ITERATING

#ifndef CPP_CONSTRUCTOR_H
#define CPP_CONSTRUCTOR_H

#include <boost/preprocessor/punctuation/paren_if.hpp>
#include <boost/preprocessor/repetition/enum_params.hpp>
#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
#include <boost/preprocessor/repetition/repeat.hpp>
#include <boost/preprocessor/iteration/iterate.hpp>
#include "cpp_reg_base.h"
#include "convert_l2cpp.h"
#include "arity.h"
#include "replicator.h"

namespace lua_faber
{

#define LF_ARITY_VAL(z, n, text) n_ar<a ## n>::_v +

struct null_arg { };

// define constructor invoker type
typedef ptr_replicator*(*invoke_cons_tlua_ctx&);

// declare a constructor closure
class lua_cons_closure
{
public:

lua_cons_closure(invoke_cons_t invoke_cons, int arity) :
m_invoke_cons(invoke_cons
m_arity(arity
m_chained(false)
{
}

void register_self(const lua_ctx& ctx, const reg_scope& scope);

private:
invoke_cons_t m_invoke_cons;
std::vector<lua_cons_closure> m_chain;
int m_arity;
bool m_chained;

static int new_handler(lua_State* state);
};

// declare a constructor registry component
template<class c, BOOST_PP_ENUM_PARAMS(LF_MAX_ARITY, class a)>
class cons_comp : public reg_comp
{
public:
cons_comp : m_closure(invoke_cons, BOOST_PP_REPEAT(LF_MAX_ARITY, LF_ARITY_VAL, _) 0)
{
}

void register_self(const lua_ctx& ctx, const reg_scope& scope)
{
m_closure.register_self(ctx, scope);
}

const std::type_info& type
{
return typeid(void);
}

const char* name const
{
return "constructor";
}

template<class c> struct n_ar { enum { _v = 1 }; };
template<> struct n_ar<null_arg> { enum { _v = 0 }; };

static ptr_replicator* invoke_cons(lua_ctx& ctx)
{
c* pc = sel_invoke<c, BOOST_PP_REPEAT(LF_MAX_ARITY, LF_ARITY_VAL, _) 0>::invoke(ctx);
if (pc == NULL)
throw lua_runtime_exception("out of memory");
return ptr_replicator::create(ctx, pc);
}

// generate invoke classes
template<class c, int arity> class sel_invoke;
#define BOOST_PP_ITERATION_PARAMS_1 (3, (0, LF_MAX_ARITY, "cpp_constructor.h"
#define LF_CONS_PARAMS(z, n, N) convert::convert<a##n,boost::is_reference<a##n>::value,boost::is_pointer<a##n>::value>::apply(ctx, -N+n)
#include BOOST_PP_ITERATE

private:
lua_cons_closure m_closure;
};

// helper, which creates a constructor component
template<class c, BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(LF_MAX_ARITY, class a, null_arg)>
class constructor : public list_comp<c>
{
public:
constructor : m_comp(new cons_comp<c, BOOST_PP_ENUM_PARAMS(LF_MAX_ARITY, a)>)
{
}

operator reg_comp_ptr const
{
return m_comp;
}

private:
reg_comp_ptr m_comp;
};

}

#endif // CPP_CONSTRUCTOR_H

#else // !BOOST_PP_IS_ITERATING

// generate constructor invocation
template<class c>
class sel_invoke<c, BOOST_PP_ITERATION>
{
public:
static c* invoke(const lua_ctx& ctx)
{
return new c BOOST_PP_LPAREN_IF(BOOST_PP_ITERATION
BOOST_PP_ENUM(BOOST_PP_ITERATION LF_CONS_PARAMS, BOOST_PP_ITERATION
BOOST_PP_RPAREN_IF(BOOST_PP_ITERATION;
}
};

#endif

0000

Не, Страуструпа и Аммерааля еще не ботал сильно. Просто они по языку, а хоцца по концепции.

kokoc88

Не, Страуструпа и Аммерааля еще не ботал сильно. Просто они по языку, а хоцца по концепции.
Трупег волне себе по концепции. А то потом ты будешь использовать printf в логировании.

0000

Ок, ясно начнем с него.
Мне правда как Аммерааль пишет понравилось. Только вот лениво читать было.

slonishka

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

kokoc88

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

slonishka

Потом пробуешь это на практике, и ещё раз понимаешь те вещи, в которых ты сам был неправ.
мм? не совсем, кажется, понял, что ты хотел сказать.
поясни (на примере того же александреску) эту фразу, пожалуйста.

kokoc88

мм? не совсем, кажется, понял, что ты хотел сказать.
поясни (на примере того же александреску) эту фразу, пожалуйста.
На примере Александреску это пояснить непросто. Только от противного. Как бы ты сделал прозрачный биндинг между питоном и Си++, таким образом, чтобы объекты Си++ можно было бы создавать в питоне, чтобы можно было вызывать функции этих объектов и чтобы они удалялись и вызывался Си++ деструктор в момент, когда GC собирает эти объекты? До прочтения нескольких книг практически любой программист видит в этой задаче необходимость использовать парсер, после прочтения - не видит.

kokoc88

Мне правда как Аммерааль пишет понравилось. Только вот лениво читать было.
Хорошо и концептуально пишет Брюс Эккель.
Оставить комментарий
Имя или ник:
Комментарий: