- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
struct ShaderBuilder
{
Shader ToShader() const;
ShaderParts::VertexDataSrc VertexDataSource;
ShaderParts::Transform Transformation;
ShaderParts::LightControl LightControl;
ShaderParts::ColorSrc DiffuseSource;
ShaderParts::EmissionSrc EmissionSource;
ShaderParts::SpecularSrc SpecularSource;
ShaderParts::HeightSrc HeightSource;
ShaderParts::NormalSrc NormalSource;
ShaderParts::Parallax Parallax;
ShaderParts::LightModel LightModel;
...
};
#define with(x) for(auto &_=(x), *firstIter=&_; firstIter; firstIter=nullptr)
...
using namespace ShaderParts;
ShaderBuilder floorShaderBuilder;
with(floorShaderBuilder)
{
_.Transformation=Transform::Default();
_.LightControl=ShaderParts::LightControl::DefaultLighting({ {DirectionalLight::Type, 1} });
_.DiffuseSource=ColorSrc::FromTexture();
_.SpecularSource=SpecularSrc::FromConstants("0.25", "16.0");
_.HeightSource=HeightSrc::FromHeightMap();
_.NormalSource=NormalSrc::FromNormalMap("rg");
_.Parallax=Parallax::SimpleParallax();
_.LightModel=LightModel::Phong();
}
floorSh=floorShaderBuilder.ToShader();
guest 05.08.2014 10:10 # 0
bormand 05.08.2014 10:14 # 0
roman-kashitsyn 05.08.2014 10:21 # +2
лучше Слишком мало макросов и магии?
defecate-plusplus 05.08.2014 10:35 # +1
Я Бы Ещё Ключевые Слова С++ Замакросил, А То Режет Глаза Этот Нижний Убогий Регистр
roman-kashitsyn 05.08.2014 10:40 # +2
@gammaker вроде по D угарает
gammaker 05.08.2014 10:46 # +1
kegdan 05.08.2014 11:49 # +3
gammaker 05.08.2014 10:45 # 0
Я на Delphi никогда не писал, но такую конструкцию видел в языке D. А если мне какая-то фича в каком-то языке нравится, то я её пытаюсь перенести в C++. А перейти сам на другой язык не могу, потому что у всех есть фатальные недостатки. У C++ их тем более полно, но не менять же шило на мыло.
Вот если бы в C++ перенесли хотя бы designated initializers из C99, то я бы обошёлся без with.
defecate-plusplus 05.08.2014 10:46 # 0
там заодно тебе this будет в скоупе
gammaker 05.08.2014 10:49 # 0
defecate-plusplus 05.08.2014 11:08 # 0
что тебе мешает сделать конструктор в структуре?
roman-kashitsyn 05.08.2014 11:12 # 0
defecate-plusplus 05.08.2014 11:14 # 0
хотя для этого есть и другие техники
gammaker 05.08.2014 11:28 # 0
В-третьих, намного читабельнее, когда видно, какой член структуры заполняется.
defecate-plusplus 05.08.2014 12:07 # 0
см. The Boost Parameter Library
а так то в твоей структуре члены дважды инициализируются - сначала по умолчанию, а потом уже новым значением
при этом, твоя декларация и инициализация реально разведены по коду, так что
> так как в структуре могут появляться новые члены
ты можешь и прозевать тот момент, что их надо в другом месте как бы и присвоить
gammaker 05.08.2014 13:55 # 0
Посмотрел, там какая-то чёрная магия, которую можно постить на этом сайте. По сравнению с этим мой with вполне безобидно выглядит.
>а так то в твоей структуре члены дважды инициализируются - сначала по умолчанию, а потом уже новым значением
Ничего страшного в этом нет, это же генератор шейдеров. Их компиляция займёт времени в 10000 раз больше, чем потери на эту лишнюю инициализацию.
>ты можешь и прозевать тот момент, что их надо в другом месте как бы и присвоить
Я подбираю параметры по умолчанию так, чтобы ничего не изменилось. Если новый член не инициализировали вручную, то его как будто бы и нет. Расширение структуры ничего не ломает.
roman-kashitsyn 05.08.2014 12:38 # +6
Структуры сами не заполнятся
guest 05.08.2014 13:16 # 0
kegdan 05.08.2014 13:20 # 0
Vasiliy 05.08.2014 16:33 # +1