Slide 1

Slide 1 text

$.*9 J04ΞϓϦʮύζϞφʯͷͻΈͭ ΅ͬͪήʔϜσϕϩού ੢ࢁ৴ߦ

Slide 2

Slide 2 text

w೥͔ΒձࣾΛసʑͱ͠ͳ͕ΒήʔϜ࡞Γ w 1$ɺՈఉ༻ήʔϜػɺΨϥέʔɺεϚϗʜ w೔ຊిࢠઐ໳ֶߍͰि೔ήʔϜ࡞ΓΛڭ͑ͯ· ͢ w࠷ۙΞχϝ5)&*%0-.!45&3Λ؍ऴΘΓ· ͨ͠ʂ ੢ࢁ৴ߦͱ͸

Slide 3

Slide 3 text

ࡢ೥຤ɺٱʑʹΞϓϦΛϦϦʔεʂ

Slide 4

Slide 4 text

wͻΈͭ̍։ൃ؀ڥͷͻΈͭ wͻΈͭ̎ϚϧνϓϥοτϑΥʔϜͷͻΈͭ wͻΈͭ̏6*࣮૷ͷͻΈͭ wࠓ೔͍͞͝ͷͻΈͭ ࠓ೔͸͜ͷΞϓϦͷͻΈͭΛ࿩͠·͢ʂ

Slide 5

Slide 5 text

w ్த࿩͕ݟ͑ͳ͘ͳͬͨΓɺҾֻ͔ͬͬͨࣄ͕ ͋Ε͹ɺԕྀͳͦ͘ͷ৔Ͱ࣭໰͍ͯͩ͘͠͞ wྫࣔ͢Δίʔυ͸ϨΠΞ΢τͷ౎߹্͡Ό͔ͬ Μෆਖ਼֬Ͱ͢ ͦͷલʹ

Slide 6

Slide 6 text

ͻΈͭ̍։ൃ؀ڥͷͻΈͭ $.*9

Slide 7

Slide 7 text

w$Ͱ։ൃ wৗ࣌GQTͰψϧψϧಈ͘ wҰॠͰΞϓϦ͕ىಈɻϩʔυը໘ͱ͸ແԑͰα ΫαΫಈ͘ ͜ͷΞϓϦͷಛ௃

Slide 8

Slide 8 text

w6OJUZ΍6&Ͱ΋͍͍Μ͚ͩͲɺઐ໳ֶߍͷڭ͑ ࢠͨͪ΁ͷڭࡐ͕ཉ͍͠ w$ؤݻ͓͡͞Μ͕͍͍͍ͨͬͯ͡Όͳ͍ wJ04ͷ0CKFDUJWF$ͱซ༻Մೳ ͳͥ$ʁ

Slide 9

Slide 9 text

͜Ε࢖͍ͬͯ·͢

Slide 10

Slide 10 text

wϏδϡΞϧσβΠϯ޲͚ͷ$ϥΠϒϥϦ wNBD04ɺJ04ɺ8JOEPXTʹରԠ w$Ͱͷͼͷͼ։ൃͰ͖Δ wϥΠϒϥϦͷϑϧϏϧυ͕αΫοͱͰ͖Δ $JOEFSͱ͸

Slide 11

Slide 11 text

͜Μͳײ͡ͷσϞͰΑ͘࢖ΘΕ͍ͯΔΒ͍͠

Slide 12

Slide 12 text

wIUUQTSFTFBSDIQSFGFSSFEKQDJOEFSJOUSP 1SFGFSSFE/FUXPSLͷதͷਓ΋ਪͯ͠Δʂ

Slide 13

Slide 13 text

wެࣜαΠτ w IUUQTMJCDJOEFSPSH w(JU)VC w IUUQTHJUIVCDPNDJOEFS$JOEFS w ։ൃϒϥϯν͸EFW ࠷৽൛Ͱ͋ΔΛར༻

Slide 14

Slide 14 text

)FMMP $JOEFSXPSME #include #include #include class CinderProjectApp : public ci::app::App { public: CinderProjectApp() = default; void mouseDown(ci::app::MouseEvent event) override; void update() override; void draw() override; }; void CinderProjectApp::mouseDown(ci::app::MouseEvent event) { } void CinderProjectApp::update() { } void CinderProjectApp::draw() { ci::gl::clear(ci::Color( 0, 0, 0 )); } CINDER_APP(CinderProjectApp, ci::app::RendererGl)

Slide 15

Slide 15 text

wް͔·͘͠ͳ͍ఔ౓ʹ0QFO(-Λϥοϓ͍ͯ͠ Δ wλονೖྗͳͲΛ04ͷҧ͍Λؾʹͤͣѻ͑Δ wα΢ϯυपΓ΋04ͷҧ͍Λؾʹͤͣѻ͑Δ wࣗݾ੹೚ͰϥΠϒϥϦʹखΛೖΕΒΕΔ $JOEFSͷྑ͞

Slide 16

Slide 16 text

wα΢ϯυͷઃܭ͕ڽΓ͗ͯͯ͢J04ͰϘτϧωο ΫʹͳΓ͕ͪ wϞσϧσʔλͷαϙʔτ͸0#+ܗࣜͷΈ w೔ຊޠද͕ࣔඍົɹ w࠷৽൛͸γΣʔμʔલఏͳͷͰॳ৺ऀʹ͸΍΍ ͭΒ͍ʜ $JOEFSͷඍົ͞

Slide 17

Slide 17 text

ͻΈͭ̎ϚϧνϓϥοτϑΥʔ ϜͷͻΈͭ $.*9

Slide 18

Slide 18 text

wιʔεϑΝΠϧ͸65' #0.෇͖ Ͱ w 7JTVBM4UVEJPͰ65' #0.ແ͠ ͷιʔείʔυΛϏϧ υ͢ΔͱίϯύΠϥ͕จࣈίʔυΛ$1ͱͯ͠ѻ͏ कΔ΂͖ϧʔϧ

Slide 19

Slide 19 text

w$Λ࢖͏ w0QFO(-΋όʔδϣϯΛܾΊΔ
 
 w 0QFO(-ͱ0QFO(-&4Ͱ͋Ε͹γΣʔμʔͷࠩҟ ͕গͳ͍ ͋Β͔͡ΊܾΊ͓͍ͯͨࣄ σεΫτοϓ൛ 0QFO(- J04൛ 0QFO(-&4

Slide 20

Slide 20 text

w0QFO(-ͱ0QFO(-&4ͷγΣʔμʔ͸ શ͘ಉ͡Ͱ͸ͳ͍ w $JOEFSͷαϯϓϧ΋ݸผʹ༻ҙ͍ͯ͠Δ 0QFO(-ͷγΣʔμʔʹؔͯ͠

Slide 21

Slide 21 text

w0QFO(-ͷγΣʔμʔ͸࣮ߦ࣌ʹίϯύΠϧ͢Δ ͷͰɺ࣮ߦ؀ڥ͝ͱʹΰχϣΰχϣͰ͖Δ Ͳ͏͢Δ͔

Slide 22

Slide 22 text

γΣʔμʔྫ 0QFO(- // // Field描画(Fragment shader) // #version 330 out vec4 oColor; void main(void) { oColor = vec4(1); } // // Field描画(Vertex shader) // #version 330 uniform mat4 ciModelViewProjection; in vec4 ciPosition; void main(void) { vec4 p = ciPosition; gl_Position = ciModelViewProjection * p; }

Slide 23

Slide 23 text

γΣʔμʔྫ 0QFO(-&4 // // Field描画(Fragment shader) // #version 300 es precision highp float; precision mediump sampler2DShadow; out vec4 oColor; void main(void) { oColor = vec4(1); } // // Field描画(Vertex shader) // #version 300 es uniform mat4 ciModelViewProjection; in vec4 ciPosition; void main(void) { vec4 p = ciPosition; gl_Position = ciModelViewProjection * p; }

Slide 24

Slide 24 text

w$Ҏ߱Ͱ͋Ε͹std::regexΛ࢖ͬͯαΫ αΫจࣈྻஔ׵Ͱ͖Δ wਖ਼نදݱͷจ๏͸&$."4DSJQUͷͦΕͱಉ͡ std::regexͷग़൪ʂ // 正規表現のパターンに一致した全ての箇所を置き換えた // 新しい文字列を作成 auto text = std::regex_replace(shader_text, std::regex("\\$version\\$"), "#version 300 es");

Slide 25

Slide 25 text

ॻ͖׵͑ΔՕॴʹΩʔϫʔυΛࢦఆ // // Field描画(Fragment shader) // $version$ $precision$ out vec4 oColor; void main(void) { oColor = vec4(1); } // // Field描画(Vertex shader) // $version$ uniform mat4 ciModelViewProjection; in vec4 ciPosition; void main(void) { vec4 p = ciPosition; gl_Position = ciModelViewProjection * p; }

Slide 26

Slide 26 text

ΩʔϫʔυΛஔ͖׵͑Δ 0QFO(- 0QFO(-&4 $version$ #version 330 #version 300 es $precision$ precision highp float; precision mediump sampler2DShadow;

Slide 27

Slide 27 text

wۃྗnewͱdeleteΛ࢖Θͳ͍ wแؚ͔εϚʔτϙΠϯλΛ࢖͏ newͱdelete

Slide 28

Slide 28 text

wϝϞϦ؅ཧ͸ίϯύΠϥʹ೚͓͍ͤͯͨ΄͏͕ѹ ౗తʹָʂ w੿࡞Ͱ͸࠷ޙ·Ͱnewͱdeleteͷग़൪͕ͳ͔ͬͨ deleteΛίʔυ͔Βdelete class Fuga {}; class Piyo {}; class Hoge { Fuga fuga; // 包含 std::shared_ptr piyo; // スマートポインタ ~Hoge() = default; // デストラクタで何もしない };

Slide 29

Slide 29 text

ͻΈͭ̏6*࣮૷ͷͻΈͭ $.*9

Slide 30

Slide 30 text

wجຊΫϥεΛܧঝ࣮ͯ͠૷͢Δײ͡Ͱ Α͘ݟ͔͚Δ6*࣮૷ͷύλʔϯ // 全てのUIの基本クラス class UIBase { virtual void setPosition(int x, int y) {} virtual void draw() {}; }; // ボタン class UIButton : public UIBase { void draw() override {} }; // テキスト class UIText : public UIBase { void draw() override {} };

Slide 31

Slide 31 text

wͦΕͧΕͷΫϥεʹద࣌௥Ճ͢Δ ಛఆͷΫϥεͰͷΈඞཁͳ஋ͷઃఆ΍औಘ // ボタン class UIButton : public UIBase { void setSize(int width, int height) {} // ボタン専用 void draw() override {} }; // テキスト class UIText : public UIBase { void setText(std::string text) {} // テキスト専用 void draw() override {} };

Slide 32

Slide 32 text

wdynamic_cast࢖͍ͨ͘ͳ͍ ͳΜ͔Πέͯͳ͍ʜ // テキスト class UIText : public UIBase { void setText(std::string text) {} // テキスト専用 void draw() override {} }; void f() { // 全てのUIを同一コンテナに格納 std::vector widgets; auto* a = widgets[0]; a->setText("ほげ"); // もちろんできない auto* b = dynamic_cast(a); b->setText("ほげ"); // aがUITextだという保証はない }

Slide 33

Slide 33 text

wҎલͷΞϓϦ͸͜ͷ࣮૷ʹͳͬͯ͠·ͬͨ ͦͯ͠ਆϕʔεΫϥεͷ஀ੜʜ // 全てのUIの基本クラス class UIBase { virtual void setPosition(int x, int y) {} virtual void setSize(int width, int height) {} // ボタン専用 virtual void setText(std::string text) {} // テキスト専用 virtual void draw() {}; };

Slide 34

Slide 34 text

wجຊΫϥεΛܧঝ͢Δͷ͸ΞϦ w ̍ͭͷίϯςφͰҰׅ؅ཧͰ͖Δ wͰ΋Ωϟετͯ͠࢖͍ͨ͘ͳ͍ ࣗ෼తʹ೉໰ͩͬͨ

Slide 35

Slide 35 text

wboost::anyΛ࢖ͬͨ w ͲΜͳܕͷ஋΋֨ೲͰ͖Δܕ ܕ҆શͳWPJEϙΠϯλ Ͳ͏΍ͬͯղܾ͔ͨ͠

Slide 36

Slide 36 text

wͲΜͳܕͷ஋΋֨ೲͰ͖Δܕ w ܕ҆શͳWPJEϙΠϯλ w D͔Β͸std::any͕ొ৔ boost::anyͱ͸ void f() { boost::any value; value = 1; // int型の値を格納 auto a = boost::any_cast(value); // int型の値を取り出す value = 1.5; // double型の値を格納 auto b = boost::any_cast(value); // double型の値を取り出す auto c = boost::any_cast(value); // 型が違うと例外が発生する }

Slide 37

Slide 37 text

w஋ͷઃఆͱऔಘʹؔͯ͠ந৅ԽͰ͖ͨ w $ͷʮܕ҆શʯ͸ࣦΘΕͯ͠·ͬͨʜ boost::anyΛ࢖ͬͯ͜Μͳײ͡ʹ࣮૷ class UIBase { virtual void draw() {} // 値の設定 virtual void setParam(std::string name, boost::any values) {} // 値の取得 virtual boost::any getParam(std::string name) {} };

Slide 38

Slide 38 text

w۩ମతͳܕΛҙࣝͤͣʹ৭ʑॲཧ͕ॻ͚Δ w ಛʹςΩετ͔ΒಡΈࠐΜͩ஋Λઃఆ͢ΔΑ͏ͳঢ়گͰָ ͜Μͳײ͡ʹॻ͚Δ void f() { std::vector widgets; auto* a = widgets[0]; // 具体的な型は不明 vec2 pos(0, 0); a->setParam("position", pos); // 対応していれば値が設定される std::string text("ほげ"); a->setParam("text", text); // 対応していれば値が設定される float r = 10.0f; a->setParam("radius", r); // 対応していれば値が設定される }

Slide 39

Slide 39 text

ࠓ೔͍͞͝ͷͻΈͭ $.*9

Slide 40

Slide 40 text

wIUUQTHJUIVCDPNUFLOJTIJ1V[[MF"OE.POBSDI ιʔείʔυެ։தʂ

Slide 41

Slide 41 text

w5XJUUFS!NJOHBNF w'BDFCPPLNJOHBNF w(JU)VCUFLOJTIJ Ҏ্ɺJ04ΞϓϦʮύζϞφʯͷͻΈͭͰͨ͠ʂ ΞϓϦ޷ධ഑৴தʂ