From 98896484a672905baccd887fcb271a04ab8bc1c9 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Wed, 26 Jul 2023 03:48:09 +0000 Subject: [PATCH] deploy: 5a34cd2ade16839599f3fd574abad4b12c0831a9 --- en/.doctrees/environment.pickle | Bin 360579 -> 360579 bytes en/_static/pygments.css | 115 +++---- en/api/0_106_spring_manual_update.html | 6 +- en/api/0_44_runtime_import.html | 152 ++++----- en/api/0_58_blendshape.html | 44 +-- en/api/0_68_runtime_import.html | 156 +++++----- en/api/0_76_texture_deserializer.html | 36 +-- en/api/0_77_runtime_import.html | 62 ++-- en/api/0_79_runtime_import.html | 6 +- en/api/0_82_glb_import.html | 78 ++--- en/api/0_82_runtime_import.html | 50 +-- en/api/0_87_runtime_import.html | 158 +++++----- en/api/0_95_dispose.html | 12 +- en/api/0_95_highlevel.html | 198 ++++++------ en/api/fast_spring_bone.html | 16 +- en/api/firstperson.html | 70 ++--- en/api/how_to_customize_material_import.html | 18 +- en/api/how_to_impl_extension.html | 312 +++++++++---------- en/api/sample/FirstPersonSample.html | 38 +-- en/api/sample/RuntimeExporterSample.html | 36 +-- en/api/sample/SimpleViewer.html | 96 +++--- en/implementation/coordinate.html | 40 +-- en/implementation/scripted_importer.html | 10 +- en/implementation/texture_manipulation.html | 30 +- en/release/055/v0.41.html | 10 +- en/release/055/v0.42.html | 16 +- en/release/055/v0.44.html | 22 +- en/release/055/v0.46.html | 8 +- en/release/056/v0.56.0.html | 62 ++-- en/release/079/index.html | 12 +- en/release/100/index.html | 12 +- en/unihumanoid/index.html | 6 +- en/vrm1/api_update.html | 28 +- en/vrm1/vrm1_controlrig.html | 84 ++--- en/vrm1/vrm1_firstperson.html | 36 +-- en/vrm1/vrm1_load.html | 50 +-- en/vrm1/vrm1_springbone.html | 26 +- ja/.doctrees/environment.pickle | Bin 360829 -> 360829 bytes ja/_static/pygments.css | 115 +++---- ja/api/0_106_spring_manual_update.html | 6 +- ja/api/0_44_runtime_import.html | 152 ++++----- ja/api/0_58_blendshape.html | 44 +-- ja/api/0_68_runtime_import.html | 156 +++++----- ja/api/0_76_texture_deserializer.html | 36 +-- ja/api/0_77_runtime_import.html | 62 ++-- ja/api/0_79_runtime_import.html | 6 +- ja/api/0_82_glb_import.html | 78 ++--- ja/api/0_82_runtime_import.html | 50 +-- ja/api/0_87_runtime_import.html | 158 +++++----- ja/api/0_95_dispose.html | 12 +- ja/api/0_95_highlevel.html | 198 ++++++------ ja/api/fast_spring_bone.html | 16 +- ja/api/firstperson.html | 70 ++--- ja/api/how_to_customize_material_import.html | 18 +- ja/api/how_to_impl_extension.html | 312 +++++++++---------- ja/api/sample/FirstPersonSample.html | 38 +-- ja/api/sample/RuntimeExporterSample.html | 36 +-- ja/api/sample/SimpleViewer.html | 96 +++--- ja/implementation/coordinate.html | 40 +-- ja/implementation/scripted_importer.html | 10 +- ja/implementation/texture_manipulation.html | 30 +- ja/release/055/v0.41.html | 10 +- ja/release/055/v0.42.html | 16 +- ja/release/055/v0.44.html | 22 +- ja/release/055/v0.46.html | 8 +- ja/release/056/v0.56.0.html | 62 ++-- ja/release/079/index.html | 12 +- ja/release/100/index.html | 12 +- ja/unihumanoid/index.html | 6 +- ja/vrm1/api_update.html | 28 +- ja/vrm1/vrm1_controlrig.html | 84 ++--- ja/vrm1/vrm1_firstperson.html | 36 +-- ja/vrm1/vrm1_load.html | 50 +-- ja/vrm1/vrm1_springbone.html | 26 +- 74 files changed, 2114 insertions(+), 2108 deletions(-) diff --git a/en/.doctrees/environment.pickle b/en/.doctrees/environment.pickle index 501bcaafb7a1dd3d7006e137382f49d71229d78e..f7359f6e8179f2f31c5ee78e4ff35ff5b41dc7ed 100644 GIT binary patch delta 23736 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 K&~$IS@jn1gDDA2M delta 23799 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 diff --git a/en/_static/pygments.css b/en/_static/pygments.css index 3003859f6..4aef807b6 100644 --- a/en/_static/pygments.css +++ b/en/_static/pygments.css @@ -54,6 +54,7 @@ .highlight .nt { color: #204a87; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #000000 } /* Name.Variable */ .highlight .ow { color: #204a87; font-weight: bold } /* Operator.Word */ +.highlight .pm { color: #000000; font-weight: bold } /* Punctuation.Marker */ .highlight .w { color: #f8f8f8 } /* Text.Whitespace */ .highlight .mb { color: #0000cf; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000cf; font-weight: bold } /* Literal.Number.Float */ @@ -87,21 +88,21 @@ body[data-theme="dark"] .highlight td.linenos .special { color: #000000; backgro body[data-theme="dark"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } body[data-theme="dark"] .highlight .hll { background-color: #404040 } body[data-theme="dark"] .highlight { background: #202020; color: #d0d0d0 } -body[data-theme="dark"] .highlight .c { color: #999999; font-style: italic } /* Comment */ +body[data-theme="dark"] .highlight .c { color: #ababab; font-style: italic } /* Comment */ body[data-theme="dark"] .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ body[data-theme="dark"] .highlight .esc { color: #d0d0d0 } /* Escape */ body[data-theme="dark"] .highlight .g { color: #d0d0d0 } /* Generic */ -body[data-theme="dark"] .highlight .k { color: #6ab825; font-weight: bold } /* Keyword */ +body[data-theme="dark"] .highlight .k { color: #6ebf26; font-weight: bold } /* Keyword */ body[data-theme="dark"] .highlight .l { color: #d0d0d0 } /* Literal */ body[data-theme="dark"] .highlight .n { color: #d0d0d0 } /* Name */ body[data-theme="dark"] .highlight .o { color: #d0d0d0 } /* Operator */ body[data-theme="dark"] .highlight .x { color: #d0d0d0 } /* Other */ body[data-theme="dark"] .highlight .p { color: #d0d0d0 } /* Punctuation */ -body[data-theme="dark"] .highlight .ch { color: #999999; font-style: italic } /* Comment.Hashbang */ -body[data-theme="dark"] .highlight .cm { color: #999999; font-style: italic } /* Comment.Multiline */ -body[data-theme="dark"] .highlight .cp { color: #cd2828; font-weight: bold } /* Comment.Preproc */ -body[data-theme="dark"] .highlight .cpf { color: #999999; font-style: italic } /* Comment.PreprocFile */ -body[data-theme="dark"] .highlight .c1 { color: #999999; font-style: italic } /* Comment.Single */ +body[data-theme="dark"] .highlight .ch { color: #ababab; font-style: italic } /* Comment.Hashbang */ +body[data-theme="dark"] .highlight .cm { color: #ababab; font-style: italic } /* Comment.Multiline */ +body[data-theme="dark"] .highlight .cp { color: #ff3a3a; font-weight: bold } /* Comment.Preproc */ +body[data-theme="dark"] .highlight .cpf { color: #ababab; font-style: italic } /* Comment.PreprocFile */ +body[data-theme="dark"] .highlight .c1 { color: #ababab; font-style: italic } /* Comment.Single */ body[data-theme="dark"] .highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */ body[data-theme="dark"] .highlight .gd { color: #d22323 } /* Generic.Deleted */ body[data-theme="dark"] .highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */ @@ -113,36 +114,37 @@ body[data-theme="dark"] .highlight .gp { color: #aaaaaa } /* Generic.Prompt */ body[data-theme="dark"] .highlight .gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */ body[data-theme="dark"] .highlight .gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */ body[data-theme="dark"] .highlight .gt { color: #d22323 } /* Generic.Traceback */ -body[data-theme="dark"] .highlight .kc { color: #6ab825; font-weight: bold } /* Keyword.Constant */ -body[data-theme="dark"] .highlight .kd { color: #6ab825; font-weight: bold } /* Keyword.Declaration */ -body[data-theme="dark"] .highlight .kn { color: #6ab825; font-weight: bold } /* Keyword.Namespace */ -body[data-theme="dark"] .highlight .kp { color: #6ab825 } /* Keyword.Pseudo */ -body[data-theme="dark"] .highlight .kr { color: #6ab825; font-weight: bold } /* Keyword.Reserved */ -body[data-theme="dark"] .highlight .kt { color: #6ab825; font-weight: bold } /* Keyword.Type */ +body[data-theme="dark"] .highlight .kc { color: #6ebf26; font-weight: bold } /* Keyword.Constant */ +body[data-theme="dark"] .highlight .kd { color: #6ebf26; font-weight: bold } /* Keyword.Declaration */ +body[data-theme="dark"] .highlight .kn { color: #6ebf26; font-weight: bold } /* Keyword.Namespace */ +body[data-theme="dark"] .highlight .kp { color: #6ebf26 } /* Keyword.Pseudo */ +body[data-theme="dark"] .highlight .kr { color: #6ebf26; font-weight: bold } /* Keyword.Reserved */ +body[data-theme="dark"] .highlight .kt { color: #6ebf26; font-weight: bold } /* Keyword.Type */ body[data-theme="dark"] .highlight .ld { color: #d0d0d0 } /* Literal.Date */ -body[data-theme="dark"] .highlight .m { color: #3677a9 } /* Literal.Number */ +body[data-theme="dark"] .highlight .m { color: #51b2fd } /* Literal.Number */ body[data-theme="dark"] .highlight .s { color: #ed9d13 } /* Literal.String */ body[data-theme="dark"] .highlight .na { color: #bbbbbb } /* Name.Attribute */ -body[data-theme="dark"] .highlight .nb { color: #24909d } /* Name.Builtin */ -body[data-theme="dark"] .highlight .nc { color: #447fcf; text-decoration: underline } /* Name.Class */ +body[data-theme="dark"] .highlight .nb { color: #2fbccd } /* Name.Builtin */ +body[data-theme="dark"] .highlight .nc { color: #71adff; text-decoration: underline } /* Name.Class */ body[data-theme="dark"] .highlight .no { color: #40ffff } /* Name.Constant */ body[data-theme="dark"] .highlight .nd { color: #ffa500 } /* Name.Decorator */ body[data-theme="dark"] .highlight .ni { color: #d0d0d0 } /* Name.Entity */ body[data-theme="dark"] .highlight .ne { color: #bbbbbb } /* Name.Exception */ -body[data-theme="dark"] .highlight .nf { color: #447fcf } /* Name.Function */ +body[data-theme="dark"] .highlight .nf { color: #71adff } /* Name.Function */ body[data-theme="dark"] .highlight .nl { color: #d0d0d0 } /* Name.Label */ -body[data-theme="dark"] .highlight .nn { color: #447fcf; text-decoration: underline } /* Name.Namespace */ +body[data-theme="dark"] .highlight .nn { color: #71adff; text-decoration: underline } /* Name.Namespace */ body[data-theme="dark"] .highlight .nx { color: #d0d0d0 } /* Name.Other */ body[data-theme="dark"] .highlight .py { color: #d0d0d0 } /* Name.Property */ -body[data-theme="dark"] .highlight .nt { color: #6ab825; font-weight: bold } /* Name.Tag */ +body[data-theme="dark"] .highlight .nt { color: #6ebf26; font-weight: bold } /* Name.Tag */ body[data-theme="dark"] .highlight .nv { color: #40ffff } /* Name.Variable */ -body[data-theme="dark"] .highlight .ow { color: #6ab825; font-weight: bold } /* Operator.Word */ +body[data-theme="dark"] .highlight .ow { color: #6ebf26; font-weight: bold } /* Operator.Word */ +body[data-theme="dark"] .highlight .pm { color: #d0d0d0 } /* Punctuation.Marker */ body[data-theme="dark"] .highlight .w { color: #666666 } /* Text.Whitespace */ -body[data-theme="dark"] .highlight .mb { color: #3677a9 } /* Literal.Number.Bin */ -body[data-theme="dark"] .highlight .mf { color: #3677a9 } /* Literal.Number.Float */ -body[data-theme="dark"] .highlight .mh { color: #3677a9 } /* Literal.Number.Hex */ -body[data-theme="dark"] .highlight .mi { color: #3677a9 } /* Literal.Number.Integer */ -body[data-theme="dark"] .highlight .mo { color: #3677a9 } /* Literal.Number.Oct */ +body[data-theme="dark"] .highlight .mb { color: #51b2fd } /* Literal.Number.Bin */ +body[data-theme="dark"] .highlight .mf { color: #51b2fd } /* Literal.Number.Float */ +body[data-theme="dark"] .highlight .mh { color: #51b2fd } /* Literal.Number.Hex */ +body[data-theme="dark"] .highlight .mi { color: #51b2fd } /* Literal.Number.Integer */ +body[data-theme="dark"] .highlight .mo { color: #51b2fd } /* Literal.Number.Oct */ body[data-theme="dark"] .highlight .sa { color: #ed9d13 } /* Literal.String.Affix */ body[data-theme="dark"] .highlight .sb { color: #ed9d13 } /* Literal.String.Backtick */ body[data-theme="dark"] .highlight .sc { color: #ed9d13 } /* Literal.String.Char */ @@ -156,13 +158,13 @@ body[data-theme="dark"] .highlight .sx { color: #ffa500 } /* Literal.String.Othe body[data-theme="dark"] .highlight .sr { color: #ed9d13 } /* Literal.String.Regex */ body[data-theme="dark"] .highlight .s1 { color: #ed9d13 } /* Literal.String.Single */ body[data-theme="dark"] .highlight .ss { color: #ed9d13 } /* Literal.String.Symbol */ -body[data-theme="dark"] .highlight .bp { color: #24909d } /* Name.Builtin.Pseudo */ -body[data-theme="dark"] .highlight .fm { color: #447fcf } /* Name.Function.Magic */ +body[data-theme="dark"] .highlight .bp { color: #2fbccd } /* Name.Builtin.Pseudo */ +body[data-theme="dark"] .highlight .fm { color: #71adff } /* Name.Function.Magic */ body[data-theme="dark"] .highlight .vc { color: #40ffff } /* Name.Variable.Class */ body[data-theme="dark"] .highlight .vg { color: #40ffff } /* Name.Variable.Global */ body[data-theme="dark"] .highlight .vi { color: #40ffff } /* Name.Variable.Instance */ body[data-theme="dark"] .highlight .vm { color: #40ffff } /* Name.Variable.Magic */ -body[data-theme="dark"] .highlight .il { color: #3677a9 } /* Literal.Number.Integer.Long */ +body[data-theme="dark"] .highlight .il { color: #51b2fd } /* Literal.Number.Integer.Long */ @media (prefers-color-scheme: dark) { body:not([data-theme="light"]) .highlight pre { line-height: 125%; } body:not([data-theme="light"]) .highlight td.linenos .normal { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; } @@ -171,21 +173,21 @@ body:not([data-theme="light"]) .highlight td.linenos .special { color: #000000; body:not([data-theme="light"]) .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } body:not([data-theme="light"]) .highlight .hll { background-color: #404040 } body:not([data-theme="light"]) .highlight { background: #202020; color: #d0d0d0 } -body:not([data-theme="light"]) .highlight .c { color: #999999; font-style: italic } /* Comment */ +body:not([data-theme="light"]) .highlight .c { color: #ababab; font-style: italic } /* Comment */ body:not([data-theme="light"]) .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ body:not([data-theme="light"]) .highlight .esc { color: #d0d0d0 } /* Escape */ body:not([data-theme="light"]) .highlight .g { color: #d0d0d0 } /* Generic */ -body:not([data-theme="light"]) .highlight .k { color: #6ab825; font-weight: bold } /* Keyword */ +body:not([data-theme="light"]) .highlight .k { color: #6ebf26; font-weight: bold } /* Keyword */ body:not([data-theme="light"]) .highlight .l { color: #d0d0d0 } /* Literal */ body:not([data-theme="light"]) .highlight .n { color: #d0d0d0 } /* Name */ body:not([data-theme="light"]) .highlight .o { color: #d0d0d0 } /* Operator */ body:not([data-theme="light"]) .highlight .x { color: #d0d0d0 } /* Other */ body:not([data-theme="light"]) .highlight .p { color: #d0d0d0 } /* Punctuation */ -body:not([data-theme="light"]) .highlight .ch { color: #999999; font-style: italic } /* Comment.Hashbang */ -body:not([data-theme="light"]) .highlight .cm { color: #999999; font-style: italic } /* Comment.Multiline */ -body:not([data-theme="light"]) .highlight .cp { color: #cd2828; font-weight: bold } /* Comment.Preproc */ -body:not([data-theme="light"]) .highlight .cpf { color: #999999; font-style: italic } /* Comment.PreprocFile */ -body:not([data-theme="light"]) .highlight .c1 { color: #999999; font-style: italic } /* Comment.Single */ +body:not([data-theme="light"]) .highlight .ch { color: #ababab; font-style: italic } /* Comment.Hashbang */ +body:not([data-theme="light"]) .highlight .cm { color: #ababab; font-style: italic } /* Comment.Multiline */ +body:not([data-theme="light"]) .highlight .cp { color: #ff3a3a; font-weight: bold } /* Comment.Preproc */ +body:not([data-theme="light"]) .highlight .cpf { color: #ababab; font-style: italic } /* Comment.PreprocFile */ +body:not([data-theme="light"]) .highlight .c1 { color: #ababab; font-style: italic } /* Comment.Single */ body:not([data-theme="light"]) .highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */ body:not([data-theme="light"]) .highlight .gd { color: #d22323 } /* Generic.Deleted */ body:not([data-theme="light"]) .highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */ @@ -197,36 +199,37 @@ body:not([data-theme="light"]) .highlight .gp { color: #aaaaaa } /* Generic.Prom body:not([data-theme="light"]) .highlight .gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */ body:not([data-theme="light"]) .highlight .gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */ body:not([data-theme="light"]) .highlight .gt { color: #d22323 } /* Generic.Traceback */ -body:not([data-theme="light"]) .highlight .kc { color: #6ab825; font-weight: bold } /* Keyword.Constant */ -body:not([data-theme="light"]) .highlight .kd { color: #6ab825; font-weight: bold } /* Keyword.Declaration */ -body:not([data-theme="light"]) .highlight .kn { color: #6ab825; font-weight: bold } /* Keyword.Namespace */ -body:not([data-theme="light"]) .highlight .kp { color: #6ab825 } /* Keyword.Pseudo */ -body:not([data-theme="light"]) .highlight .kr { color: #6ab825; font-weight: bold } /* Keyword.Reserved */ -body:not([data-theme="light"]) .highlight .kt { color: #6ab825; font-weight: bold } /* Keyword.Type */ +body:not([data-theme="light"]) .highlight .kc { color: #6ebf26; font-weight: bold } /* Keyword.Constant */ +body:not([data-theme="light"]) .highlight .kd { color: #6ebf26; font-weight: bold } /* Keyword.Declaration */ +body:not([data-theme="light"]) .highlight .kn { color: #6ebf26; font-weight: bold } /* Keyword.Namespace */ +body:not([data-theme="light"]) .highlight .kp { color: #6ebf26 } /* Keyword.Pseudo */ +body:not([data-theme="light"]) .highlight .kr { color: #6ebf26; font-weight: bold } /* Keyword.Reserved */ +body:not([data-theme="light"]) .highlight .kt { color: #6ebf26; font-weight: bold } /* Keyword.Type */ body:not([data-theme="light"]) .highlight .ld { color: #d0d0d0 } /* Literal.Date */ -body:not([data-theme="light"]) .highlight .m { color: #3677a9 } /* Literal.Number */ +body:not([data-theme="light"]) .highlight .m { color: #51b2fd } /* Literal.Number */ body:not([data-theme="light"]) .highlight .s { color: #ed9d13 } /* Literal.String */ body:not([data-theme="light"]) .highlight .na { color: #bbbbbb } /* Name.Attribute */ -body:not([data-theme="light"]) .highlight .nb { color: #24909d } /* Name.Builtin */ -body:not([data-theme="light"]) .highlight .nc { color: #447fcf; text-decoration: underline } /* Name.Class */ +body:not([data-theme="light"]) .highlight .nb { color: #2fbccd } /* Name.Builtin */ +body:not([data-theme="light"]) .highlight .nc { color: #71adff; text-decoration: underline } /* Name.Class */ body:not([data-theme="light"]) .highlight .no { color: #40ffff } /* Name.Constant */ body:not([data-theme="light"]) .highlight .nd { color: #ffa500 } /* Name.Decorator */ body:not([data-theme="light"]) .highlight .ni { color: #d0d0d0 } /* Name.Entity */ body:not([data-theme="light"]) .highlight .ne { color: #bbbbbb } /* Name.Exception */ -body:not([data-theme="light"]) .highlight .nf { color: #447fcf } /* Name.Function */ +body:not([data-theme="light"]) .highlight .nf { color: #71adff } /* Name.Function */ body:not([data-theme="light"]) .highlight .nl { color: #d0d0d0 } /* Name.Label */ -body:not([data-theme="light"]) .highlight .nn { color: #447fcf; text-decoration: underline } /* Name.Namespace */ +body:not([data-theme="light"]) .highlight .nn { color: #71adff; text-decoration: underline } /* Name.Namespace */ body:not([data-theme="light"]) .highlight .nx { color: #d0d0d0 } /* Name.Other */ body:not([data-theme="light"]) .highlight .py { color: #d0d0d0 } /* Name.Property */ -body:not([data-theme="light"]) .highlight .nt { color: #6ab825; font-weight: bold } /* Name.Tag */ +body:not([data-theme="light"]) .highlight .nt { color: #6ebf26; font-weight: bold } /* Name.Tag */ body:not([data-theme="light"]) .highlight .nv { color: #40ffff } /* Name.Variable */ -body:not([data-theme="light"]) .highlight .ow { color: #6ab825; font-weight: bold } /* Operator.Word */ +body:not([data-theme="light"]) .highlight .ow { color: #6ebf26; font-weight: bold } /* Operator.Word */ +body:not([data-theme="light"]) .highlight .pm { color: #d0d0d0 } /* Punctuation.Marker */ body:not([data-theme="light"]) .highlight .w { color: #666666 } /* Text.Whitespace */ -body:not([data-theme="light"]) .highlight .mb { color: #3677a9 } /* Literal.Number.Bin */ -body:not([data-theme="light"]) .highlight .mf { color: #3677a9 } /* Literal.Number.Float */ -body:not([data-theme="light"]) .highlight .mh { color: #3677a9 } /* Literal.Number.Hex */ -body:not([data-theme="light"]) .highlight .mi { color: #3677a9 } /* Literal.Number.Integer */ -body:not([data-theme="light"]) .highlight .mo { color: #3677a9 } /* Literal.Number.Oct */ +body:not([data-theme="light"]) .highlight .mb { color: #51b2fd } /* Literal.Number.Bin */ +body:not([data-theme="light"]) .highlight .mf { color: #51b2fd } /* Literal.Number.Float */ +body:not([data-theme="light"]) .highlight .mh { color: #51b2fd } /* Literal.Number.Hex */ +body:not([data-theme="light"]) .highlight .mi { color: #51b2fd } /* Literal.Number.Integer */ +body:not([data-theme="light"]) .highlight .mo { color: #51b2fd } /* Literal.Number.Oct */ body:not([data-theme="light"]) .highlight .sa { color: #ed9d13 } /* Literal.String.Affix */ body:not([data-theme="light"]) .highlight .sb { color: #ed9d13 } /* Literal.String.Backtick */ body:not([data-theme="light"]) .highlight .sc { color: #ed9d13 } /* Literal.String.Char */ @@ -240,11 +243,11 @@ body:not([data-theme="light"]) .highlight .sx { color: #ffa500 } /* Literal.Stri body:not([data-theme="light"]) .highlight .sr { color: #ed9d13 } /* Literal.String.Regex */ body:not([data-theme="light"]) .highlight .s1 { color: #ed9d13 } /* Literal.String.Single */ body:not([data-theme="light"]) .highlight .ss { color: #ed9d13 } /* Literal.String.Symbol */ -body:not([data-theme="light"]) .highlight .bp { color: #24909d } /* Name.Builtin.Pseudo */ -body:not([data-theme="light"]) .highlight .fm { color: #447fcf } /* Name.Function.Magic */ +body:not([data-theme="light"]) .highlight .bp { color: #2fbccd } /* Name.Builtin.Pseudo */ +body:not([data-theme="light"]) .highlight .fm { color: #71adff } /* Name.Function.Magic */ body:not([data-theme="light"]) .highlight .vc { color: #40ffff } /* Name.Variable.Class */ body:not([data-theme="light"]) .highlight .vg { color: #40ffff } /* Name.Variable.Global */ body:not([data-theme="light"]) .highlight .vi { color: #40ffff } /* Name.Variable.Instance */ body:not([data-theme="light"]) .highlight .vm { color: #40ffff } /* Name.Variable.Magic */ -body:not([data-theme="light"]) .highlight .il { color: #3677a9 } /* Literal.Number.Integer.Long */ +body:not([data-theme="light"]) .highlight .il { color: #51b2fd } /* Literal.Number.Integer.Long */ } \ No newline at end of file diff --git a/en/api/0_106_spring_manual_update.html b/en/api/0_106_spring_manual_update.html index a664bc831..c8eddc7b7 100644 --- a/en/api/0_106_spring_manual_update.html +++ b/en/api/0_106_spring_manual_update.html @@ -349,13 +349,13 @@
  • Added VRMSpringBone.ManualUpdate

  • You can call it like this:

    -
    VRMSpringBone spring;
    +
    VRMSpringBone spring;
     
     // setup
    -spring.m_updateType = VRMSpringBone.SpringBoneUpdateType.Manual;
    +spring.m_updateType = VRMSpringBone.SpringBoneUpdateType.Manual;
     
     // each frame
    -spring.ManualUpdate(time.deltaTime);
    +spring.ManualUpdate(time.deltaTime);
     
      diff --git a/en/api/0_44_runtime_import.html b/en/api/0_44_runtime_import.html index e52064809..23d4f9d74 100644 --- a/en/api/0_44_runtime_import.html +++ b/en/api/0_44_runtime_import.html @@ -344,63 +344,63 @@

      v0.44 RuntimeImport

      Version 0.44~ LoadAsyncの例

      -
      var bytes = File.ReadAllBytes(path);
      +
      var bytes = File.ReadAllBytes(path);
       // なんらかの方法でByte列を得る
       
      -var context = new VRMImporterContext();
      +var context = new VRMImporterContext();
       
      -context.ParseGlb(bytes);
      +context.ParseGlb(bytes);
       
       // metaが必要な場合
      -bool createThumbnail=true;
      -var meta = context.ReadMeta(createThumbnail);
      -var thumbnail = meta.Thumbnail;
      +bool createThumbnail=true;
      +var meta = context.ReadMeta(createThumbnail);
      +var thumbnail = meta.Thumbnail;
       
       // modelを構築
      -context.LoadAsync(_ =>
      -{
      -    context.ShowMeshes();
      -    var go = context.Root;
      +context.LoadAsync(_ =>
      +{
      +    context.ShowMeshes();
      +    var go = context.Root;
           // load完了
      -},
      -Debug.LogError);
      +},
      +Debug.LogError);
       

      LoadAsyncTaskを使う例

      -
      #if (NET_4_6 && UNITY_2017_1_OR_NEWER)
      -async static Task<GameObject> LoadAsync(Byte[] bytes)
      -{
      -    var context = new VRMImporterContext();
      +
      #if (NET_4_6 && UNITY_2017_1_OR_NEWER)
      +async static Task<GameObject> LoadAsync(Byte[] bytes)
      +{
      +    var context = new VRMImporterContext();
       
           // GLB形式でJSONを取得しParseします
      -    context.ParseGlb(bytes);
      +    context.ParseGlb(bytes);
       
      -    try
      -    {
      +    try
      +    {
               // ParseしたJSONをシーンオブジェクトに変換していく
      -        await context.LoadAsyncTask();
      +        await context.LoadAsyncTask();
       
               // バウンディングボックスとカメラの位置関係で見切れるのを防止する
               // SkinnedMeshRenderer.updateWhenOffscreen = true
      -        context.EnableUpdateWhenOffscreen();
      +        context.EnableUpdateWhenOffscreen();
       
               // T-Poseのモデルを表示したくない場合、ShowMeshesする前に準備する
               // ロード後に表示する
      -        context.ShowMeshes();
      +        context.ShowMeshes();
       
      -        return context.Root;
      -    }
      -    catch(Exception ex)
      -    {
      -        Debug.LogError(ex);
      +        return context.Root;
      +    }
      +    catch(Exception ex)
      +    {
      +        Debug.LogError(ex);
               // 関連するリソースを破棄する
      -        context.Destroy(true);
      -        throw;
      -    }
      -}
      -#endif
      +        context.Destroy(true);
      +        throw;
      +    }
      +}
      +#endif
       
      @@ -415,89 +415,89 @@

      ファイルパスからVRMを開く

      -
      var path="sample.vrm";
      -var go=VRM.VRMImporter.LoadFromPath(path);
      -Debug.LogFormat("loaded {0}", go.name);
      +
      var path="sample.vrm";
      +var go=VRM.VRMImporter.LoadFromPath(path);
      +Debug.LogFormat("loaded {0}", go.name);
       

      ファイルパスから非同期にVRMを開く

      -
      var path="sample.vrm";
      -VRMImporter.LoadVrmAsync(path, go => {
      -    Debug.LogFormat("loaded {0}", go.name);
      -});
      +
      var path="sample.vrm";
      +VRMImporter.LoadVrmAsync(path, go => {
      +    Debug.LogFormat("loaded {0}", go.name);
      +});
       

      バイト列からVRM開く

      -
      var path="sample.vrm";
      -var bytes = File.ReadAllBytes(path);
      -var go=VRMImporter.LoadFromBytes(bytes);
      +
      var path="sample.vrm";
      +var bytes = File.ReadAllBytes(path);
      +var go=VRMImporter.LoadFromBytes(bytes);
       

      バイト列から非同期にVRMを開く

      -
      VRMImporter.LoadVrmAsync(bytes, go => {
      -    Debug.LogFormat("loaded {0}", go.name);
      -});
      +
      VRMImporter.LoadVrmAsync(bytes, go => {
      +    Debug.LogFormat("loaded {0}", go.name);
      +});
       

      VRMから情報を取り出す

      -
      #if UNITY_STANDALONE_WIN
      -            var path = FileDialogForWindows.FileDialog("open VRM", ".vrm");
      -#else
      -            var path = Application.dataPath + "/default.vrm";
      -#endif
      -            if (string.IsNullOrEmpty(path))
      -            {
      -                return;
      -            }
      +
      #if UNITY_STANDALONE_WIN
      +            var path = FileDialogForWindows.FileDialog("open VRM", ".vrm");
      +#else
      +            var path = Application.dataPath + "/default.vrm";
      +#endif
      +            if (string.IsNullOrEmpty(path))
      +            {
      +                return;
      +            }
       
                   // Byte列を得る
      -            var bytes = File.ReadAllBytes(path);
      +            var bytes = File.ReadAllBytes(path);
       
      -            var context = new VRMImporterContext();
      +            var context = new VRMImporterContext();
       
                   // GLB形式をParseしてチャンクからJSONを取得しParseします
      -            context.ParseGlb(bytes);
      +            context.ParseGlb(bytes);
       
                   // metaを取得
      -            var meta = context.ReadMeta();
      -            Debug.LogFormat("meta: title:{0}", meta.Title);
      +            var meta = context.ReadMeta();
      +            Debug.LogFormat("meta: title:{0}", meta.Title);
       
                   // もしくはこちらでパースされたGLTF全体にアクセスできます
      -            var vrm = context.GLTF;
      +            var vrm = context.GLTF;
       
                   // ParseしたJSONをもとにシーンを構築します
      -            if (m_loadAsync)
      -            {
      +            if (m_loadAsync)
      +            {
                       // 非同期に実行する
      -                var now = Time.time;
      -                VRMImporter.LoadVrmAsync(context, go=> {
      -                    var delta = Time.time - now;
      -                    Debug.LogFormat("LoadVrmAsync {0:0.0} seconds", delta);
      -                    OnLoaded(go);
      -                });
      -            }
      -            else
      -            {
      +                var now = Time.time;
      +                VRMImporter.LoadVrmAsync(context, go=> {
      +                    var delta = Time.time - now;
      +                    Debug.LogFormat("LoadVrmAsync {0:0.0} seconds", delta);
      +                    OnLoaded(go);
      +                });
      +            }
      +            else
      +            {
                       // 同期的に実行する
      -                VRMImporter.LoadFromBytes(context);
      -                OnLoaded(context.Root);
      -            }
      +                VRMImporter.LoadFromBytes(context);
      +                OnLoaded(context.Root);
      +            }
       

      Thumbnailを取得する(v0.37から)

      ReadMetaに引数を渡すことでThumbnailテクスチャを作成できます。

      -
          var meta = context.ReadMeta(true); // Thumbnailテクスチャを作成する
      -    Texture2D thumbnail=meta.Thumbnail;
      +
          var meta = context.ReadMeta(true); // Thumbnailテクスチャを作成する
      +    Texture2D thumbnail=meta.Thumbnail;
       
      diff --git a/en/api/0_58_blendshape.html b/en/api/0_58_blendshape.html index 69026dd5c..db9f461a3 100644 --- a/en/api/0_58_blendshape.html +++ b/en/api/0_58_blendshape.html @@ -394,14 +394,14 @@

      スクリプトから BlendShape weight を適用する

      SetValues 関数のみを使用します。 そのフレームで必要な表情の weight 値をすべて集めてから SetValues を 1 回だけ呼んで設定します。

      -
      var proxy = GetComponent<VRMBlendShapeProxy>();
      +
      var proxy = GetComponent<VRMBlendShapeProxy>();
       
      -proxy.SetValues(new Dictionary<BlendShapeKey, float>
      -{
      +proxy.SetValues(new Dictionary<BlendShapeKey, float>
      +{
           {BlendShapeKey.CreateFromPreset(BlendShapePreset.A), 1f}, // [0, 1] の範囲で Weight を指定
           {BlendShapeKey.CreateFromPreset(BlendShapePreset.Joy), 1f}, // システム定義の表情は enum で指定
           {BlendShapeKey.CreateUnknown("USER_DEFINED_FACIAL"), 1f}, // ユーザ定義の表情は string で指定
      -});
      +});
       
      @@ -421,24 +421,24 @@

    で定義されているとします。 このとき両目を閉じたいモチベーションから、両方を有効にする意図で下記のように実行します。

    -
    proxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_L), 1.0f);
    -proxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_R), 1.0f);
    +
    proxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_L), 1.0f);
    +proxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_R), 1.0f);
     

    すると、左目だけが開いてしまいます。 これは後から ImmediateSetValue した Blink_RBlink_L と競合して weight を上書きしてしまうからです。 したがって VRM の表情制御においては下記の 2 通りのどちらかの方法で書くことが求められます。 これらの方法はこの競合の問題を解決して表情を設定することができます。

    -
    proxy.SetValues(new Dictionary<BlendShapeKey, float>
    -{
    -    {BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_L), 1.0f},
    -    {BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_R), 1.0f},
    -});
    +
    proxy.SetValues(new Dictionary<BlendShapeKey, float>
    +{
    +    {BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_L), 1.0f},
    +    {BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_R), 1.0f},
    +});
     

    または

    proxy.AccumulateValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_L), 1.0f); // すぐに適用せずにたくわえる
    -proxy.AccumulateValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_R), 1.0f);
    +proxy.AccumulateValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_R), 1.0f);
     proxy.Apply(); // 蓄積した値をまとめて適用する
     
    @@ -462,19 +462,19 @@ BlendShape同士が競合することがわかりました。

    ImmediatelySetValue

    簡単なテストプログラムでの利用を想定しています。

    例:

    -
    var proxy = GetComponent<VRMBlendShapeProxy>();
    +
    var proxy = GetComponent<VRMBlendShapeProxy>();
     
    -proxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.A), 1.0f);
    +proxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.A), 1.0f);
     

    AccumulateValue + Apply

    例:

    -
    var proxy = GetComponent<VRMBlendShapeProxy>();
    +
    var proxy = GetComponent<VRMBlendShapeProxy>();
     
     proxy.AccumulateValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_L), 1.0f); // すぐに適用せずにたくわえる
    -proxy.AccumulateValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_R), 1.0f);
    +proxy.AccumulateValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_R), 1.0f);
     proxy.Apply(); // 蓄積した値をまとめて適用する
     
    @@ -484,13 +484,13 @@ BlendShape同士が競合することがわかりました。

    SetValues

    BlendShape合成器が必要に応じ呼び出すことを想定しています。

    例:

    -
    var proxy = GetComponent<VRMBlendShapeProxy>();
    +
    var proxy = GetComponent<VRMBlendShapeProxy>();
     
    -proxy.SetValues(new Dictionary<BlendShapeKey, float>
    -{
    -    {BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_L), 1.0f},
    -    {BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_R), 1.0f},
    -});
    +proxy.SetValues(new Dictionary<BlendShapeKey, float>
    +{
    +    {BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_L), 1.0f},
    +    {BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_R), 1.0f},
    +});
     
    diff --git a/en/api/0_68_runtime_import.html b/en/api/0_68_runtime_import.html index d144323fe..e64945444 100644 --- a/en/api/0_68_runtime_import.html +++ b/en/api/0_68_runtime_import.html @@ -373,146 +373,146 @@

    サンプルコード(同期的ロード)

    -
    using UniGLTF;
    -using UnityEngine;
    -using VRM;
    +
    using UniGLTF;
    +using UnityEngine;
    +using VRM;
     
    -namespace YourNameSpace
    -{
    -    public sealed class LoadVrmSample : MonoBehaviour
    -    {
    -        [SerializeField] private string _vrmFilePath;
    -        private GameObject _vrmGameObject;
    +namespace YourNameSpace
    +{
    +    public sealed class LoadVrmSample : MonoBehaviour
    +    {
    +        [SerializeField] private string _vrmFilePath;
    +        private GameObject _vrmGameObject;
     
    -        private void Start()
    -        {
    -            _vrmGameObject = LoadVrm(_vrmFilePath);
    -        }
    +        private void Start()
    +        {
    +            _vrmGameObject = LoadVrm(_vrmFilePath);
    +        }
     
    -        private void OnDestroy()
    -        {
    -            DestroyVrm(_vrmGameObject);
    -        }
    +        private void OnDestroy()
    +        {
    +            DestroyVrm(_vrmGameObject);
    +        }
     
    -        private GameObject LoadVrm(string vrmFilePath)
    -        {
    +        private GameObject LoadVrm(string vrmFilePath)
    +        {
                 // 1. GltfParser を呼び出します。
                 //    GltfParser はファイルから JSON 情報とバイナリデータを読み出します。
    -            var parser = new GltfParser();
    -            parser.ParsePath(vrmFilePath);
    +            var parser = new GltfParser();
    +            parser.ParsePath(vrmFilePath);
     
                 // 2. GltfParser のインスタンスを引数にして VRMImporterContext を作成します。
                 //    VRMImporterContext は VRM のロードを実際に行うクラスです。
    -            using (var context = new VRMImporterContext(parser))
    -            {
    +            using (var context = new VRMImporterContext(parser))
    +            {
                     // 3. Load 関数を呼び出し、VRM の GameObject を生成します。
    -                context.Load();
    +                context.Load();
     
                     // 4. (任意) SkinnedMeshRenderer の UpdateWhenOffscreen を有効にできる便利関数です。
                     //    https://docs.unity3d.com/2019.4/Documentation/ScriptReference/SkinnedMeshRenderer-updateWhenOffscreen.html
    -                context.EnableUpdateWhenOffscreen();
    +                context.EnableUpdateWhenOffscreen();
     
                     // 5. VRM モデルを表示します。
    -                context.ShowMeshes();
    +                context.ShowMeshes();
     
                     // 6. VRM の GameObject が実際に使用している UnityEngine.Object リソースの寿命を VRM の GameObject に紐付けます。
                     //    つまり VRM の GameObject の破棄時に、実際に使用しているリソース (Texture, Material, Mesh, etc) をまとめて破棄することができます。
    -                context.DisposeOnGameObjectDestroyed();
    +                context.DisposeOnGameObjectDestroyed();
     
                     // 7. Root の GameObject を return します。
                     //    Root の GameObject とは VRMMeta コンポーネントが付与されている GameObject のことです。
    -                return context.Root;
    -            }
    +                return context.Root;
    +            }
                 // 8. using スコープを抜けて context が破棄されると、 VRMImporterContext が保持する UnityEngine.Object リソースが破棄されます。
                 //    このとき破棄されるリソースは、 glTF ファイルには含まれているが VRM の GameObject には割り当てられていないテクスチャなどです。
                 //    手順 6. で VRM の GameObject に紐付けたリソースは、ここでは破棄されません。
    -        }
    +        }
     
    -        private void DestroyVrm(GameObject vrmGameObject)
    -        {
    +        private void DestroyVrm(GameObject vrmGameObject)
    +        {
                 // 9. 生成された VRM の GameObject を破棄します。
                 //    GameObject を破棄すれば、紐づくリソース (Texture, Material, Mesh, etc) も破棄されます。
    -            UnityEngine.Object.Destroy(vrmGameObject);
    -        }
    -    }
    -}
    +            UnityEngine.Object.Destroy(vrmGameObject);
    +        }
    +    }
    +}
     

    サンプルコード(非同期ロード)

    -
    using System.IO;
    -using System.Threading.Tasks;
    -using UniGLTF;
    -using UnityEngine;
    -using VRM;
    +
    using System.IO;
    +using System.Threading.Tasks;
    +using UniGLTF;
    +using UnityEngine;
    +using VRM;
     
    -namespace YourNameSpace
    -{
    -    public sealed class LoadVrmAsyncSample : MonoBehaviour
    -    {
    -        [SerializeField] private string _vrmFilePath;
    -        private GameObject _vrmGameObject;
    +namespace YourNameSpace
    +{
    +    public sealed class LoadVrmAsyncSample : MonoBehaviour
    +    {
    +        [SerializeField] private string _vrmFilePath;
    +        private GameObject _vrmGameObject;
     
    -        private async void Start()
    -        {
    +        private async void Start()
    +        {
                 // 簡便のため、このサンプルではキャンセル処理などは考慮しません。
    -            _vrmGameObject = await LoadVrmAsync(_vrmFilePath);
    -        }
    +            _vrmGameObject = await LoadVrmAsync(_vrmFilePath);
    +        }
     
    -        private void OnDestroy()
    -        {
    -            DestroyVrm(_vrmGameObject);
    -        }
    +        private void OnDestroy()
    +        {
    +            DestroyVrm(_vrmGameObject);
    +        }
     
    -        private async Task<GameObject> LoadVrmAsync(string vrmFilePath)
    -        {
    +        private async Task<GameObject> LoadVrmAsync(string vrmFilePath)
    +        {
                 // 1. GltfParser を呼び出します。
                 //    GltfParser はファイルから JSON 情報とバイナリデータを読み出します。
                 //    GltfParser は Unity のメインスレッド以外で実行できます。
    -            var parser = new GltfParser();
    -            await Task.Run(() =>
    -            {
    -                var file = File.ReadAllBytes(vrmFilePath);
    -                parser.ParseGlb(file);
    -            });
    +            var parser = new GltfParser();
    +            await Task.Run(() =>
    +            {
    +                var file = File.ReadAllBytes(vrmFilePath);
    +                parser.ParseGlb(file);
    +            });
     
                 // 2. GltfParser のインスタンスを引数にして VRMImporterContext を作成します。
                 //    VRMImporterContext は VRM のロードを実際に行うクラスです。
    -            using (var context = new VRMImporterContext(parser))
    -            {
    +            using (var context = new VRMImporterContext(parser))
    +            {
                     // 3. Load 関数を呼び出し、VRM の GameObject を生成します。
                     //    Load 処理は数フレームの時間を要します。
    -                await context.LoadAsync();
    +                await context.LoadAsync();
     
                     // 4. (任意) SkinnedMeshRenderer の UpdateWhenOffscreen を有効にできる便利関数です。
                     //    https://docs.unity3d.com/2019.4/Documentation/ScriptReference/SkinnedMeshRenderer-updateWhenOffscreen.html
    -                context.EnableUpdateWhenOffscreen();
    +                context.EnableUpdateWhenOffscreen();
     
                     // 5. VRM モデルを表示します。
    -                context.ShowMeshes();
    +                context.ShowMeshes();
     
                     // 6. VRM の GameObject が実際に使用している UnityEngine.Object リソースの寿命を VRM の GameObject に紐付けます。
                     //    つまり VRM の GameObject の破棄時に、実際に使用しているリソース (Texture, Material, Mesh, etc) をまとめて破棄することができます。
    -                context.DisposeOnGameObjectDestroyed();
    +                context.DisposeOnGameObjectDestroyed();
     
                     // 7. Root の GameObject を return します。
                     //    Root の GameObject とは VRMMeta コンポーネントが付与されている GameObject のことです。
    -                return context.Root;
    -            }
    +                return context.Root;
    +            }
                 // 8. using スコープを抜けて context が破棄されると、 VRMImporterContext が保持する UnityEngine.Object リソースが破棄されます。
                 //    このとき破棄されるリソースは、 glTF ファイルには含まれているが VRM の GameObject には割り当てられていないテクスチャなどです。
                 //    手順 6. で VRM の GameObject に紐付けたリソースは、ここでは破棄されません。
    -        }
    +        }
     
    -        private void DestroyVrm(GameObject vrmGameObject)
    -        {
    +        private void DestroyVrm(GameObject vrmGameObject)
    +        {
                 // 9. 生成された VRM の GameObject を破棄します。
                 // GameObject を破棄すれば、紐づくリソース (Texture, Material, Mesh, etc) も破棄されます。
    -            UnityEngine.Object.Destroy(vrmGameObject);
    -        }
    -    }
    -}
    +            UnityEngine.Object.Destroy(vrmGameObject);
    +        }
    +    }
    +}
     
    diff --git a/en/api/0_76_texture_deserializer.html b/en/api/0_76_texture_deserializer.html index 262c2941f..33d66882b 100644 --- a/en/api/0_76_texture_deserializer.html +++ b/en/api/0_76_texture_deserializer.html @@ -370,30 +370,30 @@

    Replacement method

    new UniGLTF.ImporterContext Arguments can be specified.

    -
            public ImporterContext(
    -            GltfData data,
    -            IReadOnlyDictionary<SubAssetKey, UnityEngine.Object> externalObjectMap = null,
    -            ITextureDeserializer textureDeserializer = null, // 👈
    -            IMaterialDescriptorGenerator materialGenerator = null)
    +
            public ImporterContext(
    +            GltfData data,
    +            IReadOnlyDictionary<SubAssetKey, UnityEngine.Object> externalObjectMap = null,
    +            ITextureDeserializer textureDeserializer = null, // 👈
    +            IMaterialDescriptorGenerator materialGenerator = null)
     

    new VRM.VRMImporterContext Arguments can be specified.

    -
            public VRMImporterContext(
    -            VRMData data,
    -            IReadOnlyDictionary<SubAssetKey, Object> externalObjectMap = null,
    -            ITextureDeserializer textureDeserializer = null, // 👈
    -            IMaterialDescriptorGenerator materialGenerator = null,
    -            bool loadAnimation = false)
    +
            public VRMImporterContext(
    +            VRMData data,
    +            IReadOnlyDictionary<SubAssetKey, Object> externalObjectMap = null,
    +            ITextureDeserializer textureDeserializer = null, // 👈
    +            IMaterialDescriptorGenerator materialGenerator = null,
    +            bool loadAnimation = false)
     

    new UniVRM10.Vrm10Importer Arguments can be specified.

    -
            public Vrm10Importer(
    -            Vrm10Data vrm,
    -            IReadOnlyDictionary<SubAssetKey, UnityEngine.Object> externalObjectMap = null,
    -            ITextureDeserializer textureDeserializer = null, // 👈
    -            IMaterialDescriptorGenerator materialGenerator = null,
    -            bool useControlRig = false
    -            )
    +
            public Vrm10Importer(
    +            Vrm10Data vrm,
    +            IReadOnlyDictionary<SubAssetKey, UnityEngine.Object> externalObjectMap = null,
    +            ITextureDeserializer textureDeserializer = null, // 👈
    +            IMaterialDescriptorGenerator materialGenerator = null,
    +            bool useControlRig = false
    +            )
     
    diff --git a/en/api/0_77_runtime_import.html b/en/api/0_77_runtime_import.html index 409c126f3..848fd7654 100644 --- a/en/api/0_77_runtime_import.html +++ b/en/api/0_77_runtime_import.html @@ -355,40 +355,40 @@

    を引き継ぎます。 Load の呼び出し後の任意のタイミングで ImporterContext.Dispose で Importer を破棄してください。 任意のタイミングで RuntimeGltfInstance を Destory することで紐づくリソース (Texture, Material, Mesh, etc) も破棄されます。

    -
    using UniGLTF;
    -using UnityEngine;
    +
    using UniGLTF;
    +using UnityEngine;
     
     
    -namespace VRM.Samples
    -{
    -    public sealed class LoadVrmSample : MonoBehaviour
    -    {
    -        [SerializeField] private string _vrmFilePath;
    -        private GameObject _vrmGameObject;
    +namespace VRM.Samples
    +{
    +    public sealed class LoadVrmSample : MonoBehaviour
    +    {
    +        [SerializeField] private string _vrmFilePath;
    +        private GameObject _vrmGameObject;
     
    -        private void Start()
    -        {
    -            _vrmGameObject = LoadVrm(_vrmFilePath);
    -        }
    +        private void Start()
    +        {
    +            _vrmGameObject = LoadVrm(_vrmFilePath);
    +        }
     
    -        private void OnDestroy()
    -        {
    -            DestroyVrm(_vrmGameObject);
    -        }
    +        private void OnDestroy()
    +        {
    +            DestroyVrm(_vrmGameObject);
    +        }
     
    -        private GameObject LoadVrm(string vrmFilePath)
    -        {
    +        private GameObject LoadVrm(string vrmFilePath)
    +        {
                 // 1. GltfParser を呼び出します。
                 //    GltfParser はファイルから JSON 情報とバイナリデータを読み出します。
    -            var parser = new GltfParser();
    -            parser.ParsePath(vrmFilePath);
    +            var parser = new GltfParser();
    +            parser.ParsePath(vrmFilePath);
     
                 // 2. GltfParser のインスタンスを引数にして VRMImporterContext を作成します。
                 //    VRMImporterContext は VRM のロードを実際に行うクラスです。
    -            using (var context = new VRMImporterContext(parser))
    -            {
    +            using (var context = new VRMImporterContext(parser))
    +            {
                     // 3. Load 関数を呼び出し、VRM の GameObject を生成します。
    -                RuntimeGltfInstance instance = context.Load(); // <- `v0.77` でここが変わります。
    +                RuntimeGltfInstance instance = context.Load(); // <- `v0.77` でここが変わります。
                     
                     // 非同期版 async 関数の中で下記のようにしてください
                     // RuntimeGltfInstance instance = await context.LoadAsync();
    @@ -403,20 +403,20 @@ Load の呼び出し後の任意のタイミングで ImporterContext.Dispose 
                     // 6. Root の GameObject を return します。
                     //    Root の GameObject とは VRMMeta コンポーネントが付与されている GameObject のことです。
                     return instance.Root; // <- ImporterContext から RuntimeGltfInstance に移動しました。
    -            }
    +            }
                 // 7. using スコープを抜けて context が破棄されると、 VRMImporterContext が保持する UnityEngine.Object リソースが破棄されます。
                 //    このとき破棄されるリソースは、 glTF ファイルには含まれているが VRM の GameObject には割り当てられていないテクスチャなどです。
                 //    手順 6. で VRM の GameObject に紐付けたリソースは、ここでは破棄されません。
    -        }
    +        }
     
    -        private void DestroyVrm(GameObject vrmGameObject)
    -        {
    +        private void DestroyVrm(GameObject vrmGameObject)
    +        {
                 // 8. 生成された VRM の GameObject を破棄します。
                 //    GameObject を破棄すれば、紐づくリソース (Texture, Material, Mesh, etc) も破棄されます。
    -            UnityEngine.Object.Destroy(vrmGameObject);
    -        }
    -    }
    -}
    +            UnityEngine.Object.Destroy(vrmGameObject);
    +        }
    +    }
    +}
     
    diff --git a/en/api/0_79_runtime_import.html b/en/api/0_79_runtime_import.html index be90ee7ca..79f3a090e 100644 --- a/en/api/0_79_runtime_import.html +++ b/en/api/0_79_runtime_import.html @@ -343,11 +343,11 @@

    v0.79 RuntimeImport GltfData

    GltfParserGltfData の分割

    -
    var parser = new GltfParser();
    -parser.ParsePath(path);
    +
    var parser = new GltfParser();
    +parser.ParsePath(path);
     
    -
    GltfData data = new GlbFileParser(path).Parse();
    +
    GltfData data = new GlbFileParser(path).Parse();
     
    diff --git a/en/api/0_82_glb_import.html b/en/api/0_82_glb_import.html index d40cc10d2..1922816cc 100644 --- a/en/api/0_82_glb_import.html +++ b/en/api/0_82_glb_import.html @@ -355,10 +355,10 @@
    • vrm also uses this function.

    -
    GltfData Load(string path)
    -{
    -    return new GlbFileParser(path).Parse();
    -}
    +
    GltfData Load(string path)
    +{
    +    return new GlbFileParser(path).Parse();
    +}
     
    @@ -367,40 +367,40 @@
    • vrm also uses this function.

    -
    GltfData Load(byte[] bytes)
    -{
    -    return new GlbBinaryParser(bytes, "LOAD_NAME").parse();
    -}
    +
    GltfData Load(byte[] bytes)
    +{
    +    return new GlbBinaryParser(bytes, "LOAD_NAME").parse();
    +}
     

    Parse from gltf file path

    -
    GltfData Load(string path)
    -{
    -    return new GltfFileWithResourceFilesParser(path).Parse();
    -}
    +
    GltfData Load(string path)
    +{
    +    return new GltfFileWithResourceFilesParser(path).Parse();
    +}
     

    Parse from zip archive

    Can parse zip archives of gltf and related files (experimental).

    -
    GltfData Load(string path)
    -{
    -    return new ZipArchivedGltfFileParser(path).Parse();
    -}
    +
    GltfData Load(string path)
    +{
    +    return new ZipArchivedGltfFileParser(path).Parse();
    +}
     

    Parse by file path extension

    Please refer to the sample SimpleViewer.

    -
    GltfData Load(string path)
    -{
    +
    GltfData Load(string path)
    +{
         // ファイル拡張子で自動判定します
    -    return new AutoGltfFileParser(path).Parse();
    -}
    +    return new AutoGltfFileParser(path).Parse();
    +}
     
    @@ -409,31 +409,31 @@

    2. ロードする

    sync

    -
    RuntimeGltfInstance Load(GltfData data)
    -{
    +
    RuntimeGltfInstance Load(GltfData data)
    +{
         // ImporterContext は使用後に Dispose を呼び出してください。
         // using で自動的に呼び出すことができます。
    -    using(var loader = new UniGLTF.ImporterContext(data)
    -    {
    -        var instance = loader.Load();
    -        return instance;
    -    }
    -}
    +    using(var loader = new UniGLTF.ImporterContext(data)
    +    {
    +        var instance = loader.Load();
    +        return instance;
    +    }
    +}
     

    async

    -
    async RuntimeGltfInstance Load(GltfData data)
    -{
    +
    async RuntimeGltfInstance Load(GltfData data)
    +{
         // ImporterContext は使用後に Dispose を呼び出してください。
         // using で自動的に呼び出すことができます。
    -    using(var loader = new UniGLTF.ImporterContext(data)
    -    {
    -        var instance = await loader.LoadAsync();
    -        return instance;
    -    }
    -}
    +    using(var loader = new UniGLTF.ImporterContext(data)
    +    {
    +        var instance = await loader.LoadAsync();
    +        return instance;
    +    }
    +}
     
    @@ -445,13 +445,13 @@

    3. インスタンスを使用する

    // SkinnedMeshRenderer に対する指示
    -instance.EnableUpdateWhenOffscreen();
    +instance.EnableUpdateWhenOffscreen();
     // 準備ができたら表示する(デフォルトでは非表示)
    -instance.ShowMeshes();
    +instance.ShowMeshes();
     

    Discard after use as follows. Associated Assets (Textures, Materials, Meshes, etc.) are also destroyed.

    -
    GameObject.Destroy(instance);
    +
    GameObject.Destroy(instance);
     
    diff --git a/en/api/0_82_runtime_import.html b/en/api/0_82_runtime_import.html index 76679c7ca..71818a76a 100644 --- a/en/api/0_82_runtime_import.html +++ b/en/api/0_82_runtime_import.html @@ -352,46 +352,46 @@

    サンプルの Assets\VRM\Samples\SimpleViewer\ViewerUI.cs も参照してください。

    1. GltfData を得る

    -
    GltfData Load(string path)
    -{
    -    return new GlbFileParser(path).Parse();
    -}
    +
    GltfData Load(string path)
    +{
    +    return new GlbFileParser(path).Parse();
    +}
     

    GLB import も参照してください。

    2. VRMData を得る

    -
    VRMData vrm = new VRMData(data);
    +
    VRMData vrm = new VRMData(data);
     

    3. Load する

    -
    async RuntimeGltfInstance Load(VRMData vrm)
    -{
    +
    async RuntimeGltfInstance Load(VRMData vrm)
    +{
         // 使用後に Dispose で VRMImporterContext を破棄してください。
    -    using(var loader = new VRMImporterContext(vrm))
    -    {
    -        var instance = await loader.LoadAsync();
    -        return instance;
    -    }
    -}
    +    using(var loader = new VRMImporterContext(vrm))
    +    {
    +        var instance = await loader.LoadAsync();
    +        return instance;
    +    }
    +}
     

    URP 向けに materialGenerator を指定する(実験)

    materialGenerator 引き数(省略可能)を指定することで URP マテリアルを生成するようにカスタムできます。 指定しない場合は built-in 向けのデフォルトが使用されます。

    -
    async RuntimeGltfInstance Load(VRMData vrm)
    -{
    -    var materialGenerator = new VRMUrpMaterialDescriptorGenerator(vrm.VrmExtension);
    -    using(var loader = new VRM.VRMImporterContext(vrm, materialGenerator: materialGenerator))
    -    {
    -        var instance = await loader.LoadAsync();
    -        return instance;
    -    }
    -}
    +
    async RuntimeGltfInstance Load(VRMData vrm)
    +{
    +    var materialGenerator = new VRMUrpMaterialDescriptorGenerator(vrm.VrmExtension);
    +    using(var loader = new VRM.VRMImporterContext(vrm, materialGenerator: materialGenerator))
    +    {
    +        var instance = await loader.LoadAsync();
    +        return instance;
    +    }
    +}
     
      @@ -402,16 +402,16 @@

      4. Instance

      // SkinnedMeshRenderer に対する指示
      -instance.EnableUpdateWhenOffscreen();
      +instance.EnableUpdateWhenOffscreen();
       // 準備ができたら表示する(デフォルトでは非表示)
      -instance.ShowMeshes();
      +instance.ShowMeshes();
       

      使用後に以下のように破棄してください。関連する Asset(Texture, Material, Meshなど)も破棄されます。

      // GameObject.Destroy(instance);
       
       // RuntimeGltfInstance ではなくて、その GameObject を Destroy します。
      -GameObject.Destroy(instance.gameObject);
      +GameObject.Destroy(instance.gameObject);
       
      diff --git a/en/api/0_87_runtime_import.html b/en/api/0_87_runtime_import.html index b7fccee6f..16ab991de 100644 --- a/en/api/0_87_runtime_import.html +++ b/en/api/0_87_runtime_import.html @@ -344,35 +344,35 @@

      v0.87 RuntimeImport 非同期ロード

      awaitCaller 引き数

      -
      public virtual async Task<RuntimeGltfInstance> LoadAsync(IAwaitCaller awaitCaller = null, ...)
      +
      public virtual async Task<RuntimeGltfInstance> LoadAsync(IAwaitCaller awaitCaller = null, ...)
       

      awaitCaller によりロード時の挙動をカスタマイズできます。

      -
       1using System;
      - 2using System.Threading.Tasks;
      +
       1using System;
      + 2using System.Threading.Tasks;
        3
      - 4namespace VRMShaders
      - 5{
      + 4namespace VRMShaders
      + 5{
        6    /// <summary>
        7    /// ImporterContext の 非同期実行 LoadAsync を補助する。
        8    /// この関数を経由して await すること。
        9    /// そうしないと、同期実行 Load 時にデッドロックに陥るかもしれない。
       10    /// (SynchronizationContext に Post された 継続が再開されない)
       11    /// </summary>
      -12    public interface IAwaitCaller
      -13    {
      +12    public interface IAwaitCaller
      +13    {
       14        /// <summary>
       15        /// フレームレートを維持するために1フレーム待つ
       16        /// </summary>
       17        /// <returns></returns>
      -18        Task NextFrame();
      +18        Task NextFrame();
       19
       20        /// <summary>
       21        /// 非同期に実行して、終了を待つ
       22        /// </summary>
       23        /// <param name="action"></param>
       24        /// <returns></returns>
      -25        Task Run(Action action);
      +25        Task Run(Action action);
       26
       27        /// <summary>
       28        /// 非同期に実行して、終了を待つ
      @@ -380,15 +380,15 @@
       30        /// <param name="action"></param>
       31        /// <typeparam name="T"></typeparam>
       32        /// <returns></returns>
      -33        Task<T> Run<T>(Func<T> action);
      +33        Task<T> Run<T>(Func<T> action);
       34
       35        /// <summary>
       36        /// 指定した時間が経過している場合のみ、NextFrame() を使って1フレーム待つ
       37        /// </summary>
       38        /// <returns>タイムアウト時はNextFrame()を呼び出す。そうではない場合、Task.CompletedTaskを返す</returns>
      -39        Task NextFrameIfTimedOut();
      -40    }
      -41}
      +39        Task NextFrameIfTimedOut();
      +40    }
      +41}
       
        @@ -403,35 +403,35 @@
        • Play(Editor Play, build), Editor(not play), UnitTest でデッドロックしないための実装です。

        -
         1using System;
        - 2using System.Threading.Tasks;
        +
         1using System;
        + 2using System.Threading.Tasks;
          3
        - 4namespace VRMShaders
        - 5{
        + 4namespace VRMShaders
        + 5{
          6    /// <summary>
          7    /// 同期実行
          8    /// </summary>
        - 9    public sealed class ImmediateCaller : IAwaitCaller
        -10    {
        -11        public Task NextFrame()
        -12        {
        -13            return Task.FromResult<object>(null);
        -14        }
        + 9    public sealed class ImmediateCaller : IAwaitCaller
        +10    {
        +11        public Task NextFrame()
        +12        {
        +13            return Task.FromResult<object>(null);
        +14        }
         15
        -16        public Task Run(Action action)
        -17        {
        -18            action();
        -19            return Task.FromResult<object>(null);
        -20        }
        +16        public Task Run(Action action)
        +17        {
        +18            action();
        +19            return Task.FromResult<object>(null);
        +20        }
         21
        -22        public Task<T> Run<T>(Func<T> action)
        -23        {
        -24            return Task.FromResult(action());
        -25        }
        +22        public Task<T> Run<T>(Func<T> action)
        +23        {
        +24            return Task.FromResult(action());
        +25        }
         26
        -27        public Task NextFrameIfTimedOut() => NextFrame();
        -28    }
        -29}
        +27        public Task NextFrameIfTimedOut() => NextFrame();
        +28    }
        +29}
         
      @@ -441,67 +441,67 @@
    • Play(Editor Play, build) 時に非同期実行する実装です

    • VRM10_Samples/VRM10Viewer に使用例があります。

    -
     1using System;
    - 2using System.Threading.Tasks;
    +
     1using System;
    + 2using System.Threading.Tasks;
      3
    - 4namespace VRMShaders
    - 5{
    + 4namespace VRMShaders
    + 5{
      6    /// <summary>
      7    /// Runtime (Build 後と、Editor Playing) での非同期ロードを実現する AwaitCaller.
      8    /// NOTE: 簡便に実装されたものなので、最適化の余地はある.
      9    /// </summary>
    -10    public sealed class RuntimeOnlyAwaitCaller : IAwaitCaller
    -11    {
    -12        private readonly NextFrameTaskScheduler _scheduler;
    -13        private readonly float                  _timeOutInSeconds;
    -14        private          float                  _lastTimeoutBaseTime;
    +10    public sealed class RuntimeOnlyAwaitCaller : IAwaitCaller
    +11    {
    +12        private readonly NextFrameTaskScheduler _scheduler;
    +13        private readonly float                  _timeOutInSeconds;
    +14        private          float                  _lastTimeoutBaseTime;
     15
     16        /// <summary>
     17        /// タイムアウト指定可能なコンストラクタ
     18        /// </summary>
     19        /// <param name="timeOutInSeconds">NextFrameIfTimedOutがタイムアウトと見なす時間(秒単位)</param>
    -20        public RuntimeOnlyAwaitCaller(float timeOutInSeconds = 1f / 1000f)
    -21        {
    -22            _scheduler = new NextFrameTaskScheduler();
    -23            _timeOutInSeconds = timeOutInSeconds;
    -24            ResetLastTimeoutBaseTime();
    -25        }
    +20        public RuntimeOnlyAwaitCaller(float timeOutInSeconds = 1f / 1000f)
    +21        {
    +22            _scheduler = new NextFrameTaskScheduler();
    +23            _timeOutInSeconds = timeOutInSeconds;
    +24            ResetLastTimeoutBaseTime();
    +25        }
     26
    -27        public Task NextFrame()
    -28        {
    -29            ResetLastTimeoutBaseTime();
    -30            var tcs = new TaskCompletionSource<object>();
    -31            _scheduler.Enqueue(() => tcs.SetResult(default));
    -32            return tcs.Task;
    -33        }
    +27        public Task NextFrame()
    +28        {
    +29            ResetLastTimeoutBaseTime();
    +30            var tcs = new TaskCompletionSource<object>();
    +31            _scheduler.Enqueue(() => tcs.SetResult(default));
    +32            return tcs.Task;
    +33        }
     34
    -35        public Task Run(Action action)
    -36        {
    -37            return Task.Run(action);
    -38        }
    +35        public Task Run(Action action)
    +36        {
    +37            return Task.Run(action);
    +38        }
     39
    -40        public Task<T> Run<T>(Func<T> action)
    -41        {
    -42            return Task.Run(action);
    -43        }
    +40        public Task<T> Run<T>(Func<T> action)
    +41        {
    +42            return Task.Run(action);
    +43        }
     44
    -45        public Task NextFrameIfTimedOut() => CheckTimeout() ? NextFrame() : Task.CompletedTask;
    +45        public Task NextFrameIfTimedOut() => CheckTimeout() ? NextFrame() : Task.CompletedTask;
     46
    -47        private void ResetLastTimeoutBaseTime() => _lastTimeoutBaseTime = 0f;
    +47        private void ResetLastTimeoutBaseTime() => _lastTimeoutBaseTime = 0f;
     48
    -49        private bool LastTimeoutBaseTimeNeedsReset => _lastTimeoutBaseTime == 0f;
    +49        private bool LastTimeoutBaseTimeNeedsReset => _lastTimeoutBaseTime == 0f;
     50
    -51        private bool CheckTimeout()
    -52        {
    -53            float t = UnityEngine.Time.realtimeSinceStartup;
    -54            if (LastTimeoutBaseTimeNeedsReset)
    -55            {
    -56                _lastTimeoutBaseTime = t;
    -57            }
    -58            return (t - _lastTimeoutBaseTime) >= _timeOutInSeconds;
    -59        }
    -60    }
    -61}
    +51        private bool CheckTimeout()
    +52        {
    +53            float t = UnityEngine.Time.realtimeSinceStartup;
    +54            if (LastTimeoutBaseTimeNeedsReset)
    +55            {
    +56                _lastTimeoutBaseTime = t;
    +57            }
    +58            return (t - _lastTimeoutBaseTime) >= _timeOutInSeconds;
    +59        }
    +60    }
    +61}
     
    diff --git a/en/api/0_95_dispose.html b/en/api/0_95_dispose.html index 8aee81204..07002a011 100644 --- a/en/api/0_95_dispose.html +++ b/en/api/0_95_dispose.html @@ -343,17 +343,17 @@

    v0.95 GltfData.Dispose

    Now that we are using NativeArray within the importer, we had to discard it at the end. Please dispose of it when you are finished using it.

    -
    class GltfData: IDisposable
    +
    class GltfData: IDisposable
     

    Example

    // must dispose GltfData
    -using (GltfData data = new AutoGltfFileParser(path).Parse())
    -using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: materialGenerator))
    -{
    -    return await loader.LoadAsync(awaitCaller);
    -}
    +using (GltfData data = new AutoGltfFileParser(path).Parse())
    +using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: materialGenerator))
    +{
    +    return await loader.LoadAsync(awaitCaller);
    +}
     
    diff --git a/en/api/0_95_highlevel.html b/en/api/0_95_highlevel.html index 21ef57cd9..0833eea25 100644 --- a/en/api/0_95_highlevel.html +++ b/en/api/0_95_highlevel.html @@ -345,93 +345,93 @@

    As the API became more complex, we added a high-level API that simplifies common usage. GltfUtility and VrmUtility are used internally, so you can just call them with await.

    GLTF

    -
     1using System.IO;
    - 2using System.Threading.Tasks;
    - 3using UnityEngine;
    - 4using VRMShaders;
    +
     1using System.IO;
    + 2using System.Threading.Tasks;
    + 3using UnityEngine;
    + 4using VRMShaders;
      5
    - 6namespace UniGLTF
    - 7{
    - 8    public static class GltfUtility
    - 9    {
    -10        public static async Task<RuntimeGltfInstance> LoadAsync(string path, IAwaitCaller awaitCaller = null, IMaterialDescriptorGenerator materialGenerator = null)
    -11        {
    -12            if (!File.Exists(path))
    -13            {
    -14                throw new FileNotFoundException(path);
    -15            }
    + 6namespace UniGLTF
    + 7{
    + 8    public static class GltfUtility
    + 9    {
    +10        public static async Task<RuntimeGltfInstance> LoadAsync(string path, IAwaitCaller awaitCaller = null, IMaterialDescriptorGenerator materialGenerator = null)
    +11        {
    +12            if (!File.Exists(path))
    +13            {
    +14                throw new FileNotFoundException(path);
    +15            }
     16
    -17            Debug.LogFormat("{0}", path);
    -18            using (GltfData data = new AutoGltfFileParser(path).Parse())
    -19            using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: materialGenerator))
    -20            {
    -21                return await loader.LoadAsync(awaitCaller);
    -22            }
    -23        }
    -24    }
    -25}
    +17            Debug.LogFormat("{0}", path);
    +18            using (GltfData data = new AutoGltfFileParser(path).Parse())
    +19            using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: materialGenerator))
    +20            {
    +21                return await loader.LoadAsync(awaitCaller);
    +22            }
    +23        }
    +24    }
    +25}
     

    VRM

    -
     1using System;
    - 2using System.IO;
    - 3using System.Threading.Tasks;
    - 4using UniGLTF;
    - 5using UnityEngine;
    - 6using VRMShaders;
    +
     1using System;
    + 2using System.IO;
    + 3using System.Threading.Tasks;
    + 4using UniGLTF;
    + 5using UnityEngine;
    + 6using VRMShaders;
      7
    - 8namespace VRM
    - 9{
    -10    public static class VrmUtility
    -11    {
    -12        public delegate IMaterialDescriptorGenerator MaterialGeneratorCallback(VRM.glTF_VRM_extensions vrm);
    -13        public delegate void MetaCallback(VRMMetaObject meta);
    -14        public static async Task<RuntimeGltfInstance> LoadAsync(string path,
    -15            IAwaitCaller awaitCaller = null,
    -16            MaterialGeneratorCallback materialGeneratorCallback = null,
    -17            MetaCallback metaCallback = null
    -18            )
    -19        {
    -20            if (!File.Exists(path))
    -21            {
    -22                throw new FileNotFoundException(path);
    -23            }
    + 8namespace VRM
    + 9{
    +10    public static class VrmUtility
    +11    {
    +12        public delegate IMaterialDescriptorGenerator MaterialGeneratorCallback(VRM.glTF_VRM_extensions vrm);
    +13        public delegate void MetaCallback(VRMMetaObject meta);
    +14        public static async Task<RuntimeGltfInstance> LoadAsync(string path,
    +15            IAwaitCaller awaitCaller = null,
    +16            MaterialGeneratorCallback materialGeneratorCallback = null,
    +17            MetaCallback metaCallback = null
    +18            )
    +19        {
    +20            if (!File.Exists(path))
    +21            {
    +22                throw new FileNotFoundException(path);
    +23            }
     24
    -25            using (GltfData data = new AutoGltfFileParser(path).Parse())
    -26            {
    -27                try
    -28                {
    -29                    var vrm = new VRMData(data);
    -30                    IMaterialDescriptorGenerator materialGen = default;
    -31                    if (materialGeneratorCallback != null)
    -32                    {
    -33                        materialGen = materialGeneratorCallback(vrm.VrmExtension);
    -34                    }
    -35                    using (var loader = new VRMImporterContext(vrm, materialGenerator: materialGen))
    -36                    {
    -37                        if (metaCallback != null)
    -38                        {
    -39                            var meta = await loader.ReadMetaAsync(new ImmediateCaller(), true);
    -40                            metaCallback(meta);
    -41                        }
    -42                        return await loader.LoadAsync(awaitCaller);
    -43                    }
    -44                }
    -45                catch (NotVrm0Exception)
    -46                {
    +25            using (GltfData data = new AutoGltfFileParser(path).Parse())
    +26            {
    +27                try
    +28                {
    +29                    var vrm = new VRMData(data);
    +30                    IMaterialDescriptorGenerator materialGen = default;
    +31                    if (materialGeneratorCallback != null)
    +32                    {
    +33                        materialGen = materialGeneratorCallback(vrm.VrmExtension);
    +34                    }
    +35                    using (var loader = new VRMImporterContext(vrm, materialGenerator: materialGen))
    +36                    {
    +37                        if (metaCallback != null)
    +38                        {
    +39                            var meta = await loader.ReadMetaAsync(new ImmediateCaller(), true);
    +40                            metaCallback(meta);
    +41                        }
    +42                        return await loader.LoadAsync(awaitCaller);
    +43                    }
    +44                }
    +45                catch (NotVrm0Exception)
    +46                {
     47                    // retry
    -48                    Debug.LogWarning("file extension is vrm. but not vrm ?");
    -49                    using (var loader = new UniGLTF.ImporterContext(data))
    -50                    {
    -51                        return await loader.LoadAsync(awaitCaller);
    -52                    }
    -53                }
    -54            }
    -55        }
    -56    }
    -57}
    +48                    Debug.LogWarning("file extension is vrm. but not vrm ?");
    +49                    using (var loader = new UniGLTF.ImporterContext(data))
    +50                    {
    +51                        return await loader.LoadAsync(awaitCaller);
    +52                    }
    +53                }
    +54            }
    +55        }
    +56    }
    +57}
     
    @@ -439,29 +439,29 @@

    Example

    v0.95.0 Assets/VRM_Samples/SimpleViewer/ViewerUI.cs
    -
     1        async void LoadModelAsync(string path)
    - 2        {
    - 3            var ext = Path.GetExtension(path).ToLower();
    - 4            switch (ext)
    - 5            {
    - 6                case ".gltf":
    - 7                case ".glb":
    - 8                case ".zip":
    - 9                    {
    -10                        var instance = await GltfUtility.LoadAsync(path,
    -11                            GetIAwaitCaller(m_useAsync.isOn),
    -12                            GetGltfMaterialGenerator(m_useUrpMaterial.isOn));
    -13                        break;
    -14                    }
    +
     1        async void LoadModelAsync(string path)
    + 2        {
    + 3            var ext = Path.GetExtension(path).ToLower();
    + 4            switch (ext)
    + 5            {
    + 6                case ".gltf":
    + 7                case ".glb":
    + 8                case ".zip":
    + 9                    {
    +10                        var instance = await GltfUtility.LoadAsync(path,
    +11                            GetIAwaitCaller(m_useAsync.isOn),
    +12                            GetGltfMaterialGenerator(m_useUrpMaterial.isOn));
    +13                        break;
    +14                    }
     15
    -16                case ".vrm":
    -17                    {
    -18                        VrmUtility.MaterialGeneratorCallback materialCallback = (VRM.glTF_VRM_extensions vrm) => GetVrmMaterialGenerator(m_useUrpMaterial.isOn, vrm);
    -19                        VrmUtility.MetaCallback metaCallback = m_texts.UpdateMeta;
    -20                        var instance = await VrmUtility.LoadAsync(path, GetIAwaitCaller(m_useAsync.isOn), materialCallback, metaCallback);
    -21                        SetModel(instance);
    -22                        break;
    -23                    }
    +16                case ".vrm":
    +17                    {
    +18                        VrmUtility.MaterialGeneratorCallback materialCallback = (VRM.glTF_VRM_extensions vrm) => GetVrmMaterialGenerator(m_useUrpMaterial.isOn, vrm);
    +19                        VrmUtility.MetaCallback metaCallback = m_texts.UpdateMeta;
    +20                        var instance = await VrmUtility.LoadAsync(path, GetIAwaitCaller(m_useAsync.isOn), materialCallback, metaCallback);
    +21                        SetModel(instance);
    +22                        break;
    +23                    }
     
    diff --git a/en/api/fast_spring_bone.html b/en/api/fast_spring_bone.html index f528acfb0..93fac4bf6 100644 --- a/en/api/fast_spring_bone.html +++ b/en/api/fast_spring_bone.html @@ -362,15 +362,15 @@

    VRM 0.x での FastSpringBone の導入方法

    差し替えを行いたいタイミングで FastSpringBoneReplacer.ReplaceAsync を呼び出してください

    これを明示的に呼ばなければ、従来のSpringBoneのまま動作します。

    -
    using (var loader = new UniGLTF.ImporterContext(data))
    -{
    -    var instance = await loader.LoadAsync();
    -    SetModel(instance);
    -}
    -FastSpringBoneReplacer.ReplaceAsync(instance.Root)
    +
    using (var loader = new UniGLTF.ImporterContext(data))
    +{
    +    var instance = await loader.LoadAsync();
    +    SetModel(instance);
    +}
    +FastSpringBoneReplacer.ReplaceAsync(instance.Root)
     
    -instance.EnableUpdateWhenOffscreen();
    -instance.ShowMeshes();
    +instance.EnableUpdateWhenOffscreen();
    +instance.ShowMeshes();
     
    diff --git a/en/api/firstperson.html b/en/api/firstperson.html index d18b44476..e9e12cfdf 100644 --- a/en/api/firstperson.html +++ b/en/api/firstperson.html @@ -348,13 +348,13 @@

    アプリケーションに追加の描画レイヤーを指定する

    定数で以下のレイヤーを定義しています。

    -
    public class VRMFirstPerson : MonoBehaviour
    -{
    -    public const int FIRSTPERSON_ONLY_LAYER = 9;
    -    public const int THIRDPERSON_ONLY_LAYER = 10;
    +
    public class VRMFirstPerson : MonoBehaviour
    +{
    +    public const int FIRSTPERSON_ONLY_LAYER = 9;
    +    public const int THIRDPERSON_ONLY_LAYER = 10;
     
         // 省略
    -}
    +}
     
    @@ -374,47 +374,47 @@
  • VRMFirstPerson.Setupの呼び出し

  • 一人称カメラとその他のカメラに対してLayerMask

  • -
    using System.Collections;
    -using System.Collections.Generic;
    -using UnityEngine;
    -using VRM;
    +
    using System.Collections;
    +using System.Collections.Generic;
    +using UnityEngine;
    +using VRM;
     
    -public class SetupExample : MonoBehaviour
    -{
    -    [SerializeField]
    +public class SetupExample : MonoBehaviour
    +{
    +    [SerializeField]
         Camera m_firstPersonCamera; // HMDのカメラ
     
    -    [SerializeField]
    +    [SerializeField]
         LayerMask m_firstPersonMask; // HMDのカメラにセットするマスク default | VRMFirstPersonOnly など
     
    -    [SerializeField]
    +    [SerializeField]
         LayerMask m_otherMask; // HMDのカメラにセットするマスク default | VRMThirdPersonOnly など
     
    -    [SerializeField]
    -    VRMFirstPerson m_firstPerson;
    +    [SerializeField]
    +    VRMFirstPerson m_firstPerson;
     
    -    void Reset()
    -    {
    -        m_firstPerson = GameObject.FindObjectOfType<VRMFirstPerson>();
    -    }
    +    void Reset()
    +    {
    +        m_firstPerson = GameObject.FindObjectOfType<VRMFirstPerson>();
    +    }
     
    -    void Start()
    -    {
    -        foreach (var camera in GameObject.FindObjectsOfType<Camera>())
    -        {
    -            camera.cullingMask = (camera == m_firstPersonCamera)
    -                ? m_firstPersonMask
    -                : m_otherMask
    -                ;
    -        }
    +    void Start()
    +    {
    +        foreach (var camera in GameObject.FindObjectsOfType<Camera>())
    +        {
    +            camera.cullingMask = (camera == m_firstPersonCamera)
    +                ? m_firstPersonMask
    +                : m_otherMask
    +                ;
    +        }
     
             // VRMFirstPersonの初期化
    -        if (m_firstPerson != null)
    -        {
    -            m_firstPerson.Setup();
    -        }
    -    }
    -}
    +        if (m_firstPerson != null)
    +        {
    +            m_firstPerson.Setup();
    +        }
    +    }
    +}
     
    diff --git a/en/api/how_to_customize_material_import.html b/en/api/how_to_customize_material_import.html index e930d4643..ff6755813 100644 --- a/en/api/how_to_customize_material_import.html +++ b/en/api/how_to_customize_material_import.html @@ -347,15 +347,15 @@

    materialGenerator で URP 用のマテリアルをロードする

    URP マテリアルを生成するようにカスタムする例です。

    https://github.com/vrm-c/UniVRM/issues/1214

    -
    async RuntimeGltfInstance Load(GltfData data)
    -{
    -    IMaterialDescriptorGenerator materialGenerator = new GltfUrpMaterialDescriptorGenerator();
    -    using(var loader = new UniGLTF.ImporterContext(data, materialGenerator: materialGenerator)
    -    {
    -        var instance = await loader.LoadAsync();
    -        return instance;
    -    }
    -}
    +
    async RuntimeGltfInstance Load(GltfData data)
    +{
    +    IMaterialDescriptorGenerator materialGenerator = new GltfUrpMaterialDescriptorGenerator();
    +    using(var loader = new UniGLTF.ImporterContext(data, materialGenerator: materialGenerator)
    +    {
    +        var instance = await loader.LoadAsync();
    +        return instance;
    +    }
    +}
     
    diff --git a/en/api/how_to_impl_extension.html b/en/api/how_to_impl_extension.html index f29f4ff1f..5af2fbf85 100644 --- a/en/api/how_to_impl_extension.html +++ b/en/api/how_to_impl_extension.html @@ -367,21 +367,21 @@

    UniGLTF の extensions

    v0.63.0 以前は、GLTF extensions フィールドに、GLTFExtensions 型を定義して、VRM フィールドを定義するという方法をとっていました。

    -
    class VRM
    -{
    +
    class VRM
    +{
     
    -}
    +}
     
    -class GLTFExtensions
    -{
    -    public VRM VRM;
    -}
    +class GLTFExtensions
    +{
    +    public VRM VRM;
    +}
     
    -class GLTF
    -{
    +class GLTF
    +{
         // すべての拡張の型をコンパイル時に知っている必要がある。動的に拡張できない
    -    public GLTFExtensions extensions;
    -}
    +    public GLTFExtensions extensions;
    +}
     

    この設計だと GLTF と拡張を別ライブラリとして分離することができませんでした。

    @@ -389,16 +389,16 @@ UniGLTF は import/export の具体的な内容を知らずに中間データの入れ物として扱います。

    // extensions / extras の入れ物として使う型
     // 実行時は、 glTFExtensionImport / glTFExtensionExport を使う
    -public abstract class glTFExtension
    -{
    +public abstract class glTFExtension
    +{
     
    -}
    +}
     
    -class GLTF
    -{
    +class GLTF
    +{
         // UniGLTFは具体的な型を知らない。利用側が処理(serialize/deserialize)する
    -    public glTFExtension extensions;
    -}
    +    public glTFExtension extensions;
    +}
     
    @@ -414,82 +414,82 @@ UniGLTF は import/

    JSONPATH と 型を決める

    // 型
    -class GoodMaterial
    -{
    +class GoodMaterial
    +{
         // `materials[*].extensions.CUSTOM_materials_good`
    -    public const string EXTENSION_NAME = "CUSTOM_materials_good";
    +    public const string EXTENSION_NAME = "CUSTOM_materials_good";
     
    -    public int GoodValue;
    -}
    +    public int GoodValue;
    +}
     

    import

    -
    GoodMaterial DeserializeGoodMaterial(ListTreeNode<JsonValue> json)
    -{
    +
    GoodMaterial DeserializeGoodMaterial(ListTreeNode<JsonValue> json)
    +{
         // デシリアライズ。手で書くかコード生成する(後述)
    -}
    +}
     
     // ユーティリティ関数例
    -bool TryGetExtension<T>(UniGLTF.glTFExtension extension, string key, Func<ListTreeNode<JsonValue>, T> deserializer, out T value)
    -{
    -    if(material.extensions is UniGLTF.glTFExtensionsImport import)
    -    {
    +bool TryGetExtension<T>(UniGLTF.glTFExtension extension, string key, Func<ListTreeNode<JsonValue>, T> deserializer, out T value)
    +{
    +    if(material.extensions is UniGLTF.glTFExtensionsImport import)
    +    {
             // null check 完了
    -        foreach(var kv in import.ObjectItems())
    -        {
    -            if(kv.key.GetString()==key)
    -            {
    -                value = Deserialize(kv.Value);
    -                return true;
    -            }
    -        }
    -    }
    +        foreach(var kv in import.ObjectItems())
    +        {
    +            if(kv.key.GetString()==key)
    +            {
    +                value = Deserialize(kv.Value);
    +                return true;
    +            }
    +        }
    +    }
     
    -    value = default;
    -    return false;
    -}
    +    value = default;
    +    return false;
    +}
     
    -void ImportMaterial(UniGLTF.glTFMaterial material)
    -{
    +void ImportMaterial(UniGLTF.glTFMaterial material)
    +{
         // material の処理に割り込んで
    -    if(TryGetExtension(material.extension, GoodMaterial.EXTENSION_NAME, DeserializeGoodMaterial, out GoodMaterial good))
    -    {
    +    if(TryGetExtension(material.extension, GoodMaterial.EXTENSION_NAME, DeserializeGoodMaterial, out GoodMaterial good))
    +    {
             // good material 独自の処理
    -    }
    -}
    +    }
    +}
     

    export

    -
    void SerializeGoodMaterial(UniJSON.JsonFormatter f, GoodMaterial value)
    -{
    +
    void SerializeGoodMaterial(UniJSON.JsonFormatter f, GoodMaterial value)
    +{
         // シリアライズ。手で書くかコード生成する(後述)
    -}
    +}
     
     // ユーティリティ関数例
    -public ArraySegment<byte> SerializeExtension<T>(T value, Func<T, ArraySegment<byte>> serialize)
    -{
    -    var f = new UniJSON.JsonFormatter();
    -    serialize(f, value);
    -    return f.GetStoreBytes();
    -}
    +public ArraySegment<byte> SerializeExtension<T>(T value, Func<T, ArraySegment<byte>> serialize)
    +{
    +    var f = new UniJSON.JsonFormatter();
    +    serialize(f, value);
    +    return f.GetStoreBytes();
    +}
     
    -void ExportGoodMaterial(UniGLTF.glTFMaterial material, GoodMaterial good)
    -{
    +void ExportGoodMaterial(UniGLTF.glTFMaterial material, GoodMaterial good)
    +{
         // material の処理に割り込んで
    -    if(!(material.extensions is UniGLTF.glTFExtensionsExport export))
    -    {
    +    if(!(material.extensions is UniGLTF.glTFExtensionsExport export))
    +    {
             // 無かった。新規作成
    -        export = new UniGLTF.glTFExtensionsExport();
    -        material.extensions = export;
    -    }
    +        export = new UniGLTF.glTFExtensionsExport();
    +        material.extensions = export;
    +    }
     
    -    var bytes = SerializeExtension(good, SerializeGoodMaterial);
    -    export.Add(GoodMaterial.EXTENSION_NAME, bytes);
    -}
    +    var bytes = SerializeExtension(good, SerializeGoodMaterial);
    +    export.Add(GoodMaterial.EXTENSION_NAME, bytes);
    +}
     
    @@ -620,22 +620,22 @@ C# の型から生成するものと、JsonSchema から C# の型とともに
    • Assets\UniGLTF\Editor\UniGLTF\Serialization\SerializerGenerator.cs

    -
    using System;
    -using System.Collections.Generic;
    -using System.IO;
    -using System.Reflection;
    -using System.Text;
    -using UniJSON;
    -using UnityEditor;
    -using UnityEngine;
    +
    using System;
    +using System.Collections.Generic;
    +using System.IO;
    +using System.Reflection;
    +using System.Text;
    +using UniJSON;
    +using UnityEditor;
    +using UnityEngine;
     
    -namespace UniGLTF
    -{
    -    public static class SerializerGenerator
    -    {
    -        const BindingFlags FIELD_FLAGS = BindingFlags.Instance | BindingFlags.Public;
    +namespace UniGLTF
    +{
    +    public static class SerializerGenerator
    +    {
    +        const BindingFlags FIELD_FLAGS = BindingFlags.Instance | BindingFlags.Public;
     
    -        const string Begin = @"// Don't edit manually. This is generaged. 
    +        const string Begin = @"// Don't edit manually. This is generaged. 
     using System;
     using System.Collections.Generic;
     using UniJSON;
    @@ -645,41 +645,41 @@ C# の型から生成するものと、JsonSchema から C# の型とともに
         static public class GltfSerializer
         {
     
    -";
    +";
     
    -        const string End = @"
    +        const string End = @"
         } // class
     } // namespace
    -";
    +";
     
    -        static string OutPath
    -        {
    -            get
    -            {
    -                return Path.Combine(UnityEngine.Application.dataPath,
    -                "UniGLTF/UniGLTF/Scripts/IO/GltfSerializer.g.cs");
    -            }
    -        }
    +        static string OutPath
    +        {
    +            get
    +            {
    +                return Path.Combine(UnityEngine.Application.dataPath,
    +                "UniGLTF/UniGLTF/Scripts/IO/GltfSerializer.g.cs");
    +            }
    +        }
     
    -        [MenuItem(UniGLTFVersion.MENU + "/GLTF: Generate Serializer")]
    -        static void GenerateSerializer()
    -        {
    -            var info = new ObjectSerialization(typeof(glTF), "gltf", "Serialize_");
    -            Debug.Log(info);
    +        [MenuItem(UniGLTFVersion.MENU + "/GLTF: Generate Serializer")]
    +        static void GenerateSerializer()
    +        {
    +            var info = new ObjectSerialization(typeof(glTF), "gltf", "Serialize_");
    +            Debug.Log(info);
     
    -            using (var s = File.Open(OutPath, FileMode.Create))
    -            using (var w = new StreamWriter(s, new UTF8Encoding(false)))
    -            {
    -                w.Write(Begin);
    -                info.GenerateSerializer(w, "Serialize");
    -                w.Write(End);
    -            }
    +            using (var s = File.Open(OutPath, FileMode.Create))
    +            using (var w = new StreamWriter(s, new UTF8Encoding(false)))
    +            {
    +                w.Write(Begin);
    +                info.GenerateSerializer(w, "Serialize");
    +                w.Write(End);
    +            }
     
    -            Debug.LogFormat("write: {0}", OutPath);
    -            UnityPath.FromFullpath(OutPath).ImportAsset();
    -        }
    -    }
    -}
    +            Debug.LogFormat("write: {0}", OutPath);
    +            UnityPath.FromFullpath(OutPath).ImportAsset();
    +        }
    +    }
    +}
     
    @@ -695,22 +695,22 @@ C# の型から生成するものと、JsonSchema から C# の型とともに
    • Assets\UniGLTF\Editor\UniGLTF\Serialization\DeserializerGenerator.cs

    -
    using System.IO;
    -using System.Reflection;
    -using System.Text;
    -using UnityEditor;
    -using UnityEngine;
    +
    using System.IO;
    +using System.Reflection;
    +using System.Text;
    +using UnityEditor;
    +using UnityEngine;
     
    -namespace UniGLTF
    -{
    +namespace UniGLTF
    +{
         /// <summary>
         /// Generate deserializer from ListTreeNode<JsonValue> to glTF using type reflection
         /// </summary>
    -    public static class DeserializerGenerator
    -    {
    -        public const BindingFlags FIELD_FLAGS = BindingFlags.Instance | BindingFlags.Public;
    +    public static class DeserializerGenerator
    +    {
    +        public const BindingFlags FIELD_FLAGS = BindingFlags.Instance | BindingFlags.Public;
     
    -        const string Begin = @"// Don't edit manually. This is generaged. 
    +        const string Begin = @"// Don't edit manually. This is generaged. 
     using UniJSON;
     using System;
     using System.Collections.Generic;
    @@ -721,41 +721,41 @@ C# の型から生成するものと、JsonSchema から C# の型とともに
     public static class GltfDeserializer
     {
     
    -";
    +";
     
    -        const string End = @"
    +        const string End = @"
     } // GltfDeserializer
     } // UniGLTF 
    -";
    +";
     
    -        static string OutPath
    -        {
    -            get
    -            {
    -                return Path.Combine(UnityEngine.Application.dataPath,
    -                "UniGLTF/UniGLTF/Scripts/IO/GltfDeserializer.g.cs");
    -            }
    -        }
    +        static string OutPath
    +        {
    +            get
    +            {
    +                return Path.Combine(UnityEngine.Application.dataPath,
    +                "UniGLTF/UniGLTF/Scripts/IO/GltfDeserializer.g.cs");
    +            }
    +        }
     
    -        [MenuItem(UniGLTFVersion.MENU + "/GLTF: Generate Deserializer")]
    -        static void GenerateSerializer()
    -        {
    -            var info = new ObjectSerialization(typeof(glTF), "gltf", "Deserialize_");
    -            Debug.Log(info);
    +        [MenuItem(UniGLTFVersion.MENU + "/GLTF: Generate Deserializer")]
    +        static void GenerateSerializer()
    +        {
    +            var info = new ObjectSerialization(typeof(glTF), "gltf", "Deserialize_");
    +            Debug.Log(info);
     
    -            using (var s = File.Open(OutPath, FileMode.Create))
    -            using (var w = new StreamWriter(s, new UTF8Encoding(false)))
    -            {
    -                w.Write(Begin);
    -                info.GenerateDeserializer(w, "Deserialize");
    -                w.Write(End);
    -            }
    +            using (var s = File.Open(OutPath, FileMode.Create))
    +            using (var w = new StreamWriter(s, new UTF8Encoding(false)))
    +            {
    +                w.Write(Begin);
    +                info.GenerateDeserializer(w, "Deserialize");
    +                w.Write(End);
    +            }
     
    -            Debug.LogFormat("write: {0}", OutPath);
    -            UnityPath.FromFullpath(OutPath).ImportAsset();
    -        }
    -    }
    -}
    +            Debug.LogFormat("write: {0}", OutPath);
    +            UnityPath.FromFullpath(OutPath).ImportAsset();
    +        }
    +    }
    +}
     
    @@ -763,18 +763,18 @@ C# の型から生成するものと、JsonSchema から C# の型とともに

    キー出力の抑制

    index に無効な値として -1 を入れる場合に、JSONではキーを出力しないとしたいことがあります。

    TODO: int? にするべきだった

    -
    [JsonSchema(Minimum = 0)]
    -int index = -1;
    +
    [JsonSchema(Minimum = 0)]
    +int index = -1;
     

    のようにすることで、キーの出力を抑制できます。

        // 生成コードのキー出力例
    -    if(value.index>=0){
    +    if(value.index>=0){
     

    何も付けないと

        // 出力制御無し
    -    if(true){
    +    if(true){
     
    @@ -782,11 +782,11 @@ C# の型から生成するものと、JsonSchema から C# の型とともに

    enum のエンコーディング

    enumの値の名前を文字列で使う、enumの値の数値を使うの2種類がありえます。 enumの場合はデフォルト値が無いので必須です。

    -
    [JsonSchema(EnumSerializationType = EnumSerializationType.AsInt)]
    -public glBufferTarget target;
    +
    [JsonSchema(EnumSerializationType = EnumSerializationType.AsInt)]
    +public glBufferTarget target;
     
    -[JsonSchema(EnumSerializationType = EnumSerializationType.AsLowerString)]
    -public ProjectionType type;
    +[JsonSchema(EnumSerializationType = EnumSerializationType.AsLowerString)]
    +public ProjectionType type;
     
    diff --git a/en/api/sample/FirstPersonSample.html b/en/api/sample/FirstPersonSample.html index bdf686a2e..71bc29668 100644 --- a/en/api/sample/FirstPersonSample.html +++ b/en/api/sample/FirstPersonSample.html @@ -351,29 +351,29 @@

    の描画を例示します。

    v0.87.0 Assets/VRM_Samples/FirstPersonSample/VRMRuntimeLoader.cs
    -
     1        void SetupTarget()
    - 2        {
    - 3            if (m_target != null)
    - 4            {
    - 5                m_target.Source = m_source;
    - 6                m_target.SourceType = UniHumanoid.HumanPoseTransfer.HumanPoseTransferSourceType.HumanPoseTransfer;
    +
     1        void SetupTarget()
    + 2        {
    + 3            if (m_target != null)
    + 4            {
    + 5                m_target.Source = m_source;
    + 6                m_target.SourceType = UniHumanoid.HumanPoseTransfer.HumanPoseTransferSourceType.HumanPoseTransfer;
      7
    - 8                m_blendShape = m_target.GetComponent<VRMBlendShapeProxy>();
    + 8                m_blendShape = m_target.GetComponent<VRMBlendShapeProxy>();
      9
    -10                m_firstPerson = m_target.GetComponent<VRMFirstPerson>();
    +10                m_firstPerson = m_target.GetComponent<VRMFirstPerson>();
     11
    -12                var animator = m_target.GetComponent<Animator>();
    -13                if (animator != null)
    -14                {
    -15                    m_firstPerson.Setup();
    +12                var animator = m_target.GetComponent<Animator>();
    +13                if (animator != null)
    +14                {
    +15                    m_firstPerson.Setup();
     16
    -17                    if (m_faceCamera != null)
    -18                    {
    -19                        m_faceCamera.Target = animator.GetBoneTransform(HumanBodyBones.Head);
    -20                    }
    -21                }
    -22            }
    -23        }
    +17                    if (m_faceCamera != null)
    +18                    {
    +19                        m_faceCamera.Target = animator.GetBoneTransform(HumanBodyBones.Head);
    +20                    }
    +21                }
    +22            }
    +23        }
     
    diff --git a/en/api/sample/RuntimeExporterSample.html b/en/api/sample/RuntimeExporterSample.html index ac4480dc7..1ae63e706 100644 --- a/en/api/sample/RuntimeExporterSample.html +++ b/en/api/sample/RuntimeExporterSample.html @@ -345,28 +345,28 @@

    VRM を Runtime Export するサンプルです。

    v0.87.0 Assets/VRM_Samples/RuntimeExporterSample/VRMRuntimeExporter.cs
    -
     1        static byte[] ExportSimple(GameObject model)
    - 2        {
    - 3            var vrm = VRMExporter.Export(new UniGLTF.GltfExportSettings(), model, new RuntimeTextureSerializer());
    - 4            var bytes = vrm.ToGlbBytes();
    - 5            return bytes;
    - 6        }
    +
     1        static byte[] ExportSimple(GameObject model)
    + 2        {
    + 3            var vrm = VRMExporter.Export(new UniGLTF.GltfExportSettings(), model, new RuntimeTextureSerializer());
    + 4            var bytes = vrm.ToGlbBytes();
    + 5            return bytes;
    + 6        }
      7
    - 8        static byte[] ExportCustom(GameObject exportRoot, bool forceTPose = false)
    - 9        {
    + 8        static byte[] ExportCustom(GameObject exportRoot, bool forceTPose = false)
    + 9        {
     10            // normalize
    -11            var target = VRMBoneNormalizer.Execute(exportRoot, forceTPose);
    +11            var target = VRMBoneNormalizer.Execute(exportRoot, forceTPose);
     12
    -13            try
    -14            {
    -15                return ExportSimple(target);
    -16            }
    -17            finally
    -18            {
    +13            try
    +14            {
    +15                return ExportSimple(target);
    +16            }
    +17            finally
    +18            {
     19                // cleanup
    -20                GameObject.Destroy(target);
    -21            }
    -22        }
    +20                GameObject.Destroy(target);
    +21            }
    +22        }
     
    diff --git a/en/api/sample/SimpleViewer.html b/en/api/sample/SimpleViewer.html index a73f97513..827f7132c 100644 --- a/en/api/sample/SimpleViewer.html +++ b/en/api/sample/SimpleViewer.html @@ -345,58 +345,58 @@

    Runtime ローダーのサンプルです。

    c89e Assets/VRM_Samples/SimpleViewer/ViewerUI.cs
    -
     1        async void LoadModelAsync(string path, bool isVrm)
    - 2        {
    - 3            if (!File.Exists(path))
    - 4            {
    - 5                return;
    - 6            }
    +
     1        async void LoadModelAsync(string path, bool isVrm)
    + 2        {
    + 3            if (!File.Exists(path))
    + 4            {
    + 5                return;
    + 6            }
      7
    - 8            Debug.LogFormat("{0}", path);
    + 8            Debug.LogFormat("{0}", path);
      9
    -10            GltfData data;
    -11            try
    -12            {
    -13                data = new AutoGltfFileParser(path).Parse();
    -14            }
    -15            catch (Exception ex)
    -16            {
    -17                Debug.LogWarningFormat("parse error: {0}", ex);
    -18                return;
    -19            }
    +10            GltfData data;
    +11            try
    +12            {
    +13                data = new AutoGltfFileParser(path).Parse();
    +14            }
    +15            catch (Exception ex)
    +16            {
    +17                Debug.LogWarningFormat("parse error: {0}", ex);
    +18                return;
    +19            }
     20
    -21            if (isVrm)
    -22            {
    -23                try
    -24                {
    -25                    var vrm = new VRMData(data);
    -26                    using (var loader = new VRMImporterContext(vrm, materialGenerator: GetVrmMaterialGenerator(m_useUrpMaterial.isOn, vrm.VrmExtension)))
    -27                    {
    -28                        await m_texts.UpdateMetaAsync(loader);
    -29                        var instance = await loader.LoadAsync(GetIAwaitCaller(m_useAsync.isOn));
    -30                        SetModel(instance);
    -31                    }
    -32                }
    -33                catch (NotVrm0Exception)
    -34                {
    +21            if (isVrm)
    +22            {
    +23                try
    +24                {
    +25                    var vrm = new VRMData(data);
    +26                    using (var loader = new VRMImporterContext(vrm, materialGenerator: GetVrmMaterialGenerator(m_useUrpMaterial.isOn, vrm.VrmExtension)))
    +27                    {
    +28                        await m_texts.UpdateMetaAsync(loader);
    +29                        var instance = await loader.LoadAsync(GetIAwaitCaller(m_useAsync.isOn));
    +30                        SetModel(instance);
    +31                    }
    +32                }
    +33                catch (NotVrm0Exception)
    +34                {
     35                    // retry
    -36                    Debug.LogWarning("file extension is vrm. but not vrm ?");
    -37                    using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: GetGltfMaterialGenerator(m_useUrpMaterial.isOn)))
    -38                    {
    -39                        var instance = await loader.LoadAsync(GetIAwaitCaller(m_useAsync.isOn));
    -40                        SetModel(instance);
    -41                    }
    -42                }
    -43            }
    -44            else
    -45            {
    -46                using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: GetGltfMaterialGenerator(m_useUrpMaterial.isOn)))
    -47                {
    -48                    var instance = await loader.LoadAsync(GetIAwaitCaller(m_useAsync.isOn));
    -49                    SetModel(instance);
    -50                }
    -51            }
    -52        }
    +36                    Debug.LogWarning("file extension is vrm. but not vrm ?");
    +37                    using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: GetGltfMaterialGenerator(m_useUrpMaterial.isOn)))
    +38                    {
    +39                        var instance = await loader.LoadAsync(GetIAwaitCaller(m_useAsync.isOn));
    +40                        SetModel(instance);
    +41                    }
    +42                }
    +43            }
    +44            else
    +45            {
    +46                using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: GetGltfMaterialGenerator(m_useUrpMaterial.isOn)))
    +47                {
    +48                    var instance = await loader.LoadAsync(GetIAwaitCaller(m_useAsync.isOn));
    +49                    SetModel(instance);
    +50                }
    +51            }
    +52        }
     
    diff --git a/en/implementation/coordinate.html b/en/implementation/coordinate.html index 02eb6b15a..3b8bfdcfe 100644 --- a/en/implementation/coordinate.html +++ b/en/implementation/coordinate.html @@ -400,37 +400,37 @@

    Invert Z-axis

    Vector3: Position, Normal, etc.

    -
    public static Vector3 ReverseZ(this Vector3 v)
    -{
    -    return new Vector3(v.x, v.y, -v.z);
    -}
    +
    public static Vector3 ReverseZ(this Vector3 v)
    +{
    +    return new Vector3(v.x, v.y, -v.z);
    +}
     

    Quaternion: Rotation

    -
    public static Quaternion ReverseZ(this Quaternion q)
    -{
    -    float angle;
    -    Vector3 axis;
    -    q.ToAngleAxis(out angle, out axis);
    -    return Quaternion.AngleAxis(-angle, ReverseZ(axis));
    -}
    +
    public static Quaternion ReverseZ(this Quaternion q)
    +{
    +    float angle;
    +    Vector3 axis;
    +    q.ToAngleAxis(out angle, out axis);
    +    return Quaternion.AngleAxis(-angle, ReverseZ(axis));
    +}
     

    Matrix: BindMatrices

    If the scale value is in it, it does not work.

    -
    public static Matrix4x4 ReverseZ(this Matrix4x4 m)
    -{
    -#if UNITY_2017_1_OR_NEWER
    -    m.SetTRS(m.GetColumn(3).ReverseZ(), m.rotation.ReverseZ(), Vector3.one);
    -#else
    -    m.SetTRS(m.ExtractPosition().ReverseZ(), m.ExtractRotation().ReverseZ(), Vector3.one);
    -#endif
    -    return m;
    -}
    +
    public static Matrix4x4 ReverseZ(this Matrix4x4 m)
    +{
    +#if UNITY_2017_1_OR_NEWER
    +    m.SetTRS(m.GetColumn(3).ReverseZ(), m.rotation.ReverseZ(), Vector3.one);
    +#else
    +    m.SetTRS(m.ExtractPosition().ReverseZ(), m.ExtractRotation().ReverseZ(), Vector3.one);
    +#endif
    +    return m;
    +}
     
    diff --git a/en/implementation/scripted_importer.html b/en/implementation/scripted_importer.html index 1525b1bdb..0e067366c 100644 --- a/en/implementation/scripted_importer.html +++ b/en/implementation/scripted_importer.html @@ -361,13 +361,13 @@

    Import 設定を作れる

    ScriptedImporter を継承したクラスの public member[SerializeField] に情報を保存できます。

    // 例
    -[ScriptedImporter(1, "cube")]
    -public class CubeImporter : ScriptedImporter
    -{
    -    public float m_Scale = 1; // これを Asset の Inspector で変更して Apply すると、新しい設定で再importできる
    +[ScriptedImporter(1, "cube")]
    +public class CubeImporter : ScriptedImporter
    +{
    +    public float m_Scale = 1; // これを Asset の Inspector で変更して Apply すると、新しい設定で再importできる
     
         // 省略
    -}
    +}
     
    diff --git a/en/implementation/texture_manipulation.html b/en/implementation/texture_manipulation.html index 107a7d806..9f4b2b4c1 100644 --- a/en/implementation/texture_manipulation.html +++ b/en/implementation/texture_manipulation.html @@ -347,7 +347,7 @@

    Runtime

    new する場合は、

    -
    var texture = new Texture2D(width, height, format, mipChain, linear = true);
    +
    var texture = new Texture2D(width, height, format, mipChain, linear = true);
     

    とする。

    @@ -356,12 +356,12 @@

    Editor(Asset)

    AssetFolder の png/jpg からloadする場合は、 事前に設定が必用。

    -
    var textureImporter = AssetImporter.GetAtPath(assetPath) as TextureImporter;
    -textureImporter.sRGBTexture = false; // Linear
    -textureImporter.SaveAndReimport();
    +
    var textureImporter = AssetImporter.GetAtPath(assetPath) as TextureImporter;
    +textureImporter.sRGBTexture = false; // Linear
    +textureImporter.SaveAndReimport();
     
     // linear でロードされます
    -var texture =AssetDatabase.LoadAssetAtPath<Texture2D>(assetPath);
    +var texture =AssetDatabase.LoadAssetAtPath<Texture2D>(assetPath);
     
    @@ -374,17 +374,17 @@

    Runtime

    new する場合は、

    -
    var texture = new Texture2D(width, height, format, mipChain, linear = true);
    +
    var texture = new Texture2D(width, height, format, mipChain, linear = true);
     

    とする。 また、 DXT5nm という仕様で格納する必要があるので変換します。 y と w の2要素だけを使います。

    -
    half4 normal;
    -normal.x = 1.0;
    -normal.y = col.y;
    -normal.z = 1.0;
    -normal.w = col.x;
    +
    half4 normal;
    +normal.x = 1.0;
    +normal.y = col.y;
    +normal.z = 1.0;
    +normal.w = col.x;
     
    @@ -392,12 +392,12 @@ y と w の2要素だけを使います。

    Editor(Asset)

    AssetFolder の png/jpg からloadする場合は、 ロードする前に設定が必用。

    -
    var textureImporter = AssetImporter.GetAtPath(assetPath) as TextureImporter;
    -textureImporter.textureType = TextureImporterType.NormalMap; // normalMap
    -textureImporter.SaveAndReimport();
    +
    var textureImporter = AssetImporter.GetAtPath(assetPath) as TextureImporter;
    +textureImporter.textureType = TextureImporterType.NormalMap; // normalMap
    +textureImporter.SaveAndReimport();
     
     // DXT5nm でロードされます。
    -var texture =AssetDatabase.LoadAssetAtPath<Texture2D>(assetPath);
    +var texture =AssetDatabase.LoadAssetAtPath<Texture2D>(assetPath);
     
    diff --git a/en/release/055/v0.41.html b/en/release/055/v0.41.html index 728b48bac..f5e9a5c6a 100644 --- a/en/release/055/v0.41.html +++ b/en/release/055/v0.41.html @@ -373,11 +373,11 @@
  • [Importer] Change Task’s version check from UNITY_2018_1_OR_NEWER to UNITY_2017_1_OR_NEWER

  • [Exporter] Organized interface

  • -
    GameObject m_model;
    -string path;
    -var vrm = VRMExporter.Export(m_model);
    -var bytes = vrm.ToGlbBytes();
    -File.WriteAllBytes(path, bytes);
    +
    GameObject m_model;
    +string path;
    +var vrm = VRMExporter.Export(m_model);
    +var bytes = vrm.ToGlbBytes();
    +File.WriteAllBytes(path, bytes);
     
      diff --git a/en/release/055/v0.42.html b/en/release/055/v0.42.html index 22415f0f1..b25a2c5ea 100644 --- a/en/release/055/v0.42.html +++ b/en/release/055/v0.42.html @@ -355,11 +355,11 @@ If you are using UniVRM to import VRM data, please update UniVRM to the latest v

      UV Bugs Fix:

      In v0.41 and the earlier versions, converting UV between Unity and GLTF was incorrect.

      Before

      -
      var converted_uv = new Vec2(uv.x, -uv.y); // value becomes negative
      +
      var converted_uv = new Vec2(uv.x, -uv.y); // value becomes negative
       

      After

      -
      var converted_uv = new Vec2(uv.x, 1.0f-uv.y);
      +
      var converted_uv = new Vec2(uv.x, 1.0f-uv.y);
       

      This change influences both import and export.

      @@ -421,12 +421,12 @@ It influences the use of normal map.

      /bufferViews/*/byteStridewill not output

      It seems necessary for outputting OpenGL’s interleaved vbo format:

      // Example of interleaved format
      -struct Vertex
      -{
      -  public Vector3 Position;
      -  public Vector3 Normal;
      -}
      -Vertex[] Vertices;
      +struct Vertex
      +{
      +  public Vector3 Position;
      +  public Vector3 Normal;
      +}
      +Vertex[] Vertices;
       

      Since UniGLTF outputs separate arrays for each vertex attribute, ByteStride was unnecessary.

      diff --git a/en/release/055/v0.44.html b/en/release/055/v0.44.html index a868083a4..d9bd46889 100644 --- a/en/release/055/v0.44.html +++ b/en/release/055/v0.44.html @@ -407,24 +407,24 @@

    NormalMap asset import

    -
    textureImporter.textureType = TextureImporterType.NormalMap;
    +
    textureImporter.textureType = TextureImporterType.NormalMap;
     

    NormalMap runtime import

    pack

    -
    fixed4 frag(v2f i) : SV_Target
    -{
    -    half4 col = tex2D(_MainTex, i.uv);
    -    half4 normal;
    -    normal.x = 1.0;
    -    normal.y = col.y;
    -    normal.z = 1.0;
    -    normal.w = col.x;
    +
    fixed4 frag(v2f i) : SV_Target
    +{
    +    half4 col = tex2D(_MainTex, i.uv);
    +    half4 normal;
    +    normal.x = 1.0;
    +    normal.y = col.y;
    +    normal.z = 1.0;
    +    normal.w = col.x;
     
    -    return normal;
    -}
    +    return normal;
    +}
     
    diff --git a/en/release/055/v0.46.html b/en/release/055/v0.46.html index 0226731b2..2ede75ed9 100644 --- a/en/release/055/v0.46.html +++ b/en/release/055/v0.46.html @@ -377,7 +377,7 @@

    Unity2018.3対応

    -
    #if NET_4_6 || NET_STANDARD_2_0
    +
    #if NET_4_6 || NET_STANDARD_2_0
     
    @@ -412,7 +412,7 @@

    AccumulateValue

    値を貯めて、後で Apply したときに反映する。 SetValues の最後にも Apply されます。

    -
    void BlendShapeProxy.AccumulateValue(key, value)
    +
    void BlendShapeProxy.AccumulateValue(key, value)
     
     // [Obsolete] SetValue(key, value, false)
     
    @@ -421,7 +421,7 @@

    ImmediatelySetValue

    即反映する。

    -
    void BlendShapeProxy.ImmediatelySetValue(key, value)
    +
    void BlendShapeProxy.ImmediatelySetValue(key, value)
     
     // [Obsolete] SetValue(key, value, true)
     
    @@ -430,7 +430,7 @@

    ImporterContext.Destroy

    -
    ImporterContext.Destroy(bool destroySubAssets)
    +
    ImporterContext.Destroy(bool destroySubAssets)
     

    が名前から期待される動作をしていないので Obsolete にして用途を明確にした関数を用意しました。

    diff --git a/en/release/056/v0.56.0.html b/en/release/056/v0.56.0.html index ecb8707a0..2f66e74ae 100644 --- a/en/release/056/v0.56.0.html +++ b/en/release/056/v0.56.0.html @@ -437,42 +437,42 @@ VRM が VRMShaders に依存しています。

    参考コード

    // #330以前の動作
    -public BlendShapeKey(string name) : this(name, BlendShapePreset.Unknown)
    -{
    -}
    +public BlendShapeKey(string name) : this(name, BlendShapePreset.Unknown)
    +{
    +}
     
    -public BlendShapeKey(string name, BlendShapePreset preset)
    -{
    -    Name = name.ToUpper();
    -    Preset = preset;
    -    if (Preset != BlendShapePreset.Unknown)
    -    {
    -        m_id = Preset.ToString().ToUpper();
    -    }
    -    else
    -    {
    -        m_id = Name;
    -    }
    -}
    +public BlendShapeKey(string name, BlendShapePreset preset)
    +{
    +    Name = name.ToUpper();
    +    Preset = preset;
    +    if (Preset != BlendShapePreset.Unknown)
    +    {
    +        m_id = Preset.ToString().ToUpper();
    +    }
    +    else
    +    {
    +        m_id = Name;
    +    }
    +}
     
    -public bool Equals(BlendShapeKey other)
    -{
    -    return ID == other.ID;
    -}
    +public bool Equals(BlendShapeKey other)
    +{
    +    return ID == other.ID;
    +}
     
     // v0.56 でだいたい同じような動きをするコード
    -static BlendShapeKey CreateKeyOld(string src)
    -{
    +static BlendShapeKey CreateKeyOld(string src)
    +{
         // Enum があまり速くない(GC出たり)ようなので、パフォーマンス要件が厳しい場合はキャッシュするなど工夫することをおすすめします
    -    if (Enum.TryParse<BlendShapePreset>(src, true, out BlendShapePreset preset))
    -    {
    -        if (preset != BlendShapePreset.Unknown)
    -        {
    -            return BlendShapeKey.CreateFromPreset(preset);
    -        }
    -    }
    -    return BlendShapeKey.CreateUnknown(src);
    -}
    +    if (Enum.TryParse<BlendShapePreset>(src, true, out BlendShapePreset preset))
    +    {
    +        if (preset != BlendShapePreset.Unknown)
    +        {
    +            return BlendShapeKey.CreateFromPreset(preset);
    +        }
    +    }
    +    return BlendShapeKey.CreateUnknown(src);
    +}
     
      diff --git a/en/release/079/index.html b/en/release/079/index.html index b0a83c470..896bb9ccc 100644 --- a/en/release/079/index.html +++ b/en/release/079/index.html @@ -415,12 +415,12 @@

      UPM(v0.81~)

      // manifest.json 抜粋
       {
      -  "dependencies": {
      -    "com.vrmc.vrmshaders": "https://github.com/vrm-c/UniVRM.git?path=/Assets/VRMShaders#v0.82.1",
      -    "com.vrmc.gltf": "https://github.com/vrm-c/UniVRM.git?path=/Assets/UniGLTF#v0.82.1", // rename unigltf to gltf
      -    "com.vrmc.univrm": "https://github.com/vrm-c/UniVRM.git?path=/Assets/VRM#v0.82.1",
      -    "com.vrmc.vrm": "https://github.com/vrm-c/UniVRM.git?path=/Assets/VRM10#v0.82.1", // rename univrm1 to vrm
      -  }
      +  "dependencies": {
      +    "com.vrmc.vrmshaders": "https://github.com/vrm-c/UniVRM.git?path=/Assets/VRMShaders#v0.82.1",
      +    "com.vrmc.gltf": "https://github.com/vrm-c/UniVRM.git?path=/Assets/UniGLTF#v0.82.1", // rename unigltf to gltf
      +    "com.vrmc.univrm": "https://github.com/vrm-c/UniVRM.git?path=/Assets/VRM#v0.82.1",
      +    "com.vrmc.vrm": "https://github.com/vrm-c/UniVRM.git?path=/Assets/VRM10#v0.82.1", // rename univrm1 to vrm
      +  }
       }
       
      diff --git a/en/release/100/index.html b/en/release/100/index.html index 619143a52..01b5c5322 100644 --- a/en/release/100/index.html +++ b/en/release/100/index.html @@ -403,12 +403,12 @@

      UPM(v0.100~)

      // manifest.json 抜粋
       {
      -  "dependencies": {
      -    "com.vrmc.vrmshaders": "https://github.com/vrm-c/UniVRM.git?path=/Assets/VRMShaders#v0.105.0",
      -    "com.vrmc.gltf": "https://github.com/vrm-c/UniVRM.git?path=/Assets/UniGLTF#v0.105.0",
      -    "com.vrmc.univrm": "https://github.com/vrm-c/UniVRM.git?path=/Assets/VRM#v0.105.0",
      -    "com.vrmc.vrm": "https://github.com/vrm-c/UniVRM.git?path=/Assets/VRM10#v0.105.0",
      -  }
      +  "dependencies": {
      +    "com.vrmc.vrmshaders": "https://github.com/vrm-c/UniVRM.git?path=/Assets/VRMShaders#v0.105.0",
      +    "com.vrmc.gltf": "https://github.com/vrm-c/UniVRM.git?path=/Assets/UniGLTF#v0.105.0",
      +    "com.vrmc.univrm": "https://github.com/vrm-c/UniVRM.git?path=/Assets/VRM#v0.105.0",
      +    "com.vrmc.vrm": "https://github.com/vrm-c/UniVRM.git?path=/Assets/VRM10#v0.105.0",
      +  }
       }
       
      diff --git a/en/unihumanoid/index.html b/en/unihumanoid/index.html index 04906dd6c..6a63aaba4 100644 --- a/en/unihumanoid/index.html +++ b/en/unihumanoid/index.html @@ -345,10 +345,10 @@

      Unity humanoid utility with bvh importer.

      BVH runtime loader

      -
      var context = new BvhImporterContext();
      -context.Parse(path);
      +
      var context = new BvhImporterContext();
      +context.Parse(path);
       context.Load(); // create Skeleton hierarchy and mesh for visualize
      -GameObject root = context.Root;
      +GameObject root = context.Root;
       
      diff --git a/en/vrm1/api_update.html b/en/vrm1/api_update.html index 6aa2c87fc..80d36fbb6 100644 --- a/en/vrm1/api_update.html +++ b/en/vrm1/api_update.html @@ -381,13 +381,13 @@

      VRMBlendShapeProxy is now Vrm10Instance.Runtime.Expression.

      AccumulateValue have been into SetWeight.ImmediatelySetValue is gone.

      -
      var proxy = root.GetComponent<VRMBlendShapeProxy>();
      -proxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.A), 0.5f);
      +
      var proxy = root.GetComponent<VRMBlendShapeProxy>();
      +proxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.A), 0.5f);
       

      👇

      -
      var vrm10 = root.GetComponent<Vrm10Instance>();
      -vrm10.Runtime.Expression.SetWeight(ExpressionKey.CreateFromPreset(ExpressionPreset.aa), 0.5f);
      +
      var vrm10 = root.GetComponent<Vrm10Instance>();
      +vrm10.Runtime.Expression.SetWeight(ExpressionKey.CreateFromPreset(ExpressionPreset.aa), 0.5f);
       
      @@ -399,27 +399,27 @@

    Gaze

    -
    var lookAt = root.GetComponent<VRMLookAt>();
    -lookAt.LookWorldPosition(new Vector3(x, y, z));
    +
    var lookAt = root.GetComponent<VRMLookAt>();
    +lookAt.LookWorldPosition(new Vector3(x, y, z));
     

    👇

    -
    var vrm10 = root.GetComponent<Vrm10Instance>();
    -vrm10.LookAtTargetType = LookAtTargetTypes.CalcYawPitchToGaze;
    -vrm10.Gaze.position = new Vector3(x, y, z);
    +
    var vrm10 = root.GetComponent<Vrm10Instance>();
    +vrm10.LookAtTargetType = LookAtTargetTypes.CalcYawPitchToGaze;
    +vrm10.Gaze.position = new Vector3(x, y, z);
     

    SetYawPitch

    -
    var lookAt = root.GetComponent<VRMLookAt>();
    -lookAt.ApplyRotations(yaw, pitch);
    +
    var lookAt = root.GetComponent<VRMLookAt>();
    +lookAt.ApplyRotations(yaw, pitch);
     

    👇

    -
    var vrm10 = root.GetComponent<Vrm10Instance>();
    -vrm10.LookAtTargetType = LookAtTargetTypes.SetYawPitch;
    -vrm10.Runtime.LookAt.SetLookAtYawPitch(yaw, pitch);
    +
    var vrm10 = root.GetComponent<Vrm10Instance>();
    +vrm10.LookAtTargetType = LookAtTargetTypes.SetYawPitch;
    +vrm10.Runtime.LookAt.SetLookAtYawPitch(yaw, pitch);
     
    diff --git a/en/vrm1/vrm1_controlrig.html b/en/vrm1/vrm1_controlrig.html index b17ad36df..284e97ef6 100644 --- a/en/vrm1/vrm1_controlrig.html +++ b/en/vrm1/vrm1_controlrig.html @@ -364,15 +364,15 @@

    As of v0.103, this feature does not work with in-editor asset generation models.I don’t want to generate it in the Editor as it gets in the way when setting up the VRM model.

    ControlRigGenerationOption.Generate to generate a ControlRig by default.

    -
    public static async Task<Vrm10Instance> Vrm10.LoadPathAsync(
    -    string path,
    -    bool canLoadVrm0X = true,
    -    ControlRigGenerationOption controlRigGenerationOption = ControlRigGenerationOption.Generate, // 👈
    -    bool showMeshes = true,
    -    IAwaitCaller awaitCaller = null,
    -    IMaterialDescriptorGenerator materialGenerator = null,
    -    VrmMetaInformationCallback vrmMetaInformationCallback = null,
    -    CancellationToken ct = default)
    +
    public static async Task<Vrm10Instance> Vrm10.LoadPathAsync(
    +    string path,
    +    bool canLoadVrm0X = true,
    +    ControlRigGenerationOption controlRigGenerationOption = ControlRigGenerationOption.Generate, // 👈
    +    bool showMeshes = true,
    +    IAwaitCaller awaitCaller = null,
    +    IMaterialDescriptorGenerator materialGenerator = null,
    +    VrmMetaInformationCallback vrmMetaInformationCallback = null,
    +    CancellationToken ct = default)
     

    Model loaded with ControlRigGenerationOption.Generate``Animator.getBoneTransform returns the corresponding bone of the ControlRig.How to get the original bones is described later.

    @@ -390,39 +390,39 @@ /// from v0.104 /// </summary> /// <param name="src"></param> -public void UpdateControlRigImplicit(Animator src) -{ - var dst = m_controller.GetComponent<Animator>(); +public void UpdateControlRigImplicit(Animator src) +{ + var dst = m_controller.GetComponent<Animator>(); - foreach (HumanBodyBones bone in CachedEnum.GetValues<HumanBodyBones>()) - { - if (bone == HumanBodyBones.LastBone) - { - continue; - } + foreach (HumanBodyBones bone in CachedEnum.GetValues<HumanBodyBones>()) + { + if (bone == HumanBodyBones.LastBone) + { + continue; + } // v0.104 から Animator.GetBoneTransform が // ControlRig のボーンを返します。 - var boneTransform = dst.GetBoneTransform(bone); - if (boneTransform == null) - { - continue; - } + var boneTransform = dst.GetBoneTransform(bone); + if (boneTransform == null) + { + continue; + } - var bvhBone = src.GetBoneTransform(bone); - if (bvhBone != null) - { + var bvhBone = src.GetBoneTransform(bone); + if (bvhBone != null) + { // set normalized pose - boneTransform.localRotation = bvhBone.localRotation; - } + boneTransform.localRotation = bvhBone.localRotation; + } - if (bone == HumanBodyBones.Hips) - { + if (bone == HumanBodyBones.Hips) + { // TODO: hips position scaling ? - boneTransform.localPosition = bvhBone.localPosition; - } - } -} + boneTransform.localPosition = bvhBone.localPosition; + } + } +}
    @@ -437,14 +437,14 @@

    Every frame Vrm10Instance is Vrm10RuntimeControlRig Copy the pose into the VRM-1.0 hierarchy. When copying, the rotation of each joint is processed to reflect the initial pose.

    The logic is the expression GlobalInit.Inverse * localPose * GlobalInit.This allows you to convert a normalized pose (localPose) to a non-normalized pose.

    Vrm10ControlBone.cs

    -
            internal void ProcessRecursively()
    -        {
    -            ControlTarget.localRotation = _initialTargetLocalRotation * Quaternion.Inverse(_initialTargetGlobalRotation) * ControlBone.localRotation * _initialTargetGlobalRotation;
    -            foreach (var child in _children)
    -            {
    -                child.ProcessRecursively();
    -            }
    -        }
    +
            internal void ProcessRecursively()
    +        {
    +            ControlTarget.localRotation = _initialTargetLocalRotation * Quaternion.Inverse(_initialTargetGlobalRotation) * ControlBone.localRotation * _initialTargetGlobalRotation;
    +            foreach (var child in _children)
    +            {
    +                child.ProcessRecursively();
    +            }
    +        }
     
    diff --git a/en/vrm1/vrm1_firstperson.html b/en/vrm1/vrm1_firstperson.html index ad845853f..b5fad7a52 100644 --- a/en/vrm1/vrm1_firstperson.html +++ b/en/vrm1/vrm1_firstperson.html @@ -372,8 +372,8 @@

    Default layer number

    The default is FirstPerson = 9, ThirdPerson = 10.

    Can be specified as an argument to FirstPerson.SetupAsync.

    -
    var created = await controller.Vrm.FirstPerson.SetupAsync(
    -    controller.gameObject, firstPersonOnlyLayer: 9, thirdPersonOnlyLayer: 10);
    +
    var created = await controller.Vrm.FirstPerson.SetupAsync(
    +    controller.gameObject, firstPersonOnlyLayer: 9, thirdPersonOnlyLayer: 10);
     
    @@ -418,30 +418,30 @@
  • Call Vrm10Instance.Vrm.FirstPerson.SetupAsync

  • ShowMeshes

  • -
    async Task<RuntimeGltfInstance> LoadAsync(string path)
    -{
    -    var data = new GlbFileParser(path).Parse();
    -    if (!Vrm10Data.TryParseOrMigrate(data, true, out Vrm10Data vrm))
    -    {
    -        throw new System.Exception("vrm parse error !");
    -    }
    -    using (var loader = new Vrm10Importer(vrm))
    -    {
    +
    async Task<RuntimeGltfInstance> LoadAsync(string path)
    +{
    +    var data = new GlbFileParser(path).Parse();
    +    if (!Vrm10Data.TryParseOrMigrate(data, true, out Vrm10Data vrm))
    +    {
    +        throw new System.Exception("vrm parse error !");
    +    }
    +    using (var loader = new Vrm10Importer(vrm))
    +    {
             // 1.
    -        var instance = await loader.LoadAsync();
    +        var instance = await loader.LoadAsync();
     
             // 2.
    -        var controller = instance.GetComponent<Vrm10Instance>();
    +        var controller = instance.GetComponent<Vrm10Instance>();
     
             // 3. The headless model that created is added to instance
    -        await controller.Vrm.FirstPerson.SetupAsync(controller.gameObject);
    +        await controller.Vrm.FirstPerson.SetupAsync(controller.gameObject);
     
             // 4. 
    -        instance.ShowMeshes();
    +        instance.ShowMeshes();
     
    -        return instance;
    -    }
    -}
    +        return instance;
    +    }
    +}
     
    diff --git a/en/vrm1/vrm1_load.html b/en/vrm1/vrm1_load.html index 1ce6fe25a..c648a2fc3 100644 --- a/en/vrm1/vrm1_load.html +++ b/en/vrm1/vrm1_load.html @@ -345,7 +345,7 @@

    Assets\VRM10\Samples\VRM10Viewer\VRM10ViewerUI.cs

    RuntimeLoad

    -
    Vrm10Instance vrm10Instance = await Vrm10.LoadPathAsync(path);
    +
    Vrm10Instance vrm10Instance = await Vrm10.LoadPathAsync(path);
     
    @@ -353,39 +353,39 @@

    Migration(VRM-0 to VRM-1)

    VRM-1.0 can also read VRM-0.x. In that case a conversion to the new meta occurs and all incompatible partsHas a value of disallowed. You can access your pre-converted licenses.

    See also the sample Assets\VRM10\Samples\VRM10Viewer\VRM10ViewerUI.cs.

    -
    async Task<Vrm10Instance> LoadAsync(string path)
    -{
    -    GltfData data = new AutoGltfFileParser(path).Parse();
    +
    async Task<Vrm10Instance> LoadAsync(string path)
    +{
    +    GltfData data = new AutoGltfFileParser(path).Parse();
     
         // doMigrate: true で旧バージョンの vrm をロードできます。
    -    if (Vrm10Data.TryParseOrMigrate(data, doMigrate: true, out Vrm10Data vrm))
    -    {
    +    if (Vrm10Data.TryParseOrMigrate(data, doMigrate: true, out Vrm10Data vrm))
    +    {
             // vrm
    -        using (var loader = new Vrm10Importer(vrm))
    -        {
    +        using (var loader = new Vrm10Importer(vrm))
    +        {
                 // migrate しても thumbnail は同じ
    -            var thumbnail  = await loader.LoadVrmThumbnailAsync();
    +            var thumbnail  = await loader.LoadVrmThumbnailAsync();
     
    -            if (vrm.OriginalMetaBeforeMigration != null)
    -            {
    +            if (vrm.OriginalMetaBeforeMigration != null)
    +            {
                     // migrated from vrm-0.x. use OriginalMetaBeforeMigration
    -                UpdateMeta(vrm.OriginalMetaBeforeMigration, thumbnail);
    -            }
    -            else
    -            {
    +                UpdateMeta(vrm.OriginalMetaBeforeMigration, thumbnail);
    +            }
    +            else
    +            {
                     // load vrm-1.0. use newMeta
    -                UpdateMeta(vrm.VrmExtension.Meta, thumbnail);
    -            }
    +                UpdateMeta(vrm.VrmExtension.Meta, thumbnail);
    +            }
     
                 // モデルをロード
    -            RuntimeGltfInstance instance = await loader.LoadAsync();
    -            return instance.GetComponent<Vrm10Instance>();
    -        }
    -    }
    -    else{
    -        throw new Exception("not vrm");
    -    }
    -}
    +            RuntimeGltfInstance instance = await loader.LoadAsync();
    +            return instance.GetComponent<Vrm10Instance>();
    +        }
    +    }
    +    else{
    +        throw new Exception("not vrm");
    +    }
    +}
     
    diff --git a/en/vrm1/vrm1_springbone.html b/en/vrm1/vrm1_springbone.html index 9a5e6139e..16abeff85 100644 --- a/en/vrm1/vrm1_springbone.html +++ b/en/vrm1/vrm1_springbone.html @@ -357,11 +357,11 @@

    external force

    It is a function that assumes the expression of temporary force such as jumping and wind.

    -
    VRM10Instance instance;
    +
    VRM10Instance instance;
     
     // each frame
     // 既存の Gravity に加算されます
    -instance.Runtime.ExternalForce = new Vector3(0.1f, 0, 0);
    +instance.Runtime.ExternalForce = new Vector3(0.1f, 0, 0);
     
    @@ -376,27 +376,27 @@
  • Added FastSpringBoneService.ManualUpdate

  • // 管理している VRM-1.0 がすべて入っている
    -List<VRM10Instance> instances;
    +List<VRM10Instance> instances;
     
     // setup
    -foreach(var instance in instances)
    -{
    +foreach(var instance in instances)
    +{
         // SpringBone を手動にするために、
         // VRM-1.0 本体も手動に変更している。
         // VRM本体 => SpringBone という処理順を守る。
    -    instance.UpdateType = UpdateTypes.None;
    -}
    -FastSpringBoneService.Instance.UpdateType = FastSpringBoneService.UpdateTypes.Manual;
    +    instance.UpdateType = UpdateTypes.None;
    +}
    +FastSpringBoneService.Instance.UpdateType = FastSpringBoneService.UpdateTypes.Manual;
     
     // each frame
    -foreach(var instance in instances)
    -{
    +foreach(var instance in instances)
    +{
         // SpringBone よりも先に VRM10Instance を更新
    -    instance.Runtime.Process();
    -}
    +    instance.Runtime.Process();
    +}
     // 最後に FastSpringBoneService を更新
     // すべての VRM-1.0 の SpringBone がまとめて処理されます。
    -FastSpringBoneService.Instance.ManualUpdate(time.deltaTime);
    +FastSpringBoneService.Instance.ManualUpdate(time.deltaTime);
     
    diff --git a/ja/.doctrees/environment.pickle b/ja/.doctrees/environment.pickle index 0ef2d1d55c21068ce1de99d2add3b2b2b7ce5c1b..d1f45895cc54a534b03da86c98bd529e71b95906 100644 GIT binary patch delta 23908 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 delta 23933 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

    $J&K6{m$E(h6^i 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

    VRMSpringBone.ManualUpdate を追加

    以下のように呼び出すことができます。

    -
    VRMSpringBone spring;
    +
    VRMSpringBone spring;
     
     // setup
    -spring.m_updateType = VRMSpringBone.SpringBoneUpdateType.Manual;
    +spring.m_updateType = VRMSpringBone.SpringBoneUpdateType.Manual;
     
     // each frame
    -spring.ManualUpdate(time.deltaTime);
    +spring.ManualUpdate(time.deltaTime);
     
      diff --git a/ja/api/0_44_runtime_import.html b/ja/api/0_44_runtime_import.html index 4d75f940f..a48a1649d 100644 --- a/ja/api/0_44_runtime_import.html +++ b/ja/api/0_44_runtime_import.html @@ -343,63 +343,63 @@

      v0.44 RuntimeImport

      Version 0.44~ LoadAsyncの例

      -
      var bytes = File.ReadAllBytes(path);
      +
      var bytes = File.ReadAllBytes(path);
       // なんらかの方法でByte列を得る
       
      -var context = new VRMImporterContext();
      +var context = new VRMImporterContext();
       
      -context.ParseGlb(bytes);
      +context.ParseGlb(bytes);
       
       // metaが必要な場合
      -bool createThumbnail=true;
      -var meta = context.ReadMeta(createThumbnail);
      -var thumbnail = meta.Thumbnail;
      +bool createThumbnail=true;
      +var meta = context.ReadMeta(createThumbnail);
      +var thumbnail = meta.Thumbnail;
       
       // modelを構築
      -context.LoadAsync(_ =>
      -{
      -    context.ShowMeshes();
      -    var go = context.Root;
      +context.LoadAsync(_ =>
      +{
      +    context.ShowMeshes();
      +    var go = context.Root;
           // load完了
      -},
      -Debug.LogError);
      +},
      +Debug.LogError);
       

      LoadAsyncTaskを使う例

      -
      #if (NET_4_6 && UNITY_2017_1_OR_NEWER)
      -async static Task<GameObject> LoadAsync(Byte[] bytes)
      -{
      -    var context = new VRMImporterContext();
      +
      #if (NET_4_6 && UNITY_2017_1_OR_NEWER)
      +async static Task<GameObject> LoadAsync(Byte[] bytes)
      +{
      +    var context = new VRMImporterContext();
       
           // GLB形式でJSONを取得しParseします
      -    context.ParseGlb(bytes);
      +    context.ParseGlb(bytes);
       
      -    try
      -    {
      +    try
      +    {
               // ParseしたJSONをシーンオブジェクトに変換していく
      -        await context.LoadAsyncTask();
      +        await context.LoadAsyncTask();
       
               // バウンディングボックスとカメラの位置関係で見切れるのを防止する
               // SkinnedMeshRenderer.updateWhenOffscreen = true
      -        context.EnableUpdateWhenOffscreen();
      +        context.EnableUpdateWhenOffscreen();
       
               // T-Poseのモデルを表示したくない場合、ShowMeshesする前に準備する
               // ロード後に表示する
      -        context.ShowMeshes();
      +        context.ShowMeshes();
       
      -        return context.Root;
      -    }
      -    catch(Exception ex)
      -    {
      -        Debug.LogError(ex);
      +        return context.Root;
      +    }
      +    catch(Exception ex)
      +    {
      +        Debug.LogError(ex);
               // 関連するリソースを破棄する
      -        context.Destroy(true);
      -        throw;
      -    }
      -}
      -#endif
      +        context.Destroy(true);
      +        throw;
      +    }
      +}
      +#endif
       
      @@ -414,89 +414,89 @@

      ファイルパスからVRMを開く

      -
      var path="sample.vrm";
      -var go=VRM.VRMImporter.LoadFromPath(path);
      -Debug.LogFormat("loaded {0}", go.name);
      +
      var path="sample.vrm";
      +var go=VRM.VRMImporter.LoadFromPath(path);
      +Debug.LogFormat("loaded {0}", go.name);
       

      ファイルパスから非同期にVRMを開く

      -
      var path="sample.vrm";
      -VRMImporter.LoadVrmAsync(path, go => {
      -    Debug.LogFormat("loaded {0}", go.name);
      -});
      +
      var path="sample.vrm";
      +VRMImporter.LoadVrmAsync(path, go => {
      +    Debug.LogFormat("loaded {0}", go.name);
      +});
       

      バイト列からVRM開く

      -
      var path="sample.vrm";
      -var bytes = File.ReadAllBytes(path);
      -var go=VRMImporter.LoadFromBytes(bytes);
      +
      var path="sample.vrm";
      +var bytes = File.ReadAllBytes(path);
      +var go=VRMImporter.LoadFromBytes(bytes);
       

      バイト列から非同期にVRMを開く

      -
      VRMImporter.LoadVrmAsync(bytes, go => {
      -    Debug.LogFormat("loaded {0}", go.name);
      -});
      +
      VRMImporter.LoadVrmAsync(bytes, go => {
      +    Debug.LogFormat("loaded {0}", go.name);
      +});
       

      VRMから情報を取り出す

      -
      #if UNITY_STANDALONE_WIN
      -            var path = FileDialogForWindows.FileDialog("open VRM", ".vrm");
      -#else
      -            var path = Application.dataPath + "/default.vrm";
      -#endif
      -            if (string.IsNullOrEmpty(path))
      -            {
      -                return;
      -            }
      +
      #if UNITY_STANDALONE_WIN
      +            var path = FileDialogForWindows.FileDialog("open VRM", ".vrm");
      +#else
      +            var path = Application.dataPath + "/default.vrm";
      +#endif
      +            if (string.IsNullOrEmpty(path))
      +            {
      +                return;
      +            }
       
                   // Byte列を得る
      -            var bytes = File.ReadAllBytes(path);
      +            var bytes = File.ReadAllBytes(path);
       
      -            var context = new VRMImporterContext();
      +            var context = new VRMImporterContext();
       
                   // GLB形式をParseしてチャンクからJSONを取得しParseします
      -            context.ParseGlb(bytes);
      +            context.ParseGlb(bytes);
       
                   // metaを取得
      -            var meta = context.ReadMeta();
      -            Debug.LogFormat("meta: title:{0}", meta.Title);
      +            var meta = context.ReadMeta();
      +            Debug.LogFormat("meta: title:{0}", meta.Title);
       
                   // もしくはこちらでパースされたGLTF全体にアクセスできます
      -            var vrm = context.GLTF;
      +            var vrm = context.GLTF;
       
                   // ParseしたJSONをもとにシーンを構築します
      -            if (m_loadAsync)
      -            {
      +            if (m_loadAsync)
      +            {
                       // 非同期に実行する
      -                var now = Time.time;
      -                VRMImporter.LoadVrmAsync(context, go=> {
      -                    var delta = Time.time - now;
      -                    Debug.LogFormat("LoadVrmAsync {0:0.0} seconds", delta);
      -                    OnLoaded(go);
      -                });
      -            }
      -            else
      -            {
      +                var now = Time.time;
      +                VRMImporter.LoadVrmAsync(context, go=> {
      +                    var delta = Time.time - now;
      +                    Debug.LogFormat("LoadVrmAsync {0:0.0} seconds", delta);
      +                    OnLoaded(go);
      +                });
      +            }
      +            else
      +            {
                       // 同期的に実行する
      -                VRMImporter.LoadFromBytes(context);
      -                OnLoaded(context.Root);
      -            }
      +                VRMImporter.LoadFromBytes(context);
      +                OnLoaded(context.Root);
      +            }
       

      Thumbnailを取得する(v0.37から)

      ReadMetaに引数を渡すことでThumbnailテクスチャを作成できます。

      -
          var meta = context.ReadMeta(true); // Thumbnailテクスチャを作成する
      -    Texture2D thumbnail=meta.Thumbnail;
      +
          var meta = context.ReadMeta(true); // Thumbnailテクスチャを作成する
      +    Texture2D thumbnail=meta.Thumbnail;
       
      diff --git a/ja/api/0_58_blendshape.html b/ja/api/0_58_blendshape.html index 41b8bd8a3..9436eac5b 100644 --- a/ja/api/0_58_blendshape.html +++ b/ja/api/0_58_blendshape.html @@ -393,14 +393,14 @@

      スクリプトから BlendShape weight を適用する

      SetValues 関数のみを使用します。 そのフレームで必要な表情の weight 値をすべて集めてから SetValues を 1 回だけ呼んで設定します。

      -
      var proxy = GetComponent<VRMBlendShapeProxy>();
      +
      var proxy = GetComponent<VRMBlendShapeProxy>();
       
      -proxy.SetValues(new Dictionary<BlendShapeKey, float>
      -{
      +proxy.SetValues(new Dictionary<BlendShapeKey, float>
      +{
           {BlendShapeKey.CreateFromPreset(BlendShapePreset.A), 1f}, // [0, 1] の範囲で Weight を指定
           {BlendShapeKey.CreateFromPreset(BlendShapePreset.Joy), 1f}, // システム定義の表情は enum で指定
           {BlendShapeKey.CreateUnknown("USER_DEFINED_FACIAL"), 1f}, // ユーザ定義の表情は string で指定
      -});
      +});
       
      @@ -420,24 +420,24 @@

    で定義されているとします。 このとき両目を閉じたいモチベーションから、両方を有効にする意図で下記のように実行します。

    -
    proxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_L), 1.0f);
    -proxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_R), 1.0f);
    +
    proxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_L), 1.0f);
    +proxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_R), 1.0f);
     

    すると、左目だけが開いてしまいます。 これは後から ImmediateSetValue した Blink_RBlink_L と競合して weight を上書きしてしまうからです。 したがって VRM の表情制御においては下記の 2 通りのどちらかの方法で書くことが求められます。 これらの方法はこの競合の問題を解決して表情を設定することができます。

    -
    proxy.SetValues(new Dictionary<BlendShapeKey, float>
    -{
    -    {BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_L), 1.0f},
    -    {BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_R), 1.0f},
    -});
    +
    proxy.SetValues(new Dictionary<BlendShapeKey, float>
    +{
    +    {BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_L), 1.0f},
    +    {BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_R), 1.0f},
    +});
     

    または

    proxy.AccumulateValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_L), 1.0f); // すぐに適用せずにたくわえる
    -proxy.AccumulateValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_R), 1.0f);
    +proxy.AccumulateValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_R), 1.0f);
     proxy.Apply(); // 蓄積した値をまとめて適用する
     
    @@ -461,19 +461,19 @@ BlendShape同士が競合することがわかりました。

    ImmediatelySetValue

    簡単なテストプログラムでの利用を想定しています。

    例:

    -
    var proxy = GetComponent<VRMBlendShapeProxy>();
    +
    var proxy = GetComponent<VRMBlendShapeProxy>();
     
    -proxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.A), 1.0f);
    +proxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.A), 1.0f);
     

    AccumulateValue + Apply

    例:

    -
    var proxy = GetComponent<VRMBlendShapeProxy>();
    +
    var proxy = GetComponent<VRMBlendShapeProxy>();
     
     proxy.AccumulateValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_L), 1.0f); // すぐに適用せずにたくわえる
    -proxy.AccumulateValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_R), 1.0f);
    +proxy.AccumulateValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_R), 1.0f);
     proxy.Apply(); // 蓄積した値をまとめて適用する
     
    @@ -483,13 +483,13 @@ BlendShape同士が競合することがわかりました。

    SetValues

    BlendShape合成器が必要に応じ呼び出すことを想定しています。

    例:

    -
    var proxy = GetComponent<VRMBlendShapeProxy>();
    +
    var proxy = GetComponent<VRMBlendShapeProxy>();
     
    -proxy.SetValues(new Dictionary<BlendShapeKey, float>
    -{
    -    {BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_L), 1.0f},
    -    {BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_R), 1.0f},
    -});
    +proxy.SetValues(new Dictionary<BlendShapeKey, float>
    +{
    +    {BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_L), 1.0f},
    +    {BlendShapeKey.CreateFromPreset(BlendShapePreset.Blink_R), 1.0f},
    +});
     
    diff --git a/ja/api/0_68_runtime_import.html b/ja/api/0_68_runtime_import.html index 4ee92bc8c..d8f9e2342 100644 --- a/ja/api/0_68_runtime_import.html +++ b/ja/api/0_68_runtime_import.html @@ -372,146 +372,146 @@

    サンプルコード(同期的ロード)

    -
    using UniGLTF;
    -using UnityEngine;
    -using VRM;
    +
    using UniGLTF;
    +using UnityEngine;
    +using VRM;
     
    -namespace YourNameSpace
    -{
    -    public sealed class LoadVrmSample : MonoBehaviour
    -    {
    -        [SerializeField] private string _vrmFilePath;
    -        private GameObject _vrmGameObject;
    +namespace YourNameSpace
    +{
    +    public sealed class LoadVrmSample : MonoBehaviour
    +    {
    +        [SerializeField] private string _vrmFilePath;
    +        private GameObject _vrmGameObject;
     
    -        private void Start()
    -        {
    -            _vrmGameObject = LoadVrm(_vrmFilePath);
    -        }
    +        private void Start()
    +        {
    +            _vrmGameObject = LoadVrm(_vrmFilePath);
    +        }
     
    -        private void OnDestroy()
    -        {
    -            DestroyVrm(_vrmGameObject);
    -        }
    +        private void OnDestroy()
    +        {
    +            DestroyVrm(_vrmGameObject);
    +        }
     
    -        private GameObject LoadVrm(string vrmFilePath)
    -        {
    +        private GameObject LoadVrm(string vrmFilePath)
    +        {
                 // 1. GltfParser を呼び出します。
                 //    GltfParser はファイルから JSON 情報とバイナリデータを読み出します。
    -            var parser = new GltfParser();
    -            parser.ParsePath(vrmFilePath);
    +            var parser = new GltfParser();
    +            parser.ParsePath(vrmFilePath);
     
                 // 2. GltfParser のインスタンスを引数にして VRMImporterContext を作成します。
                 //    VRMImporterContext は VRM のロードを実際に行うクラスです。
    -            using (var context = new VRMImporterContext(parser))
    -            {
    +            using (var context = new VRMImporterContext(parser))
    +            {
                     // 3. Load 関数を呼び出し、VRM の GameObject を生成します。
    -                context.Load();
    +                context.Load();
     
                     // 4. (任意) SkinnedMeshRenderer の UpdateWhenOffscreen を有効にできる便利関数です。
                     //    https://docs.unity3d.com/2019.4/Documentation/ScriptReference/SkinnedMeshRenderer-updateWhenOffscreen.html
    -                context.EnableUpdateWhenOffscreen();
    +                context.EnableUpdateWhenOffscreen();
     
                     // 5. VRM モデルを表示します。
    -                context.ShowMeshes();
    +                context.ShowMeshes();
     
                     // 6. VRM の GameObject が実際に使用している UnityEngine.Object リソースの寿命を VRM の GameObject に紐付けます。
                     //    つまり VRM の GameObject の破棄時に、実際に使用しているリソース (Texture, Material, Mesh, etc) をまとめて破棄することができます。
    -                context.DisposeOnGameObjectDestroyed();
    +                context.DisposeOnGameObjectDestroyed();
     
                     // 7. Root の GameObject を return します。
                     //    Root の GameObject とは VRMMeta コンポーネントが付与されている GameObject のことです。
    -                return context.Root;
    -            }
    +                return context.Root;
    +            }
                 // 8. using スコープを抜けて context が破棄されると、 VRMImporterContext が保持する UnityEngine.Object リソースが破棄されます。
                 //    このとき破棄されるリソースは、 glTF ファイルには含まれているが VRM の GameObject には割り当てられていないテクスチャなどです。
                 //    手順 6. で VRM の GameObject に紐付けたリソースは、ここでは破棄されません。
    -        }
    +        }
     
    -        private void DestroyVrm(GameObject vrmGameObject)
    -        {
    +        private void DestroyVrm(GameObject vrmGameObject)
    +        {
                 // 9. 生成された VRM の GameObject を破棄します。
                 //    GameObject を破棄すれば、紐づくリソース (Texture, Material, Mesh, etc) も破棄されます。
    -            UnityEngine.Object.Destroy(vrmGameObject);
    -        }
    -    }
    -}
    +            UnityEngine.Object.Destroy(vrmGameObject);
    +        }
    +    }
    +}
     

    サンプルコード(非同期ロード)

    -
    using System.IO;
    -using System.Threading.Tasks;
    -using UniGLTF;
    -using UnityEngine;
    -using VRM;
    +
    using System.IO;
    +using System.Threading.Tasks;
    +using UniGLTF;
    +using UnityEngine;
    +using VRM;
     
    -namespace YourNameSpace
    -{
    -    public sealed class LoadVrmAsyncSample : MonoBehaviour
    -    {
    -        [SerializeField] private string _vrmFilePath;
    -        private GameObject _vrmGameObject;
    +namespace YourNameSpace
    +{
    +    public sealed class LoadVrmAsyncSample : MonoBehaviour
    +    {
    +        [SerializeField] private string _vrmFilePath;
    +        private GameObject _vrmGameObject;
     
    -        private async void Start()
    -        {
    +        private async void Start()
    +        {
                 // 簡便のため、このサンプルではキャンセル処理などは考慮しません。
    -            _vrmGameObject = await LoadVrmAsync(_vrmFilePath);
    -        }
    +            _vrmGameObject = await LoadVrmAsync(_vrmFilePath);
    +        }
     
    -        private void OnDestroy()
    -        {
    -            DestroyVrm(_vrmGameObject);
    -        }
    +        private void OnDestroy()
    +        {
    +            DestroyVrm(_vrmGameObject);
    +        }
     
    -        private async Task<GameObject> LoadVrmAsync(string vrmFilePath)
    -        {
    +        private async Task<GameObject> LoadVrmAsync(string vrmFilePath)
    +        {
                 // 1. GltfParser を呼び出します。
                 //    GltfParser はファイルから JSON 情報とバイナリデータを読み出します。
                 //    GltfParser は Unity のメインスレッド以外で実行できます。
    -            var parser = new GltfParser();
    -            await Task.Run(() =>
    -            {
    -                var file = File.ReadAllBytes(vrmFilePath);
    -                parser.ParseGlb(file);
    -            });
    +            var parser = new GltfParser();
    +            await Task.Run(() =>
    +            {
    +                var file = File.ReadAllBytes(vrmFilePath);
    +                parser.ParseGlb(file);
    +            });
     
                 // 2. GltfParser のインスタンスを引数にして VRMImporterContext を作成します。
                 //    VRMImporterContext は VRM のロードを実際に行うクラスです。
    -            using (var context = new VRMImporterContext(parser))
    -            {
    +            using (var context = new VRMImporterContext(parser))
    +            {
                     // 3. Load 関数を呼び出し、VRM の GameObject を生成します。
                     //    Load 処理は数フレームの時間を要します。
    -                await context.LoadAsync();
    +                await context.LoadAsync();
     
                     // 4. (任意) SkinnedMeshRenderer の UpdateWhenOffscreen を有効にできる便利関数です。
                     //    https://docs.unity3d.com/2019.4/Documentation/ScriptReference/SkinnedMeshRenderer-updateWhenOffscreen.html
    -                context.EnableUpdateWhenOffscreen();
    +                context.EnableUpdateWhenOffscreen();
     
                     // 5. VRM モデルを表示します。
    -                context.ShowMeshes();
    +                context.ShowMeshes();
     
                     // 6. VRM の GameObject が実際に使用している UnityEngine.Object リソースの寿命を VRM の GameObject に紐付けます。
                     //    つまり VRM の GameObject の破棄時に、実際に使用しているリソース (Texture, Material, Mesh, etc) をまとめて破棄することができます。
    -                context.DisposeOnGameObjectDestroyed();
    +                context.DisposeOnGameObjectDestroyed();
     
                     // 7. Root の GameObject を return します。
                     //    Root の GameObject とは VRMMeta コンポーネントが付与されている GameObject のことです。
    -                return context.Root;
    -            }
    +                return context.Root;
    +            }
                 // 8. using スコープを抜けて context が破棄されると、 VRMImporterContext が保持する UnityEngine.Object リソースが破棄されます。
                 //    このとき破棄されるリソースは、 glTF ファイルには含まれているが VRM の GameObject には割り当てられていないテクスチャなどです。
                 //    手順 6. で VRM の GameObject に紐付けたリソースは、ここでは破棄されません。
    -        }
    +        }
     
    -        private void DestroyVrm(GameObject vrmGameObject)
    -        {
    +        private void DestroyVrm(GameObject vrmGameObject)
    +        {
                 // 9. 生成された VRM の GameObject を破棄します。
                 // GameObject を破棄すれば、紐づくリソース (Texture, Material, Mesh, etc) も破棄されます。
    -            UnityEngine.Object.Destroy(vrmGameObject);
    -        }
    -    }
    -}
    +            UnityEngine.Object.Destroy(vrmGameObject);
    +        }
    +    }
    +}
     
    diff --git a/ja/api/0_76_texture_deserializer.html b/ja/api/0_76_texture_deserializer.html index 76334d760..a55996b61 100644 --- a/ja/api/0_76_texture_deserializer.html +++ b/ja/api/0_76_texture_deserializer.html @@ -373,30 +373,30 @@

    差し替え方法

    new UniGLTF.ImporterContext の引き数で指定することができます。

    -
            public ImporterContext(
    -            GltfData data,
    -            IReadOnlyDictionary<SubAssetKey, UnityEngine.Object> externalObjectMap = null,
    -            ITextureDeserializer textureDeserializer = null, // 👈
    -            IMaterialDescriptorGenerator materialGenerator = null)
    +
            public ImporterContext(
    +            GltfData data,
    +            IReadOnlyDictionary<SubAssetKey, UnityEngine.Object> externalObjectMap = null,
    +            ITextureDeserializer textureDeserializer = null, // 👈
    +            IMaterialDescriptorGenerator materialGenerator = null)
     

    new VRM.VRMImporterContext の引き数で指定することができます。

    -
            public VRMImporterContext(
    -            VRMData data,
    -            IReadOnlyDictionary<SubAssetKey, Object> externalObjectMap = null,
    -            ITextureDeserializer textureDeserializer = null, // 👈
    -            IMaterialDescriptorGenerator materialGenerator = null,
    -            bool loadAnimation = false)
    +
            public VRMImporterContext(
    +            VRMData data,
    +            IReadOnlyDictionary<SubAssetKey, Object> externalObjectMap = null,
    +            ITextureDeserializer textureDeserializer = null, // 👈
    +            IMaterialDescriptorGenerator materialGenerator = null,
    +            bool loadAnimation = false)
     

    new UniVRM10.Vrm10Importer の引き数で指定することができます。

    -
            public Vrm10Importer(
    -            Vrm10Data vrm,
    -            IReadOnlyDictionary<SubAssetKey, UnityEngine.Object> externalObjectMap = null,
    -            ITextureDeserializer textureDeserializer = null, // 👈
    -            IMaterialDescriptorGenerator materialGenerator = null,
    -            bool useControlRig = false
    -            )
    +
            public Vrm10Importer(
    +            Vrm10Data vrm,
    +            IReadOnlyDictionary<SubAssetKey, UnityEngine.Object> externalObjectMap = null,
    +            ITextureDeserializer textureDeserializer = null, // 👈
    +            IMaterialDescriptorGenerator materialGenerator = null,
    +            bool useControlRig = false
    +            )
     
    diff --git a/ja/api/0_77_runtime_import.html b/ja/api/0_77_runtime_import.html index cc82add06..e4e5b623d 100644 --- a/ja/api/0_77_runtime_import.html +++ b/ja/api/0_77_runtime_import.html @@ -354,40 +354,40 @@

    を引き継ぎます。 Load の呼び出し後の任意のタイミングで ImporterContext.Dispose で Importer を破棄してください。 任意のタイミングで RuntimeGltfInstance を Destory することで紐づくリソース (Texture, Material, Mesh, etc) も破棄されます。

    -
    using UniGLTF;
    -using UnityEngine;
    +
    using UniGLTF;
    +using UnityEngine;
     
     
    -namespace VRM.Samples
    -{
    -    public sealed class LoadVrmSample : MonoBehaviour
    -    {
    -        [SerializeField] private string _vrmFilePath;
    -        private GameObject _vrmGameObject;
    +namespace VRM.Samples
    +{
    +    public sealed class LoadVrmSample : MonoBehaviour
    +    {
    +        [SerializeField] private string _vrmFilePath;
    +        private GameObject _vrmGameObject;
     
    -        private void Start()
    -        {
    -            _vrmGameObject = LoadVrm(_vrmFilePath);
    -        }
    +        private void Start()
    +        {
    +            _vrmGameObject = LoadVrm(_vrmFilePath);
    +        }
     
    -        private void OnDestroy()
    -        {
    -            DestroyVrm(_vrmGameObject);
    -        }
    +        private void OnDestroy()
    +        {
    +            DestroyVrm(_vrmGameObject);
    +        }
     
    -        private GameObject LoadVrm(string vrmFilePath)
    -        {
    +        private GameObject LoadVrm(string vrmFilePath)
    +        {
                 // 1. GltfParser を呼び出します。
                 //    GltfParser はファイルから JSON 情報とバイナリデータを読み出します。
    -            var parser = new GltfParser();
    -            parser.ParsePath(vrmFilePath);
    +            var parser = new GltfParser();
    +            parser.ParsePath(vrmFilePath);
     
                 // 2. GltfParser のインスタンスを引数にして VRMImporterContext を作成します。
                 //    VRMImporterContext は VRM のロードを実際に行うクラスです。
    -            using (var context = new VRMImporterContext(parser))
    -            {
    +            using (var context = new VRMImporterContext(parser))
    +            {
                     // 3. Load 関数を呼び出し、VRM の GameObject を生成します。
    -                RuntimeGltfInstance instance = context.Load(); // <- `v0.77` でここが変わります。
    +                RuntimeGltfInstance instance = context.Load(); // <- `v0.77` でここが変わります。
                     
                     // 非同期版 async 関数の中で下記のようにしてください
                     // RuntimeGltfInstance instance = await context.LoadAsync();
    @@ -402,20 +402,20 @@ Load の呼び出し後の任意のタイミングで ImporterContext.Dispose 
                     // 6. Root の GameObject を return します。
                     //    Root の GameObject とは VRMMeta コンポーネントが付与されている GameObject のことです。
                     return instance.Root; // <- ImporterContext から RuntimeGltfInstance に移動しました。
    -            }
    +            }
                 // 7. using スコープを抜けて context が破棄されると、 VRMImporterContext が保持する UnityEngine.Object リソースが破棄されます。
                 //    このとき破棄されるリソースは、 glTF ファイルには含まれているが VRM の GameObject には割り当てられていないテクスチャなどです。
                 //    手順 6. で VRM の GameObject に紐付けたリソースは、ここでは破棄されません。
    -        }
    +        }
     
    -        private void DestroyVrm(GameObject vrmGameObject)
    -        {
    +        private void DestroyVrm(GameObject vrmGameObject)
    +        {
                 // 8. 生成された VRM の GameObject を破棄します。
                 //    GameObject を破棄すれば、紐づくリソース (Texture, Material, Mesh, etc) も破棄されます。
    -            UnityEngine.Object.Destroy(vrmGameObject);
    -        }
    -    }
    -}
    +            UnityEngine.Object.Destroy(vrmGameObject);
    +        }
    +    }
    +}
     
    diff --git a/ja/api/0_79_runtime_import.html b/ja/api/0_79_runtime_import.html index 8857c8c3f..7e4a8c6c4 100644 --- a/ja/api/0_79_runtime_import.html +++ b/ja/api/0_79_runtime_import.html @@ -342,11 +342,11 @@

    v0.79 RuntimeImport GltfData

    GltfParserGltfData の分割

    -
    var parser = new GltfParser();
    -parser.ParsePath(path);
    +
    var parser = new GltfParser();
    +parser.ParsePath(path);
     
    -
    GltfData data = new GlbFileParser(path).Parse();
    +
    GltfData data = new GlbFileParser(path).Parse();
     
    diff --git a/ja/api/0_82_glb_import.html b/ja/api/0_82_glb_import.html index 04c66b930..88fe73088 100644 --- a/ja/api/0_82_glb_import.html +++ b/ja/api/0_82_glb_import.html @@ -354,10 +354,10 @@
    • vrm もこの関数を使います。

    -
    GltfData Load(string path)
    -{
    -    return new GlbFileParser(path).Parse();
    -}
    +
    GltfData Load(string path)
    +{
    +    return new GlbFileParser(path).Parse();
    +}
     
    @@ -366,40 +366,40 @@
    • vrm もこの関数を使います。

    -
    GltfData Load(byte[] bytes)
    -{
    -    return new GlbBinaryParser(bytes, "LOAD_NAME").parse();
    -}
    +
    GltfData Load(byte[] bytes)
    +{
    +    return new GlbBinaryParser(bytes, "LOAD_NAME").parse();
    +}
     

    gltf ファイルパスからパースする

    -
    GltfData Load(string path)
    -{
    -    return new GltfFileWithResourceFilesParser(path).Parse();
    -}
    +
    GltfData Load(string path)
    +{
    +    return new GltfFileWithResourceFilesParser(path).Parse();
    +}
     

    zip アーカイブからパースする

    gltf と関連するファイルを zip アーカイブしたファイルをパースできます(実験)。

    -
    GltfData Load(string path)
    -{
    -    return new ZipArchivedGltfFileParser(path).Parse();
    -}
    +
    GltfData Load(string path)
    +{
    +    return new ZipArchivedGltfFileParser(path).Parse();
    +}
     

    ファイルパスの拡張子でパースする

    サンプルの SimpleViewer を参考にしてください。

    -
    GltfData Load(string path)
    -{
    +
    GltfData Load(string path)
    +{
         // ファイル拡張子で自動判定します
    -    return new AutoGltfFileParser(path).Parse();
    -}
    +    return new AutoGltfFileParser(path).Parse();
    +}
     
    @@ -408,31 +408,31 @@

    2. ロードする

    sync

    -
    RuntimeGltfInstance Load(GltfData data)
    -{
    +
    RuntimeGltfInstance Load(GltfData data)
    +{
         // ImporterContext は使用後に Dispose を呼び出してください。
         // using で自動的に呼び出すことができます。
    -    using(var loader = new UniGLTF.ImporterContext(data)
    -    {
    -        var instance = loader.Load();
    -        return instance;
    -    }
    -}
    +    using(var loader = new UniGLTF.ImporterContext(data)
    +    {
    +        var instance = loader.Load();
    +        return instance;
    +    }
    +}
     

    async

    -
    async RuntimeGltfInstance Load(GltfData data)
    -{
    +
    async RuntimeGltfInstance Load(GltfData data)
    +{
         // ImporterContext は使用後に Dispose を呼び出してください。
         // using で自動的に呼び出すことができます。
    -    using(var loader = new UniGLTF.ImporterContext(data)
    -    {
    -        var instance = await loader.LoadAsync();
    -        return instance;
    -    }
    -}
    +    using(var loader = new UniGLTF.ImporterContext(data)
    +    {
    +        var instance = await loader.LoadAsync();
    +        return instance;
    +    }
    +}
     
    @@ -444,13 +444,13 @@

    3. インスタンスを使用する

    // SkinnedMeshRenderer に対する指示
    -instance.EnableUpdateWhenOffscreen();
    +instance.EnableUpdateWhenOffscreen();
     // 準備ができたら表示する(デフォルトでは非表示)
    -instance.ShowMeshes();
    +instance.ShowMeshes();
     

    使用後に以下のように破棄してください。関連する Asset(Texture, Material, Meshなど)も破棄されます。

    -
    GameObject.Destroy(instance);
    +
    GameObject.Destroy(instance);
     
    diff --git a/ja/api/0_82_runtime_import.html b/ja/api/0_82_runtime_import.html index 934233efd..a14ce9f52 100644 --- a/ja/api/0_82_runtime_import.html +++ b/ja/api/0_82_runtime_import.html @@ -351,46 +351,46 @@

    サンプルの Assets\VRM\Samples\SimpleViewer\ViewerUI.cs も参照してください。

    1. GltfData を得る

    -
    GltfData Load(string path)
    -{
    -    return new GlbFileParser(path).Parse();
    -}
    +
    GltfData Load(string path)
    +{
    +    return new GlbFileParser(path).Parse();
    +}
     

    GLB import も参照してください。

    2. VRMData を得る

    -
    VRMData vrm = new VRMData(data);
    +
    VRMData vrm = new VRMData(data);
     

    3. Load する

    -
    async RuntimeGltfInstance Load(VRMData vrm)
    -{
    +
    async RuntimeGltfInstance Load(VRMData vrm)
    +{
         // 使用後に Dispose で VRMImporterContext を破棄してください。
    -    using(var loader = new VRMImporterContext(vrm))
    -    {
    -        var instance = await loader.LoadAsync();
    -        return instance;
    -    }
    -}
    +    using(var loader = new VRMImporterContext(vrm))
    +    {
    +        var instance = await loader.LoadAsync();
    +        return instance;
    +    }
    +}
     

    URP 向けに materialGenerator を指定する(実験)

    materialGenerator 引き数(省略可能)を指定することで URP マテリアルを生成するようにカスタムできます。 指定しない場合は built-in 向けのデフォルトが使用されます。

    -
    async RuntimeGltfInstance Load(VRMData vrm)
    -{
    -    var materialGenerator = new VRMUrpMaterialDescriptorGenerator(vrm.VrmExtension);
    -    using(var loader = new VRM.VRMImporterContext(vrm, materialGenerator: materialGenerator))
    -    {
    -        var instance = await loader.LoadAsync();
    -        return instance;
    -    }
    -}
    +
    async RuntimeGltfInstance Load(VRMData vrm)
    +{
    +    var materialGenerator = new VRMUrpMaterialDescriptorGenerator(vrm.VrmExtension);
    +    using(var loader = new VRM.VRMImporterContext(vrm, materialGenerator: materialGenerator))
    +    {
    +        var instance = await loader.LoadAsync();
    +        return instance;
    +    }
    +}
     
      @@ -401,16 +401,16 @@

      4. Instance

      // SkinnedMeshRenderer に対する指示
      -instance.EnableUpdateWhenOffscreen();
      +instance.EnableUpdateWhenOffscreen();
       // 準備ができたら表示する(デフォルトでは非表示)
      -instance.ShowMeshes();
      +instance.ShowMeshes();
       

      使用後に以下のように破棄してください。関連する Asset(Texture, Material, Meshなど)も破棄されます。

      // GameObject.Destroy(instance);
       
       // RuntimeGltfInstance ではなくて、その GameObject を Destroy します。
      -GameObject.Destroy(instance.gameObject);
      +GameObject.Destroy(instance.gameObject);
       
      diff --git a/ja/api/0_87_runtime_import.html b/ja/api/0_87_runtime_import.html index 7fbf261a2..5814747c1 100644 --- a/ja/api/0_87_runtime_import.html +++ b/ja/api/0_87_runtime_import.html @@ -343,35 +343,35 @@

      v0.87 RuntimeImport 非同期ロード

      awaitCaller 引き数

      -
      public virtual async Task<RuntimeGltfInstance> LoadAsync(IAwaitCaller awaitCaller = null, ...)
      +
      public virtual async Task<RuntimeGltfInstance> LoadAsync(IAwaitCaller awaitCaller = null, ...)
       

      awaitCaller によりロード時の挙動をカスタマイズできます。

      -
       1using System;
      - 2using System.Threading.Tasks;
      +
       1using System;
      + 2using System.Threading.Tasks;
        3
      - 4namespace VRMShaders
      - 5{
      + 4namespace VRMShaders
      + 5{
        6    /// <summary>
        7    /// ImporterContext の 非同期実行 LoadAsync を補助する。
        8    /// この関数を経由して await すること。
        9    /// そうしないと、同期実行 Load 時にデッドロックに陥るかもしれない。
       10    /// (SynchronizationContext に Post された 継続が再開されない)
       11    /// </summary>
      -12    public interface IAwaitCaller
      -13    {
      +12    public interface IAwaitCaller
      +13    {
       14        /// <summary>
       15        /// フレームレートを維持するために1フレーム待つ
       16        /// </summary>
       17        /// <returns></returns>
      -18        Task NextFrame();
      +18        Task NextFrame();
       19
       20        /// <summary>
       21        /// 非同期に実行して、終了を待つ
       22        /// </summary>
       23        /// <param name="action"></param>
       24        /// <returns></returns>
      -25        Task Run(Action action);
      +25        Task Run(Action action);
       26
       27        /// <summary>
       28        /// 非同期に実行して、終了を待つ
      @@ -379,15 +379,15 @@
       30        /// <param name="action"></param>
       31        /// <typeparam name="T"></typeparam>
       32        /// <returns></returns>
      -33        Task<T> Run<T>(Func<T> action);
      +33        Task<T> Run<T>(Func<T> action);
       34
       35        /// <summary>
       36        /// 指定した時間が経過している場合のみ、NextFrame() を使って1フレーム待つ
       37        /// </summary>
       38        /// <returns>タイムアウト時はNextFrame()を呼び出す。そうではない場合、Task.CompletedTaskを返す</returns>
      -39        Task NextFrameIfTimedOut();
      -40    }
      -41}
      +39        Task NextFrameIfTimedOut();
      +40    }
      +41}
       
        @@ -402,35 +402,35 @@
        • Play(Editor Play, build), Editor(not play), UnitTest でデッドロックしないための実装です。

        -
         1using System;
        - 2using System.Threading.Tasks;
        +
         1using System;
        + 2using System.Threading.Tasks;
          3
        - 4namespace VRMShaders
        - 5{
        + 4namespace VRMShaders
        + 5{
          6    /// <summary>
          7    /// 同期実行
          8    /// </summary>
        - 9    public sealed class ImmediateCaller : IAwaitCaller
        -10    {
        -11        public Task NextFrame()
        -12        {
        -13            return Task.FromResult<object>(null);
        -14        }
        + 9    public sealed class ImmediateCaller : IAwaitCaller
        +10    {
        +11        public Task NextFrame()
        +12        {
        +13            return Task.FromResult<object>(null);
        +14        }
         15
        -16        public Task Run(Action action)
        -17        {
        -18            action();
        -19            return Task.FromResult<object>(null);
        -20        }
        +16        public Task Run(Action action)
        +17        {
        +18            action();
        +19            return Task.FromResult<object>(null);
        +20        }
         21
        -22        public Task<T> Run<T>(Func<T> action)
        -23        {
        -24            return Task.FromResult(action());
        -25        }
        +22        public Task<T> Run<T>(Func<T> action)
        +23        {
        +24            return Task.FromResult(action());
        +25        }
         26
        -27        public Task NextFrameIfTimedOut() => NextFrame();
        -28    }
        -29}
        +27        public Task NextFrameIfTimedOut() => NextFrame();
        +28    }
        +29}
         
      @@ -440,67 +440,67 @@
    • Play(Editor Play, build) 時に非同期実行する実装です

    • VRM10_Samples/VRM10Viewer に使用例があります。

    -
     1using System;
    - 2using System.Threading.Tasks;
    +
     1using System;
    + 2using System.Threading.Tasks;
      3
    - 4namespace VRMShaders
    - 5{
    + 4namespace VRMShaders
    + 5{
      6    /// <summary>
      7    /// Runtime (Build 後と、Editor Playing) での非同期ロードを実現する AwaitCaller.
      8    /// NOTE: 簡便に実装されたものなので、最適化の余地はある.
      9    /// </summary>
    -10    public sealed class RuntimeOnlyAwaitCaller : IAwaitCaller
    -11    {
    -12        private readonly NextFrameTaskScheduler _scheduler;
    -13        private readonly float                  _timeOutInSeconds;
    -14        private          float                  _lastTimeoutBaseTime;
    +10    public sealed class RuntimeOnlyAwaitCaller : IAwaitCaller
    +11    {
    +12        private readonly NextFrameTaskScheduler _scheduler;
    +13        private readonly float                  _timeOutInSeconds;
    +14        private          float                  _lastTimeoutBaseTime;
     15
     16        /// <summary>
     17        /// タイムアウト指定可能なコンストラクタ
     18        /// </summary>
     19        /// <param name="timeOutInSeconds">NextFrameIfTimedOutがタイムアウトと見なす時間(秒単位)</param>
    -20        public RuntimeOnlyAwaitCaller(float timeOutInSeconds = 1f / 1000f)
    -21        {
    -22            _scheduler = new NextFrameTaskScheduler();
    -23            _timeOutInSeconds = timeOutInSeconds;
    -24            ResetLastTimeoutBaseTime();
    -25        }
    +20        public RuntimeOnlyAwaitCaller(float timeOutInSeconds = 1f / 1000f)
    +21        {
    +22            _scheduler = new NextFrameTaskScheduler();
    +23            _timeOutInSeconds = timeOutInSeconds;
    +24            ResetLastTimeoutBaseTime();
    +25        }
     26
    -27        public Task NextFrame()
    -28        {
    -29            ResetLastTimeoutBaseTime();
    -30            var tcs = new TaskCompletionSource<object>();
    -31            _scheduler.Enqueue(() => tcs.SetResult(default));
    -32            return tcs.Task;
    -33        }
    +27        public Task NextFrame()
    +28        {
    +29            ResetLastTimeoutBaseTime();
    +30            var tcs = new TaskCompletionSource<object>();
    +31            _scheduler.Enqueue(() => tcs.SetResult(default));
    +32            return tcs.Task;
    +33        }
     34
    -35        public Task Run(Action action)
    -36        {
    -37            return Task.Run(action);
    -38        }
    +35        public Task Run(Action action)
    +36        {
    +37            return Task.Run(action);
    +38        }
     39
    -40        public Task<T> Run<T>(Func<T> action)
    -41        {
    -42            return Task.Run(action);
    -43        }
    +40        public Task<T> Run<T>(Func<T> action)
    +41        {
    +42            return Task.Run(action);
    +43        }
     44
    -45        public Task NextFrameIfTimedOut() => CheckTimeout() ? NextFrame() : Task.CompletedTask;
    +45        public Task NextFrameIfTimedOut() => CheckTimeout() ? NextFrame() : Task.CompletedTask;
     46
    -47        private void ResetLastTimeoutBaseTime() => _lastTimeoutBaseTime = 0f;
    +47        private void ResetLastTimeoutBaseTime() => _lastTimeoutBaseTime = 0f;
     48
    -49        private bool LastTimeoutBaseTimeNeedsReset => _lastTimeoutBaseTime == 0f;
    +49        private bool LastTimeoutBaseTimeNeedsReset => _lastTimeoutBaseTime == 0f;
     50
    -51        private bool CheckTimeout()
    -52        {
    -53            float t = UnityEngine.Time.realtimeSinceStartup;
    -54            if (LastTimeoutBaseTimeNeedsReset)
    -55            {
    -56                _lastTimeoutBaseTime = t;
    -57            }
    -58            return (t - _lastTimeoutBaseTime) >= _timeOutInSeconds;
    -59        }
    -60    }
    -61}
    +51        private bool CheckTimeout()
    +52        {
    +53            float t = UnityEngine.Time.realtimeSinceStartup;
    +54            if (LastTimeoutBaseTimeNeedsReset)
    +55            {
    +56                _lastTimeoutBaseTime = t;
    +57            }
    +58            return (t - _lastTimeoutBaseTime) >= _timeOutInSeconds;
    +59        }
    +60    }
    +61}
     
    diff --git a/ja/api/0_95_dispose.html b/ja/api/0_95_dispose.html index 0c52e8a9b..b217476f2 100644 --- a/ja/api/0_95_dispose.html +++ b/ja/api/0_95_dispose.html @@ -344,17 +344,17 @@

    Importer の内部で NativeArray を使うようにしたため、 終了時にこれを破棄する必要ができました。 使い終わったら Dispose してください。

    -
    class GltfData: IDisposable
    +
    class GltfData: IDisposable
     

    使用例

    // must dispose GltfData
    -using (GltfData data = new AutoGltfFileParser(path).Parse())
    -using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: materialGenerator))
    -{
    -    return await loader.LoadAsync(awaitCaller);
    -}
    +using (GltfData data = new AutoGltfFileParser(path).Parse())
    +using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: materialGenerator))
    +{
    +    return await loader.LoadAsync(awaitCaller);
    +}
     
    diff --git a/ja/api/0_95_highlevel.html b/ja/api/0_95_highlevel.html index edf0910f1..347619774 100644 --- a/ja/api/0_95_highlevel.html +++ b/ja/api/0_95_highlevel.html @@ -345,93 +345,93 @@ GltfUtilityVrmUtility が中で using してくれるので await で呼び出すだけで使えます。

    GLTF

    -
     1using System.IO;
    - 2using System.Threading.Tasks;
    - 3using UnityEngine;
    - 4using VRMShaders;
    +
     1using System.IO;
    + 2using System.Threading.Tasks;
    + 3using UnityEngine;
    + 4using VRMShaders;
      5
    - 6namespace UniGLTF
    - 7{
    - 8    public static class GltfUtility
    - 9    {
    -10        public static async Task<RuntimeGltfInstance> LoadAsync(string path, IAwaitCaller awaitCaller = null, IMaterialDescriptorGenerator materialGenerator = null)
    -11        {
    -12            if (!File.Exists(path))
    -13            {
    -14                throw new FileNotFoundException(path);
    -15            }
    + 6namespace UniGLTF
    + 7{
    + 8    public static class GltfUtility
    + 9    {
    +10        public static async Task<RuntimeGltfInstance> LoadAsync(string path, IAwaitCaller awaitCaller = null, IMaterialDescriptorGenerator materialGenerator = null)
    +11        {
    +12            if (!File.Exists(path))
    +13            {
    +14                throw new FileNotFoundException(path);
    +15            }
     16
    -17            Debug.LogFormat("{0}", path);
    -18            using (GltfData data = new AutoGltfFileParser(path).Parse())
    -19            using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: materialGenerator))
    -20            {
    -21                return await loader.LoadAsync(awaitCaller);
    -22            }
    -23        }
    -24    }
    -25}
    +17            Debug.LogFormat("{0}", path);
    +18            using (GltfData data = new AutoGltfFileParser(path).Parse())
    +19            using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: materialGenerator))
    +20            {
    +21                return await loader.LoadAsync(awaitCaller);
    +22            }
    +23        }
    +24    }
    +25}
     

    VRM

    -
     1using System;
    - 2using System.IO;
    - 3using System.Threading.Tasks;
    - 4using UniGLTF;
    - 5using UnityEngine;
    - 6using VRMShaders;
    +
     1using System;
    + 2using System.IO;
    + 3using System.Threading.Tasks;
    + 4using UniGLTF;
    + 5using UnityEngine;
    + 6using VRMShaders;
      7
    - 8namespace VRM
    - 9{
    -10    public static class VrmUtility
    -11    {
    -12        public delegate IMaterialDescriptorGenerator MaterialGeneratorCallback(VRM.glTF_VRM_extensions vrm);
    -13        public delegate void MetaCallback(VRMMetaObject meta);
    -14        public static async Task<RuntimeGltfInstance> LoadAsync(string path,
    -15            IAwaitCaller awaitCaller = null,
    -16            MaterialGeneratorCallback materialGeneratorCallback = null,
    -17            MetaCallback metaCallback = null
    -18            )
    -19        {
    -20            if (!File.Exists(path))
    -21            {
    -22                throw new FileNotFoundException(path);
    -23            }
    + 8namespace VRM
    + 9{
    +10    public static class VrmUtility
    +11    {
    +12        public delegate IMaterialDescriptorGenerator MaterialGeneratorCallback(VRM.glTF_VRM_extensions vrm);
    +13        public delegate void MetaCallback(VRMMetaObject meta);
    +14        public static async Task<RuntimeGltfInstance> LoadAsync(string path,
    +15            IAwaitCaller awaitCaller = null,
    +16            MaterialGeneratorCallback materialGeneratorCallback = null,
    +17            MetaCallback metaCallback = null
    +18            )
    +19        {
    +20            if (!File.Exists(path))
    +21            {
    +22                throw new FileNotFoundException(path);
    +23            }
     24
    -25            using (GltfData data = new AutoGltfFileParser(path).Parse())
    -26            {
    -27                try
    -28                {
    -29                    var vrm = new VRMData(data);
    -30                    IMaterialDescriptorGenerator materialGen = default;
    -31                    if (materialGeneratorCallback != null)
    -32                    {
    -33                        materialGen = materialGeneratorCallback(vrm.VrmExtension);
    -34                    }
    -35                    using (var loader = new VRMImporterContext(vrm, materialGenerator: materialGen))
    -36                    {
    -37                        if (metaCallback != null)
    -38                        {
    -39                            var meta = await loader.ReadMetaAsync(new ImmediateCaller(), true);
    -40                            metaCallback(meta);
    -41                        }
    -42                        return await loader.LoadAsync(awaitCaller);
    -43                    }
    -44                }
    -45                catch (NotVrm0Exception)
    -46                {
    +25            using (GltfData data = new AutoGltfFileParser(path).Parse())
    +26            {
    +27                try
    +28                {
    +29                    var vrm = new VRMData(data);
    +30                    IMaterialDescriptorGenerator materialGen = default;
    +31                    if (materialGeneratorCallback != null)
    +32                    {
    +33                        materialGen = materialGeneratorCallback(vrm.VrmExtension);
    +34                    }
    +35                    using (var loader = new VRMImporterContext(vrm, materialGenerator: materialGen))
    +36                    {
    +37                        if (metaCallback != null)
    +38                        {
    +39                            var meta = await loader.ReadMetaAsync(new ImmediateCaller(), true);
    +40                            metaCallback(meta);
    +41                        }
    +42                        return await loader.LoadAsync(awaitCaller);
    +43                    }
    +44                }
    +45                catch (NotVrm0Exception)
    +46                {
     47                    // retry
    -48                    Debug.LogWarning("file extension is vrm. but not vrm ?");
    -49                    using (var loader = new UniGLTF.ImporterContext(data))
    -50                    {
    -51                        return await loader.LoadAsync(awaitCaller);
    -52                    }
    -53                }
    -54            }
    -55        }
    -56    }
    -57}
    +48                    Debug.LogWarning("file extension is vrm. but not vrm ?");
    +49                    using (var loader = new UniGLTF.ImporterContext(data))
    +50                    {
    +51                        return await loader.LoadAsync(awaitCaller);
    +52                    }
    +53                }
    +54            }
    +55        }
    +56    }
    +57}
     
    @@ -439,29 +439,29 @@

    使用例

    v0.95.0 Assets/VRM_Samples/SimpleViewer/ViewerUI.cs
    -
     1        async void LoadModelAsync(string path)
    - 2        {
    - 3            var ext = Path.GetExtension(path).ToLower();
    - 4            switch (ext)
    - 5            {
    - 6                case ".gltf":
    - 7                case ".glb":
    - 8                case ".zip":
    - 9                    {
    -10                        var instance = await GltfUtility.LoadAsync(path,
    -11                            GetIAwaitCaller(m_useAsync.isOn),
    -12                            GetGltfMaterialGenerator(m_useUrpMaterial.isOn));
    -13                        break;
    -14                    }
    +
     1        async void LoadModelAsync(string path)
    + 2        {
    + 3            var ext = Path.GetExtension(path).ToLower();
    + 4            switch (ext)
    + 5            {
    + 6                case ".gltf":
    + 7                case ".glb":
    + 8                case ".zip":
    + 9                    {
    +10                        var instance = await GltfUtility.LoadAsync(path,
    +11                            GetIAwaitCaller(m_useAsync.isOn),
    +12                            GetGltfMaterialGenerator(m_useUrpMaterial.isOn));
    +13                        break;
    +14                    }
     15
    -16                case ".vrm":
    -17                    {
    -18                        VrmUtility.MaterialGeneratorCallback materialCallback = (VRM.glTF_VRM_extensions vrm) => GetVrmMaterialGenerator(m_useUrpMaterial.isOn, vrm);
    -19                        VrmUtility.MetaCallback metaCallback = m_texts.UpdateMeta;
    -20                        var instance = await VrmUtility.LoadAsync(path, GetIAwaitCaller(m_useAsync.isOn), materialCallback, metaCallback);
    -21                        SetModel(instance);
    -22                        break;
    -23                    }
    +16                case ".vrm":
    +17                    {
    +18                        VrmUtility.MaterialGeneratorCallback materialCallback = (VRM.glTF_VRM_extensions vrm) => GetVrmMaterialGenerator(m_useUrpMaterial.isOn, vrm);
    +19                        VrmUtility.MetaCallback metaCallback = m_texts.UpdateMeta;
    +20                        var instance = await VrmUtility.LoadAsync(path, GetIAwaitCaller(m_useAsync.isOn), materialCallback, metaCallback);
    +21                        SetModel(instance);
    +22                        break;
    +23                    }
     
    diff --git a/ja/api/fast_spring_bone.html b/ja/api/fast_spring_bone.html index 0f9c56b10..7276787e8 100644 --- a/ja/api/fast_spring_bone.html +++ b/ja/api/fast_spring_bone.html @@ -361,15 +361,15 @@

    VRM 0.x での FastSpringBone の導入方法

    差し替えを行いたいタイミングで FastSpringBoneReplacer.ReplaceAsync を呼び出してください

    これを明示的に呼ばなければ、従来のSpringBoneのまま動作します。

    -
    using (var loader = new UniGLTF.ImporterContext(data))
    -{
    -    var instance = await loader.LoadAsync();
    -    SetModel(instance);
    -}
    -FastSpringBoneReplacer.ReplaceAsync(instance.Root)
    +
    using (var loader = new UniGLTF.ImporterContext(data))
    +{
    +    var instance = await loader.LoadAsync();
    +    SetModel(instance);
    +}
    +FastSpringBoneReplacer.ReplaceAsync(instance.Root)
     
    -instance.EnableUpdateWhenOffscreen();
    -instance.ShowMeshes();
    +instance.EnableUpdateWhenOffscreen();
    +instance.ShowMeshes();
     
    diff --git a/ja/api/firstperson.html b/ja/api/firstperson.html index ef4cec4e5..d060e66c6 100644 --- a/ja/api/firstperson.html +++ b/ja/api/firstperson.html @@ -347,13 +347,13 @@

    アプリケーションに追加の描画レイヤーを指定する

    定数で以下のレイヤーを定義しています。

    -
    public class VRMFirstPerson : MonoBehaviour
    -{
    -    public const int FIRSTPERSON_ONLY_LAYER = 9;
    -    public const int THIRDPERSON_ONLY_LAYER = 10;
    +
    public class VRMFirstPerson : MonoBehaviour
    +{
    +    public const int FIRSTPERSON_ONLY_LAYER = 9;
    +    public const int THIRDPERSON_ONLY_LAYER = 10;
     
         // 省略
    -}
    +}
     
    @@ -373,47 +373,47 @@
  • VRMFirstPerson.Setupの呼び出し

  • 一人称カメラとその他のカメラに対してLayerMask

  • -
    using System.Collections;
    -using System.Collections.Generic;
    -using UnityEngine;
    -using VRM;
    +
    using System.Collections;
    +using System.Collections.Generic;
    +using UnityEngine;
    +using VRM;
     
    -public class SetupExample : MonoBehaviour
    -{
    -    [SerializeField]
    +public class SetupExample : MonoBehaviour
    +{
    +    [SerializeField]
         Camera m_firstPersonCamera; // HMDのカメラ
     
    -    [SerializeField]
    +    [SerializeField]
         LayerMask m_firstPersonMask; // HMDのカメラにセットするマスク default | VRMFirstPersonOnly など
     
    -    [SerializeField]
    +    [SerializeField]
         LayerMask m_otherMask; // HMDのカメラにセットするマスク default | VRMThirdPersonOnly など
     
    -    [SerializeField]
    -    VRMFirstPerson m_firstPerson;
    +    [SerializeField]
    +    VRMFirstPerson m_firstPerson;
     
    -    void Reset()
    -    {
    -        m_firstPerson = GameObject.FindObjectOfType<VRMFirstPerson>();
    -    }
    +    void Reset()
    +    {
    +        m_firstPerson = GameObject.FindObjectOfType<VRMFirstPerson>();
    +    }
     
    -    void Start()
    -    {
    -        foreach (var camera in GameObject.FindObjectsOfType<Camera>())
    -        {
    -            camera.cullingMask = (camera == m_firstPersonCamera)
    -                ? m_firstPersonMask
    -                : m_otherMask
    -                ;
    -        }
    +    void Start()
    +    {
    +        foreach (var camera in GameObject.FindObjectsOfType<Camera>())
    +        {
    +            camera.cullingMask = (camera == m_firstPersonCamera)
    +                ? m_firstPersonMask
    +                : m_otherMask
    +                ;
    +        }
     
             // VRMFirstPersonの初期化
    -        if (m_firstPerson != null)
    -        {
    -            m_firstPerson.Setup();
    -        }
    -    }
    -}
    +        if (m_firstPerson != null)
    +        {
    +            m_firstPerson.Setup();
    +        }
    +    }
    +}
     
    diff --git a/ja/api/how_to_customize_material_import.html b/ja/api/how_to_customize_material_import.html index 913373846..d86cd7ad4 100644 --- a/ja/api/how_to_customize_material_import.html +++ b/ja/api/how_to_customize_material_import.html @@ -346,15 +346,15 @@

    materialGenerator で URP 用のマテリアルをロードする

    URP マテリアルを生成するようにカスタムする例です。

    https://github.com/vrm-c/UniVRM/issues/1214

    -
    async RuntimeGltfInstance Load(GltfData data)
    -{
    -    IMaterialDescriptorGenerator materialGenerator = new GltfUrpMaterialDescriptorGenerator();
    -    using(var loader = new UniGLTF.ImporterContext(data, materialGenerator: materialGenerator)
    -    {
    -        var instance = await loader.LoadAsync();
    -        return instance;
    -    }
    -}
    +
    async RuntimeGltfInstance Load(GltfData data)
    +{
    +    IMaterialDescriptorGenerator materialGenerator = new GltfUrpMaterialDescriptorGenerator();
    +    using(var loader = new UniGLTF.ImporterContext(data, materialGenerator: materialGenerator)
    +    {
    +        var instance = await loader.LoadAsync();
    +        return instance;
    +    }
    +}
     
    diff --git a/ja/api/how_to_impl_extension.html b/ja/api/how_to_impl_extension.html index 573903038..7ea652a48 100644 --- a/ja/api/how_to_impl_extension.html +++ b/ja/api/how_to_impl_extension.html @@ -366,21 +366,21 @@

    UniGLTF の extensions

    v0.63.0 以前は、GLTF extensions フィールドに、GLTFExtensions 型を定義して、VRM フィールドを定義するという方法をとっていました。

    -
    class VRM
    -{
    +
    class VRM
    +{
     
    -}
    +}
     
    -class GLTFExtensions
    -{
    -    public VRM VRM;
    -}
    +class GLTFExtensions
    +{
    +    public VRM VRM;
    +}
     
    -class GLTF
    -{
    +class GLTF
    +{
         // すべての拡張の型をコンパイル時に知っている必要がある。動的に拡張できない
    -    public GLTFExtensions extensions;
    -}
    +    public GLTFExtensions extensions;
    +}
     

    この設計だと GLTF と拡張を別ライブラリとして分離することができませんでした。

    @@ -388,16 +388,16 @@ UniGLTF は import/export の具体的な内容を知らずに中間データの入れ物として扱います。

    // extensions / extras の入れ物として使う型
     // 実行時は、 glTFExtensionImport / glTFExtensionExport を使う
    -public abstract class glTFExtension
    -{
    +public abstract class glTFExtension
    +{
     
    -}
    +}
     
    -class GLTF
    -{
    +class GLTF
    +{
         // UniGLTFは具体的な型を知らない。利用側が処理(serialize/deserialize)する
    -    public glTFExtension extensions;
    -}
    +    public glTFExtension extensions;
    +}
     
    @@ -413,82 +413,82 @@ UniGLTF は import/

    JSONPATH と 型を決める

    // 型
    -class GoodMaterial
    -{
    +class GoodMaterial
    +{
         // `materials[*].extensions.CUSTOM_materials_good`
    -    public const string EXTENSION_NAME = "CUSTOM_materials_good";
    +    public const string EXTENSION_NAME = "CUSTOM_materials_good";
     
    -    public int GoodValue;
    -}
    +    public int GoodValue;
    +}
     

    import

    -
    GoodMaterial DeserializeGoodMaterial(ListTreeNode<JsonValue> json)
    -{
    +
    GoodMaterial DeserializeGoodMaterial(ListTreeNode<JsonValue> json)
    +{
         // デシリアライズ。手で書くかコード生成する(後述)
    -}
    +}
     
     // ユーティリティ関数例
    -bool TryGetExtension<T>(UniGLTF.glTFExtension extension, string key, Func<ListTreeNode<JsonValue>, T> deserializer, out T value)
    -{
    -    if(material.extensions is UniGLTF.glTFExtensionsImport import)
    -    {
    +bool TryGetExtension<T>(UniGLTF.glTFExtension extension, string key, Func<ListTreeNode<JsonValue>, T> deserializer, out T value)
    +{
    +    if(material.extensions is UniGLTF.glTFExtensionsImport import)
    +    {
             // null check 完了
    -        foreach(var kv in import.ObjectItems())
    -        {
    -            if(kv.key.GetString()==key)
    -            {
    -                value = Deserialize(kv.Value);
    -                return true;
    -            }
    -        }
    -    }
    +        foreach(var kv in import.ObjectItems())
    +        {
    +            if(kv.key.GetString()==key)
    +            {
    +                value = Deserialize(kv.Value);
    +                return true;
    +            }
    +        }
    +    }
     
    -    value = default;
    -    return false;
    -}
    +    value = default;
    +    return false;
    +}
     
    -void ImportMaterial(UniGLTF.glTFMaterial material)
    -{
    +void ImportMaterial(UniGLTF.glTFMaterial material)
    +{
         // material の処理に割り込んで
    -    if(TryGetExtension(material.extension, GoodMaterial.EXTENSION_NAME, DeserializeGoodMaterial, out GoodMaterial good))
    -    {
    +    if(TryGetExtension(material.extension, GoodMaterial.EXTENSION_NAME, DeserializeGoodMaterial, out GoodMaterial good))
    +    {
             // good material 独自の処理
    -    }
    -}
    +    }
    +}
     

    export

    -
    void SerializeGoodMaterial(UniJSON.JsonFormatter f, GoodMaterial value)
    -{
    +
    void SerializeGoodMaterial(UniJSON.JsonFormatter f, GoodMaterial value)
    +{
         // シリアライズ。手で書くかコード生成する(後述)
    -}
    +}
     
     // ユーティリティ関数例
    -public ArraySegment<byte> SerializeExtension<T>(T value, Func<T, ArraySegment<byte>> serialize)
    -{
    -    var f = new UniJSON.JsonFormatter();
    -    serialize(f, value);
    -    return f.GetStoreBytes();
    -}
    +public ArraySegment<byte> SerializeExtension<T>(T value, Func<T, ArraySegment<byte>> serialize)
    +{
    +    var f = new UniJSON.JsonFormatter();
    +    serialize(f, value);
    +    return f.GetStoreBytes();
    +}
     
    -void ExportGoodMaterial(UniGLTF.glTFMaterial material, GoodMaterial good)
    -{
    +void ExportGoodMaterial(UniGLTF.glTFMaterial material, GoodMaterial good)
    +{
         // material の処理に割り込んで
    -    if(!(material.extensions is UniGLTF.glTFExtensionsExport export))
    -    {
    +    if(!(material.extensions is UniGLTF.glTFExtensionsExport export))
    +    {
             // 無かった。新規作成
    -        export = new UniGLTF.glTFExtensionsExport();
    -        material.extensions = export;
    -    }
    +        export = new UniGLTF.glTFExtensionsExport();
    +        material.extensions = export;
    +    }
     
    -    var bytes = SerializeExtension(good, SerializeGoodMaterial);
    -    export.Add(GoodMaterial.EXTENSION_NAME, bytes);
    -}
    +    var bytes = SerializeExtension(good, SerializeGoodMaterial);
    +    export.Add(GoodMaterial.EXTENSION_NAME, bytes);
    +}
     
    @@ -619,22 +619,22 @@ C# の型から生成するものと、JsonSchema から C# の型とともに
    • Assets\UniGLTF\Editor\UniGLTF\Serialization\SerializerGenerator.cs

    -
    using System;
    -using System.Collections.Generic;
    -using System.IO;
    -using System.Reflection;
    -using System.Text;
    -using UniJSON;
    -using UnityEditor;
    -using UnityEngine;
    +
    using System;
    +using System.Collections.Generic;
    +using System.IO;
    +using System.Reflection;
    +using System.Text;
    +using UniJSON;
    +using UnityEditor;
    +using UnityEngine;
     
    -namespace UniGLTF
    -{
    -    public static class SerializerGenerator
    -    {
    -        const BindingFlags FIELD_FLAGS = BindingFlags.Instance | BindingFlags.Public;
    +namespace UniGLTF
    +{
    +    public static class SerializerGenerator
    +    {
    +        const BindingFlags FIELD_FLAGS = BindingFlags.Instance | BindingFlags.Public;
     
    -        const string Begin = @"// Don't edit manually. This is generaged. 
    +        const string Begin = @"// Don't edit manually. This is generaged. 
     using System;
     using System.Collections.Generic;
     using UniJSON;
    @@ -644,41 +644,41 @@ C# の型から生成するものと、JsonSchema から C# の型とともに
         static public class GltfSerializer
         {
     
    -";
    +";
     
    -        const string End = @"
    +        const string End = @"
         } // class
     } // namespace
    -";
    +";
     
    -        static string OutPath
    -        {
    -            get
    -            {
    -                return Path.Combine(UnityEngine.Application.dataPath,
    -                "UniGLTF/UniGLTF/Scripts/IO/GltfSerializer.g.cs");
    -            }
    -        }
    +        static string OutPath
    +        {
    +            get
    +            {
    +                return Path.Combine(UnityEngine.Application.dataPath,
    +                "UniGLTF/UniGLTF/Scripts/IO/GltfSerializer.g.cs");
    +            }
    +        }
     
    -        [MenuItem(UniGLTFVersion.MENU + "/GLTF: Generate Serializer")]
    -        static void GenerateSerializer()
    -        {
    -            var info = new ObjectSerialization(typeof(glTF), "gltf", "Serialize_");
    -            Debug.Log(info);
    +        [MenuItem(UniGLTFVersion.MENU + "/GLTF: Generate Serializer")]
    +        static void GenerateSerializer()
    +        {
    +            var info = new ObjectSerialization(typeof(glTF), "gltf", "Serialize_");
    +            Debug.Log(info);
     
    -            using (var s = File.Open(OutPath, FileMode.Create))
    -            using (var w = new StreamWriter(s, new UTF8Encoding(false)))
    -            {
    -                w.Write(Begin);
    -                info.GenerateSerializer(w, "Serialize");
    -                w.Write(End);
    -            }
    +            using (var s = File.Open(OutPath, FileMode.Create))
    +            using (var w = new StreamWriter(s, new UTF8Encoding(false)))
    +            {
    +                w.Write(Begin);
    +                info.GenerateSerializer(w, "Serialize");
    +                w.Write(End);
    +            }
     
    -            Debug.LogFormat("write: {0}", OutPath);
    -            UnityPath.FromFullpath(OutPath).ImportAsset();
    -        }
    -    }
    -}
    +            Debug.LogFormat("write: {0}", OutPath);
    +            UnityPath.FromFullpath(OutPath).ImportAsset();
    +        }
    +    }
    +}
     
    @@ -694,22 +694,22 @@ C# の型から生成するものと、JsonSchema から C# の型とともに
    • Assets\UniGLTF\Editor\UniGLTF\Serialization\DeserializerGenerator.cs

    -
    using System.IO;
    -using System.Reflection;
    -using System.Text;
    -using UnityEditor;
    -using UnityEngine;
    +
    using System.IO;
    +using System.Reflection;
    +using System.Text;
    +using UnityEditor;
    +using UnityEngine;
     
    -namespace UniGLTF
    -{
    +namespace UniGLTF
    +{
         /// <summary>
         /// Generate deserializer from ListTreeNode<JsonValue> to glTF using type reflection
         /// </summary>
    -    public static class DeserializerGenerator
    -    {
    -        public const BindingFlags FIELD_FLAGS = BindingFlags.Instance | BindingFlags.Public;
    +    public static class DeserializerGenerator
    +    {
    +        public const BindingFlags FIELD_FLAGS = BindingFlags.Instance | BindingFlags.Public;
     
    -        const string Begin = @"// Don't edit manually. This is generaged. 
    +        const string Begin = @"// Don't edit manually. This is generaged. 
     using UniJSON;
     using System;
     using System.Collections.Generic;
    @@ -720,41 +720,41 @@ C# の型から生成するものと、JsonSchema から C# の型とともに
     public static class GltfDeserializer
     {
     
    -";
    +";
     
    -        const string End = @"
    +        const string End = @"
     } // GltfDeserializer
     } // UniGLTF 
    -";
    +";
     
    -        static string OutPath
    -        {
    -            get
    -            {
    -                return Path.Combine(UnityEngine.Application.dataPath,
    -                "UniGLTF/UniGLTF/Scripts/IO/GltfDeserializer.g.cs");
    -            }
    -        }
    +        static string OutPath
    +        {
    +            get
    +            {
    +                return Path.Combine(UnityEngine.Application.dataPath,
    +                "UniGLTF/UniGLTF/Scripts/IO/GltfDeserializer.g.cs");
    +            }
    +        }
     
    -        [MenuItem(UniGLTFVersion.MENU + "/GLTF: Generate Deserializer")]
    -        static void GenerateSerializer()
    -        {
    -            var info = new ObjectSerialization(typeof(glTF), "gltf", "Deserialize_");
    -            Debug.Log(info);
    +        [MenuItem(UniGLTFVersion.MENU + "/GLTF: Generate Deserializer")]
    +        static void GenerateSerializer()
    +        {
    +            var info = new ObjectSerialization(typeof(glTF), "gltf", "Deserialize_");
    +            Debug.Log(info);
     
    -            using (var s = File.Open(OutPath, FileMode.Create))
    -            using (var w = new StreamWriter(s, new UTF8Encoding(false)))
    -            {
    -                w.Write(Begin);
    -                info.GenerateDeserializer(w, "Deserialize");
    -                w.Write(End);
    -            }
    +            using (var s = File.Open(OutPath, FileMode.Create))
    +            using (var w = new StreamWriter(s, new UTF8Encoding(false)))
    +            {
    +                w.Write(Begin);
    +                info.GenerateDeserializer(w, "Deserialize");
    +                w.Write(End);
    +            }
     
    -            Debug.LogFormat("write: {0}", OutPath);
    -            UnityPath.FromFullpath(OutPath).ImportAsset();
    -        }
    -    }
    -}
    +            Debug.LogFormat("write: {0}", OutPath);
    +            UnityPath.FromFullpath(OutPath).ImportAsset();
    +        }
    +    }
    +}
     
    @@ -762,18 +762,18 @@ C# の型から生成するものと、JsonSchema から C# の型とともに

    キー出力の抑制

    index に無効な値として -1 を入れる場合に、JSONではキーを出力しないとしたいことがあります。

    TODO: int? にするべきだった

    -
    [JsonSchema(Minimum = 0)]
    -int index = -1;
    +
    [JsonSchema(Minimum = 0)]
    +int index = -1;
     

    のようにすることで、キーの出力を抑制できます。

        // 生成コードのキー出力例
    -    if(value.index>=0){
    +    if(value.index>=0){
     

    何も付けないと

        // 出力制御無し
    -    if(true){
    +    if(true){
     
    @@ -781,11 +781,11 @@ C# の型から生成するものと、JsonSchema から C# の型とともに

    enum のエンコーディング

    enumの値の名前を文字列で使う、enumの値の数値を使うの2種類がありえます。 enumの場合はデフォルト値が無いので必須です。

    -
    [JsonSchema(EnumSerializationType = EnumSerializationType.AsInt)]
    -public glBufferTarget target;
    +
    [JsonSchema(EnumSerializationType = EnumSerializationType.AsInt)]
    +public glBufferTarget target;
     
    -[JsonSchema(EnumSerializationType = EnumSerializationType.AsLowerString)]
    -public ProjectionType type;
    +[JsonSchema(EnumSerializationType = EnumSerializationType.AsLowerString)]
    +public ProjectionType type;
     
    diff --git a/ja/api/sample/FirstPersonSample.html b/ja/api/sample/FirstPersonSample.html index 501d8b844..a5b825d5f 100644 --- a/ja/api/sample/FirstPersonSample.html +++ b/ja/api/sample/FirstPersonSample.html @@ -350,29 +350,29 @@

    の描画を例示します。

    v0.87.0 Assets/VRM_Samples/FirstPersonSample/VRMRuntimeLoader.cs
    -
     1        void SetupTarget()
    - 2        {
    - 3            if (m_target != null)
    - 4            {
    - 5                m_target.Source = m_source;
    - 6                m_target.SourceType = UniHumanoid.HumanPoseTransfer.HumanPoseTransferSourceType.HumanPoseTransfer;
    +
     1        void SetupTarget()
    + 2        {
    + 3            if (m_target != null)
    + 4            {
    + 5                m_target.Source = m_source;
    + 6                m_target.SourceType = UniHumanoid.HumanPoseTransfer.HumanPoseTransferSourceType.HumanPoseTransfer;
      7
    - 8                m_blendShape = m_target.GetComponent<VRMBlendShapeProxy>();
    + 8                m_blendShape = m_target.GetComponent<VRMBlendShapeProxy>();
      9
    -10                m_firstPerson = m_target.GetComponent<VRMFirstPerson>();
    +10                m_firstPerson = m_target.GetComponent<VRMFirstPerson>();
     11
    -12                var animator = m_target.GetComponent<Animator>();
    -13                if (animator != null)
    -14                {
    -15                    m_firstPerson.Setup();
    +12                var animator = m_target.GetComponent<Animator>();
    +13                if (animator != null)
    +14                {
    +15                    m_firstPerson.Setup();
     16
    -17                    if (m_faceCamera != null)
    -18                    {
    -19                        m_faceCamera.Target = animator.GetBoneTransform(HumanBodyBones.Head);
    -20                    }
    -21                }
    -22            }
    -23        }
    +17                    if (m_faceCamera != null)
    +18                    {
    +19                        m_faceCamera.Target = animator.GetBoneTransform(HumanBodyBones.Head);
    +20                    }
    +21                }
    +22            }
    +23        }
     
    diff --git a/ja/api/sample/RuntimeExporterSample.html b/ja/api/sample/RuntimeExporterSample.html index 02c249b73..ca0403449 100644 --- a/ja/api/sample/RuntimeExporterSample.html +++ b/ja/api/sample/RuntimeExporterSample.html @@ -344,28 +344,28 @@

    VRM を Runtime Export するサンプルです。

    v0.87.0 Assets/VRM_Samples/RuntimeExporterSample/VRMRuntimeExporter.cs
    -
     1        static byte[] ExportSimple(GameObject model)
    - 2        {
    - 3            var vrm = VRMExporter.Export(new UniGLTF.GltfExportSettings(), model, new RuntimeTextureSerializer());
    - 4            var bytes = vrm.ToGlbBytes();
    - 5            return bytes;
    - 6        }
    +
     1        static byte[] ExportSimple(GameObject model)
    + 2        {
    + 3            var vrm = VRMExporter.Export(new UniGLTF.GltfExportSettings(), model, new RuntimeTextureSerializer());
    + 4            var bytes = vrm.ToGlbBytes();
    + 5            return bytes;
    + 6        }
      7
    - 8        static byte[] ExportCustom(GameObject exportRoot, bool forceTPose = false)
    - 9        {
    + 8        static byte[] ExportCustom(GameObject exportRoot, bool forceTPose = false)
    + 9        {
     10            // normalize
    -11            var target = VRMBoneNormalizer.Execute(exportRoot, forceTPose);
    +11            var target = VRMBoneNormalizer.Execute(exportRoot, forceTPose);
     12
    -13            try
    -14            {
    -15                return ExportSimple(target);
    -16            }
    -17            finally
    -18            {
    +13            try
    +14            {
    +15                return ExportSimple(target);
    +16            }
    +17            finally
    +18            {
     19                // cleanup
    -20                GameObject.Destroy(target);
    -21            }
    -22        }
    +20                GameObject.Destroy(target);
    +21            }
    +22        }
     
    diff --git a/ja/api/sample/SimpleViewer.html b/ja/api/sample/SimpleViewer.html index dc01073a8..440acc0c0 100644 --- a/ja/api/sample/SimpleViewer.html +++ b/ja/api/sample/SimpleViewer.html @@ -344,58 +344,58 @@

    Runtime ローダーのサンプルです。

    c89e Assets/VRM_Samples/SimpleViewer/ViewerUI.cs
    -
     1        async void LoadModelAsync(string path, bool isVrm)
    - 2        {
    - 3            if (!File.Exists(path))
    - 4            {
    - 5                return;
    - 6            }
    +
     1        async void LoadModelAsync(string path, bool isVrm)
    + 2        {
    + 3            if (!File.Exists(path))
    + 4            {
    + 5                return;
    + 6            }
      7
    - 8            Debug.LogFormat("{0}", path);
    + 8            Debug.LogFormat("{0}", path);
      9
    -10            GltfData data;
    -11            try
    -12            {
    -13                data = new AutoGltfFileParser(path).Parse();
    -14            }
    -15            catch (Exception ex)
    -16            {
    -17                Debug.LogWarningFormat("parse error: {0}", ex);
    -18                return;
    -19            }
    +10            GltfData data;
    +11            try
    +12            {
    +13                data = new AutoGltfFileParser(path).Parse();
    +14            }
    +15            catch (Exception ex)
    +16            {
    +17                Debug.LogWarningFormat("parse error: {0}", ex);
    +18                return;
    +19            }
     20
    -21            if (isVrm)
    -22            {
    -23                try
    -24                {
    -25                    var vrm = new VRMData(data);
    -26                    using (var loader = new VRMImporterContext(vrm, materialGenerator: GetVrmMaterialGenerator(m_useUrpMaterial.isOn, vrm.VrmExtension)))
    -27                    {
    -28                        await m_texts.UpdateMetaAsync(loader);
    -29                        var instance = await loader.LoadAsync(GetIAwaitCaller(m_useAsync.isOn));
    -30                        SetModel(instance);
    -31                    }
    -32                }
    -33                catch (NotVrm0Exception)
    -34                {
    +21            if (isVrm)
    +22            {
    +23                try
    +24                {
    +25                    var vrm = new VRMData(data);
    +26                    using (var loader = new VRMImporterContext(vrm, materialGenerator: GetVrmMaterialGenerator(m_useUrpMaterial.isOn, vrm.VrmExtension)))
    +27                    {
    +28                        await m_texts.UpdateMetaAsync(loader);
    +29                        var instance = await loader.LoadAsync(GetIAwaitCaller(m_useAsync.isOn));
    +30                        SetModel(instance);
    +31                    }
    +32                }
    +33                catch (NotVrm0Exception)
    +34                {
     35                    // retry
    -36                    Debug.LogWarning("file extension is vrm. but not vrm ?");
    -37                    using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: GetGltfMaterialGenerator(m_useUrpMaterial.isOn)))
    -38                    {
    -39                        var instance = await loader.LoadAsync(GetIAwaitCaller(m_useAsync.isOn));
    -40                        SetModel(instance);
    -41                    }
    -42                }
    -43            }
    -44            else
    -45            {
    -46                using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: GetGltfMaterialGenerator(m_useUrpMaterial.isOn)))
    -47                {
    -48                    var instance = await loader.LoadAsync(GetIAwaitCaller(m_useAsync.isOn));
    -49                    SetModel(instance);
    -50                }
    -51            }
    -52        }
    +36                    Debug.LogWarning("file extension is vrm. but not vrm ?");
    +37                    using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: GetGltfMaterialGenerator(m_useUrpMaterial.isOn)))
    +38                    {
    +39                        var instance = await loader.LoadAsync(GetIAwaitCaller(m_useAsync.isOn));
    +40                        SetModel(instance);
    +41                    }
    +42                }
    +43            }
    +44            else
    +45            {
    +46                using (var loader = new UniGLTF.ImporterContext(data, materialGenerator: GetGltfMaterialGenerator(m_useUrpMaterial.isOn)))
    +47                {
    +48                    var instance = await loader.LoadAsync(GetIAwaitCaller(m_useAsync.isOn));
    +49                    SetModel(instance);
    +50                }
    +51            }
    +52        }
     
    diff --git a/ja/implementation/coordinate.html b/ja/implementation/coordinate.html index f793fbe56..4a5c616b4 100644 --- a/ja/implementation/coordinate.html +++ b/ja/implementation/coordinate.html @@ -399,37 +399,37 @@

    Z軸を反転します。

    Vector3: Position, Normalなど

    -
    public static Vector3 ReverseZ(this Vector3 v)
    -{
    -    return new Vector3(v.x, v.y, -v.z);
    -}
    +
    public static Vector3 ReverseZ(this Vector3 v)
    +{
    +    return new Vector3(v.x, v.y, -v.z);
    +}
     

    Quaternion: Rotation

    -
    public static Quaternion ReverseZ(this Quaternion q)
    -{
    -    float angle;
    -    Vector3 axis;
    -    q.ToAngleAxis(out angle, out axis);
    -    return Quaternion.AngleAxis(-angle, ReverseZ(axis));
    -}
    +
    public static Quaternion ReverseZ(this Quaternion q)
    +{
    +    float angle;
    +    Vector3 axis;
    +    q.ToAngleAxis(out angle, out axis);
    +    return Quaternion.AngleAxis(-angle, ReverseZ(axis));
    +}
     

    Matrix: BindMatrices

    スケール値が入っているとうまくいきません

    -
    public static Matrix4x4 ReverseZ(this Matrix4x4 m)
    -{
    -#if UNITY_2017_1_OR_NEWER
    -    m.SetTRS(m.GetColumn(3).ReverseZ(), m.rotation.ReverseZ(), Vector3.one);
    -#else
    -    m.SetTRS(m.ExtractPosition().ReverseZ(), m.ExtractRotation().ReverseZ(), Vector3.one);
    -#endif
    -    return m;
    -}
    +
    public static Matrix4x4 ReverseZ(this Matrix4x4 m)
    +{
    +#if UNITY_2017_1_OR_NEWER
    +    m.SetTRS(m.GetColumn(3).ReverseZ(), m.rotation.ReverseZ(), Vector3.one);
    +#else
    +    m.SetTRS(m.ExtractPosition().ReverseZ(), m.ExtractRotation().ReverseZ(), Vector3.one);
    +#endif
    +    return m;
    +}
     
    diff --git a/ja/implementation/scripted_importer.html b/ja/implementation/scripted_importer.html index 1070855a7..f1e58a0f6 100644 --- a/ja/implementation/scripted_importer.html +++ b/ja/implementation/scripted_importer.html @@ -360,13 +360,13 @@

    Import 設定を作れる

    ScriptedImporter を継承したクラスの public member[SerializeField] に情報を保存できます。

    // 例
    -[ScriptedImporter(1, "cube")]
    -public class CubeImporter : ScriptedImporter
    -{
    -    public float m_Scale = 1; // これを Asset の Inspector で変更して Apply すると、新しい設定で再importできる
    +[ScriptedImporter(1, "cube")]
    +public class CubeImporter : ScriptedImporter
    +{
    +    public float m_Scale = 1; // これを Asset の Inspector で変更して Apply すると、新しい設定で再importできる
     
         // 省略
    -}
    +}
     
    diff --git a/ja/implementation/texture_manipulation.html b/ja/implementation/texture_manipulation.html index 56ddac551..249f0a9c1 100644 --- a/ja/implementation/texture_manipulation.html +++ b/ja/implementation/texture_manipulation.html @@ -346,7 +346,7 @@

    Runtime

    new する場合は、

    -
    var texture = new Texture2D(width, height, format, mipChain, linear = true);
    +
    var texture = new Texture2D(width, height, format, mipChain, linear = true);
     

    とする。

    @@ -355,12 +355,12 @@

    Editor(Asset)

    AssetFolder の png/jpg からloadする場合は、 事前に設定が必用。

    -
    var textureImporter = AssetImporter.GetAtPath(assetPath) as TextureImporter;
    -textureImporter.sRGBTexture = false; // Linear
    -textureImporter.SaveAndReimport();
    +
    var textureImporter = AssetImporter.GetAtPath(assetPath) as TextureImporter;
    +textureImporter.sRGBTexture = false; // Linear
    +textureImporter.SaveAndReimport();
     
     // linear でロードされます
    -var texture =AssetDatabase.LoadAssetAtPath<Texture2D>(assetPath);
    +var texture =AssetDatabase.LoadAssetAtPath<Texture2D>(assetPath);
     
    @@ -373,17 +373,17 @@

    Runtime

    new する場合は、

    -
    var texture = new Texture2D(width, height, format, mipChain, linear = true);
    +
    var texture = new Texture2D(width, height, format, mipChain, linear = true);
     

    とする。 また、 DXT5nm という仕様で格納する必要があるので変換します。 y と w の2要素だけを使います。

    -
    half4 normal;
    -normal.x = 1.0;
    -normal.y = col.y;
    -normal.z = 1.0;
    -normal.w = col.x;
    +
    half4 normal;
    +normal.x = 1.0;
    +normal.y = col.y;
    +normal.z = 1.0;
    +normal.w = col.x;
     
    @@ -391,12 +391,12 @@ y と w の2要素だけを使います。

    Editor(Asset)

    AssetFolder の png/jpg からloadする場合は、 ロードする前に設定が必用。

    -
    var textureImporter = AssetImporter.GetAtPath(assetPath) as TextureImporter;
    -textureImporter.textureType = TextureImporterType.NormalMap; // normalMap
    -textureImporter.SaveAndReimport();
    +
    var textureImporter = AssetImporter.GetAtPath(assetPath) as TextureImporter;
    +textureImporter.textureType = TextureImporterType.NormalMap; // normalMap
    +textureImporter.SaveAndReimport();
     
     // DXT5nm でロードされます。
    -var texture =AssetDatabase.LoadAssetAtPath<Texture2D>(assetPath);
    +var texture =AssetDatabase.LoadAssetAtPath<Texture2D>(assetPath);
     
    diff --git a/ja/release/055/v0.41.html b/ja/release/055/v0.41.html index 5d43273e3..cd3574686 100644 --- a/ja/release/055/v0.41.html +++ b/ja/release/055/v0.41.html @@ -372,11 +372,11 @@
  • [Importer] Change Task's version check from UNITY_2018_1_OR_NEWER to UNITY_2017_1_OR_NEWER

  • [Exporter] Organized interface

  • -
    GameObject m_model;
    -string path;
    -var vrm = VRMExporter.Export(m_model);
    -var bytes = vrm.ToGlbBytes();
    -File.WriteAllBytes(path, bytes);
    +
    GameObject m_model;
    +string path;
    +var vrm = VRMExporter.Export(m_model);
    +var bytes = vrm.ToGlbBytes();
    +File.WriteAllBytes(path, bytes);
     
      diff --git a/ja/release/055/v0.42.html b/ja/release/055/v0.42.html index 119ce7923..13a74e33d 100644 --- a/ja/release/055/v0.42.html +++ b/ja/release/055/v0.42.html @@ -354,11 +354,11 @@ If you are using UniVRM to import VRM data, please update UniVRM to the latest v

      UV Bugs Fix:

      In v0.41 and the earlier versions, converting UV between Unity and GLTF was incorrect.

      Before

      -
      var converted_uv = new Vec2(uv.x, -uv.y); // value becomes negative
      +
      var converted_uv = new Vec2(uv.x, -uv.y); // value becomes negative
       

      After

      -
      var converted_uv = new Vec2(uv.x, 1.0f-uv.y);
      +
      var converted_uv = new Vec2(uv.x, 1.0f-uv.y);
       

      This change influences both import and export.

      @@ -420,12 +420,12 @@ It influences the use of normal map.

      /bufferViews/*/byteStridewill not output

      It seems necessary for outputting OpenGL's interleaved vbo format:

      // Example of interleaved format
      -struct Vertex
      -{
      -  public Vector3 Position;
      -  public Vector3 Normal;
      -}
      -Vertex[] Vertices;
      +struct Vertex
      +{
      +  public Vector3 Position;
      +  public Vector3 Normal;
      +}
      +Vertex[] Vertices;
       

      Since UniGLTF outputs separate arrays for each vertex attribute, ByteStride was unnecessary.

      diff --git a/ja/release/055/v0.44.html b/ja/release/055/v0.44.html index 0f692cab9..a59b5997c 100644 --- a/ja/release/055/v0.44.html +++ b/ja/release/055/v0.44.html @@ -406,24 +406,24 @@

    NormalMap asset import

    -
    textureImporter.textureType = TextureImporterType.NormalMap;
    +
    textureImporter.textureType = TextureImporterType.NormalMap;
     

    NormalMap runtime import

    pack

    -
    fixed4 frag(v2f i) : SV_Target
    -{
    -    half4 col = tex2D(_MainTex, i.uv);
    -    half4 normal;
    -    normal.x = 1.0;
    -    normal.y = col.y;
    -    normal.z = 1.0;
    -    normal.w = col.x;
    +
    fixed4 frag(v2f i) : SV_Target
    +{
    +    half4 col = tex2D(_MainTex, i.uv);
    +    half4 normal;
    +    normal.x = 1.0;
    +    normal.y = col.y;
    +    normal.z = 1.0;
    +    normal.w = col.x;
     
    -    return normal;
    -}
    +    return normal;
    +}
     
    diff --git a/ja/release/055/v0.46.html b/ja/release/055/v0.46.html index 2ecf08ac4..f63c8a89a 100644 --- a/ja/release/055/v0.46.html +++ b/ja/release/055/v0.46.html @@ -376,7 +376,7 @@

    Unity2018.3対応

    -
    #if NET_4_6 || NET_STANDARD_2_0
    +
    #if NET_4_6 || NET_STANDARD_2_0
     
    @@ -411,7 +411,7 @@

    AccumulateValue

    値を貯めて、後で Apply したときに反映する。 SetValues の最後にも Apply されます。

    -
    void BlendShapeProxy.AccumulateValue(key, value)
    +
    void BlendShapeProxy.AccumulateValue(key, value)
     
     // [Obsolete] SetValue(key, value, false)
     
    @@ -420,7 +420,7 @@

    ImmediatelySetValue

    即反映する。

    -
    void BlendShapeProxy.ImmediatelySetValue(key, value)
    +
    void BlendShapeProxy.ImmediatelySetValue(key, value)
     
     // [Obsolete] SetValue(key, value, true)
     
    @@ -429,7 +429,7 @@

    ImporterContext.Destroy

    -
    ImporterContext.Destroy(bool destroySubAssets)
    +
    ImporterContext.Destroy(bool destroySubAssets)
     

    が名前から期待される動作をしていないので Obsolete にして用途を明確にした関数を用意しました。

    diff --git a/ja/release/056/v0.56.0.html b/ja/release/056/v0.56.0.html index 1b426e714..dc8fc6874 100644 --- a/ja/release/056/v0.56.0.html +++ b/ja/release/056/v0.56.0.html @@ -436,42 +436,42 @@ VRM が VRMShaders に依存しています。

    参考コード

    // #330以前の動作
    -public BlendShapeKey(string name) : this(name, BlendShapePreset.Unknown)
    -{
    -}
    +public BlendShapeKey(string name) : this(name, BlendShapePreset.Unknown)
    +{
    +}
     
    -public BlendShapeKey(string name, BlendShapePreset preset)
    -{
    -    Name = name.ToUpper();
    -    Preset = preset;
    -    if (Preset != BlendShapePreset.Unknown)
    -    {
    -        m_id = Preset.ToString().ToUpper();
    -    }
    -    else
    -    {
    -        m_id = Name;
    -    }
    -}
    +public BlendShapeKey(string name, BlendShapePreset preset)
    +{
    +    Name = name.ToUpper();
    +    Preset = preset;
    +    if (Preset != BlendShapePreset.Unknown)
    +    {
    +        m_id = Preset.ToString().ToUpper();
    +    }
    +    else
    +    {
    +        m_id = Name;
    +    }
    +}
     
    -public bool Equals(BlendShapeKey other)
    -{
    -    return ID == other.ID;
    -}
    +public bool Equals(BlendShapeKey other)
    +{
    +    return ID == other.ID;
    +}
     
     // v0.56 でだいたい同じような動きをするコード
    -static BlendShapeKey CreateKeyOld(string src)
    -{
    +static BlendShapeKey CreateKeyOld(string src)
    +{
         // Enum があまり速くない(GC出たり)ようなので、パフォーマンス要件が厳しい場合はキャッシュするなど工夫することをおすすめします
    -    if (Enum.TryParse<BlendShapePreset>(src, true, out BlendShapePreset preset))
    -    {
    -        if (preset != BlendShapePreset.Unknown)
    -        {
    -            return BlendShapeKey.CreateFromPreset(preset);
    -        }
    -    }
    -    return BlendShapeKey.CreateUnknown(src);
    -}
    +    if (Enum.TryParse<BlendShapePreset>(src, true, out BlendShapePreset preset))
    +    {
    +        if (preset != BlendShapePreset.Unknown)
    +        {
    +            return BlendShapeKey.CreateFromPreset(preset);
    +        }
    +    }
    +    return BlendShapeKey.CreateUnknown(src);
    +}
     
      diff --git a/ja/release/079/index.html b/ja/release/079/index.html index 5c553a606..d9cd1aa70 100644 --- a/ja/release/079/index.html +++ b/ja/release/079/index.html @@ -414,12 +414,12 @@

      UPM(v0.81~)

      // manifest.json 抜粋
       {
      -  "dependencies": {
      -    "com.vrmc.vrmshaders": "https://github.com/vrm-c/UniVRM.git?path=/Assets/VRMShaders#v0.82.1",
      -    "com.vrmc.gltf": "https://github.com/vrm-c/UniVRM.git?path=/Assets/UniGLTF#v0.82.1", // rename unigltf to gltf
      -    "com.vrmc.univrm": "https://github.com/vrm-c/UniVRM.git?path=/Assets/VRM#v0.82.1",
      -    "com.vrmc.vrm": "https://github.com/vrm-c/UniVRM.git?path=/Assets/VRM10#v0.82.1", // rename univrm1 to vrm
      -  }
      +  "dependencies": {
      +    "com.vrmc.vrmshaders": "https://github.com/vrm-c/UniVRM.git?path=/Assets/VRMShaders#v0.82.1",
      +    "com.vrmc.gltf": "https://github.com/vrm-c/UniVRM.git?path=/Assets/UniGLTF#v0.82.1", // rename unigltf to gltf
      +    "com.vrmc.univrm": "https://github.com/vrm-c/UniVRM.git?path=/Assets/VRM#v0.82.1",
      +    "com.vrmc.vrm": "https://github.com/vrm-c/UniVRM.git?path=/Assets/VRM10#v0.82.1", // rename univrm1 to vrm
      +  }
       }
       
      diff --git a/ja/release/100/index.html b/ja/release/100/index.html index 8c0477a12..9896b7903 100644 --- a/ja/release/100/index.html +++ b/ja/release/100/index.html @@ -402,12 +402,12 @@

      UPM(v0.100~)

      // manifest.json 抜粋
       {
      -  "dependencies": {
      -    "com.vrmc.vrmshaders": "https://github.com/vrm-c/UniVRM.git?path=/Assets/VRMShaders#v0.105.0",
      -    "com.vrmc.gltf": "https://github.com/vrm-c/UniVRM.git?path=/Assets/UniGLTF#v0.105.0",
      -    "com.vrmc.univrm": "https://github.com/vrm-c/UniVRM.git?path=/Assets/VRM#v0.105.0",
      -    "com.vrmc.vrm": "https://github.com/vrm-c/UniVRM.git?path=/Assets/VRM10#v0.105.0",
      -  }
      +  "dependencies": {
      +    "com.vrmc.vrmshaders": "https://github.com/vrm-c/UniVRM.git?path=/Assets/VRMShaders#v0.105.0",
      +    "com.vrmc.gltf": "https://github.com/vrm-c/UniVRM.git?path=/Assets/UniGLTF#v0.105.0",
      +    "com.vrmc.univrm": "https://github.com/vrm-c/UniVRM.git?path=/Assets/VRM#v0.105.0",
      +    "com.vrmc.vrm": "https://github.com/vrm-c/UniVRM.git?path=/Assets/VRM10#v0.105.0",
      +  }
       }
       
      diff --git a/ja/unihumanoid/index.html b/ja/unihumanoid/index.html index 9655bbaab..b2f039fbd 100644 --- a/ja/unihumanoid/index.html +++ b/ja/unihumanoid/index.html @@ -344,10 +344,10 @@

      Unity humanoid utility with bvh importer.

      BVH runtime loader

      -
      var context = new BvhImporterContext();
      -context.Parse(path);
      +
      var context = new BvhImporterContext();
      +context.Parse(path);
       context.Load(); // create Skeleton hierarchy and mesh for visualize
      -GameObject root = context.Root;
      +GameObject root = context.Root;
       
      diff --git a/ja/vrm1/api_update.html b/ja/vrm1/api_update.html index e1b499cd4..e92857cfb 100644 --- a/ja/vrm1/api_update.html +++ b/ja/vrm1/api_update.html @@ -384,13 +384,13 @@

      ImmediatelySetValue と AccumulateValue は、SetWeight に一本化されました。 ImmediatelySetValue は無くなりました。

      -
      var proxy = root.GetComponent<VRMBlendShapeProxy>();
      -proxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.A), 0.5f);
      +
      var proxy = root.GetComponent<VRMBlendShapeProxy>();
      +proxy.ImmediatelySetValue(BlendShapeKey.CreateFromPreset(BlendShapePreset.A), 0.5f);
       

      👇

      -
      var vrm10 = root.GetComponent<Vrm10Instance>();
      -vrm10.Runtime.Expression.SetWeight(ExpressionKey.CreateFromPreset(ExpressionPreset.aa), 0.5f);
      +
      var vrm10 = root.GetComponent<Vrm10Instance>();
      +vrm10.Runtime.Expression.SetWeight(ExpressionKey.CreateFromPreset(ExpressionPreset.aa), 0.5f);
       
      @@ -403,27 +403,27 @@ ImmediatelySetValue は無くなりました。

    Gaze

    -
    var lookAt = root.GetComponent<VRMLookAt>();
    -lookAt.LookWorldPosition(new Vector3(x, y, z));
    +
    var lookAt = root.GetComponent<VRMLookAt>();
    +lookAt.LookWorldPosition(new Vector3(x, y, z));
     

    👇

    -
    var vrm10 = root.GetComponent<Vrm10Instance>();
    -vrm10.LookAtTargetType = LookAtTargetTypes.CalcYawPitchToGaze;
    -vrm10.Gaze.position = new Vector3(x, y, z);
    +
    var vrm10 = root.GetComponent<Vrm10Instance>();
    +vrm10.LookAtTargetType = LookAtTargetTypes.CalcYawPitchToGaze;
    +vrm10.Gaze.position = new Vector3(x, y, z);
     

    SetYawPitch

    -
    var lookAt = root.GetComponent<VRMLookAt>();
    -lookAt.ApplyRotations(yaw, pitch);
    +
    var lookAt = root.GetComponent<VRMLookAt>();
    +lookAt.ApplyRotations(yaw, pitch);
     

    👇

    -
    var vrm10 = root.GetComponent<Vrm10Instance>();
    -vrm10.LookAtTargetType = LookAtTargetTypes.SetYawPitch;
    -vrm10.Runtime.LookAt.SetLookAtYawPitch(yaw, pitch);
    +
    var vrm10 = root.GetComponent<Vrm10Instance>();
    +vrm10.LookAtTargetType = LookAtTargetTypes.SetYawPitch;
    +vrm10.Runtime.LookAt.SetLookAtYawPitch(yaw, pitch);
     
    diff --git a/ja/vrm1/vrm1_controlrig.html b/ja/vrm1/vrm1_controlrig.html index deeb692bf..1ac2294ec 100644 --- a/ja/vrm1/vrm1_controlrig.html +++ b/ja/vrm1/vrm1_controlrig.html @@ -369,15 +369,15 @@ VRMモデルをセットアップするときに邪魔になってしまうの

    デフォルトで ControlRig を生成 ControlRigGenerationOption.Generate します。 ControlRigGenerationOption.None は ControlRig を生成しません。

    -
    public static async Task<Vrm10Instance> Vrm10.LoadPathAsync(
    -    string path,
    -    bool canLoadVrm0X = true,
    -    ControlRigGenerationOption controlRigGenerationOption = ControlRigGenerationOption.Generate, // 👈
    -    bool showMeshes = true,
    -    IAwaitCaller awaitCaller = null,
    -    IMaterialDescriptorGenerator materialGenerator = null,
    -    VrmMetaInformationCallback vrmMetaInformationCallback = null,
    -    CancellationToken ct = default)
    +
    public static async Task<Vrm10Instance> Vrm10.LoadPathAsync(
    +    string path,
    +    bool canLoadVrm0X = true,
    +    ControlRigGenerationOption controlRigGenerationOption = ControlRigGenerationOption.Generate, // 👈
    +    bool showMeshes = true,
    +    IAwaitCaller awaitCaller = null,
    +    IMaterialDescriptorGenerator materialGenerator = null,
    +    VrmMetaInformationCallback vrmMetaInformationCallback = null,
    +    CancellationToken ct = default)
     

    ControlRigGenerationOption.Generate でロードしたモデルは、 Animator.getBoneTransform が @@ -398,39 +398,39 @@ ControlRig の該当ボーンを返します。 /// from v0.104 /// </summary> /// <param name="src"></param> -public void UpdateControlRigImplicit(Animator src) -{ - var dst = m_controller.GetComponent<Animator>(); +public void UpdateControlRigImplicit(Animator src) +{ + var dst = m_controller.GetComponent<Animator>(); - foreach (HumanBodyBones bone in CachedEnum.GetValues<HumanBodyBones>()) - { - if (bone == HumanBodyBones.LastBone) - { - continue; - } + foreach (HumanBodyBones bone in CachedEnum.GetValues<HumanBodyBones>()) + { + if (bone == HumanBodyBones.LastBone) + { + continue; + } // v0.104 から Animator.GetBoneTransform が // ControlRig のボーンを返します。 - var boneTransform = dst.GetBoneTransform(bone); - if (boneTransform == null) - { - continue; - } + var boneTransform = dst.GetBoneTransform(bone); + if (boneTransform == null) + { + continue; + } - var bvhBone = src.GetBoneTransform(bone); - if (bvhBone != null) - { + var bvhBone = src.GetBoneTransform(bone); + if (bvhBone != null) + { // set normalized pose - boneTransform.localRotation = bvhBone.localRotation; - } + boneTransform.localRotation = bvhBone.localRotation; + } - if (bone == HumanBodyBones.Hips) - { + if (bone == HumanBodyBones.Hips) + { // TODO: hips position scaling ? - boneTransform.localPosition = bvhBone.localPosition; - } - } -} + boneTransform.localPosition = bvhBone.localPosition; + } + } +}

    @@ -447,14 +447,14 @@ ControlRig の該当ボーンを返します。

    GlobalInit.Inverse * localPose * GlobalInit という式がロジックです。 これにより、正規化済みのポーズ(localPose) を非正規化ポーズに変換できます。

    Vrm10ControlBone.cs

    -
            internal void ProcessRecursively()
    -        {
    -            ControlTarget.localRotation = _initialTargetLocalRotation * Quaternion.Inverse(_initialTargetGlobalRotation) * ControlBone.localRotation * _initialTargetGlobalRotation;
    -            foreach (var child in _children)
    -            {
    -                child.ProcessRecursively();
    -            }
    -        }
    +
            internal void ProcessRecursively()
    +        {
    +            ControlTarget.localRotation = _initialTargetLocalRotation * Quaternion.Inverse(_initialTargetGlobalRotation) * ControlBone.localRotation * _initialTargetGlobalRotation;
    +            foreach (var child in _children)
    +            {
    +                child.ProcessRecursively();
    +            }
    +        }
     
    diff --git a/ja/vrm1/vrm1_firstperson.html b/ja/vrm1/vrm1_firstperson.html index b69ff35d7..452d7f0c8 100644 --- a/ja/vrm1/vrm1_firstperson.html +++ b/ja/vrm1/vrm1_firstperson.html @@ -375,8 +375,8 @@ UniVRMは、レイヤー9 デフォルトのレイヤー番号

    デフォルトは FirstPerson = 9, ThirdPerson = 10 です。

    FirstPerson.SetupAsync の引数で指定できます。

    -
    var created = await controller.Vrm.FirstPerson.SetupAsync(
    -    controller.gameObject, firstPersonOnlyLayer: 9, thirdPersonOnlyLayer: 10);
    +
    var created = await controller.Vrm.FirstPerson.SetupAsync(
    +    controller.gameObject, firstPersonOnlyLayer: 9, thirdPersonOnlyLayer: 10);
     
    @@ -422,30 +422,30 @@ UniVRMは、レイヤー9

    Vrm10Instance.Vrm.FirstPerson.SetupAsync を呼び出す

  • ShowMeshes

  • -
    async Task<RuntimeGltfInstance> LoadAsync(string path)
    -{
    -    var data = new GlbFileParser(path).Parse();
    -    if (!Vrm10Data.TryParseOrMigrate(data, true, out Vrm10Data vrm))
    -    {
    -        throw new System.Exception("vrm parse error !");
    -    }
    -    using (var loader = new Vrm10Importer(vrm))
    -    {
    +
    async Task<RuntimeGltfInstance> LoadAsync(string path)
    +{
    +    var data = new GlbFileParser(path).Parse();
    +    if (!Vrm10Data.TryParseOrMigrate(data, true, out Vrm10Data vrm))
    +    {
    +        throw new System.Exception("vrm parse error !");
    +    }
    +    using (var loader = new Vrm10Importer(vrm))
    +    {
             // 1.
    -        var instance = await loader.LoadAsync();
    +        var instance = await loader.LoadAsync();
     
             // 2.
    -        var controller = instance.GetComponent<Vrm10Instance>();
    +        var controller = instance.GetComponent<Vrm10Instance>();
     
             // 3. The headless model that created is added to instance
    -        await controller.Vrm.FirstPerson.SetupAsync(controller.gameObject);
    +        await controller.Vrm.FirstPerson.SetupAsync(controller.gameObject);
     
             // 4. 
    -        instance.ShowMeshes();
    +        instance.ShowMeshes();
     
    -        return instance;
    -    }
    -}
    +        return instance;
    +    }
    +}
     
    diff --git a/ja/vrm1/vrm1_load.html b/ja/vrm1/vrm1_load.html index cb0073e1d..533aa5305 100644 --- a/ja/vrm1/vrm1_load.html +++ b/ja/vrm1/vrm1_load.html @@ -344,7 +344,7 @@

    Assets\VRM10\Samples\VRM10Viewer\VRM10ViewerUI.cs

    RuntimeLoad

    -
    Vrm10Instance vrm10Instance = await Vrm10.LoadPathAsync(path);
    +
    Vrm10Instance vrm10Instance = await Vrm10.LoadPathAsync(path);
     
    @@ -354,39 +354,39 @@ その場合、あたらしい meta への変換が発生し互換性の無い部分はすべて 不許可 の値になります。 変換前のライセンスにアクセスできます。

    サンプルの Assets\VRM10\Samples\VRM10Viewer\VRM10ViewerUI.cs も参照してください。

    -
    async Task<Vrm10Instance> LoadAsync(string path)
    -{
    -    GltfData data = new AutoGltfFileParser(path).Parse();
    +
    async Task<Vrm10Instance> LoadAsync(string path)
    +{
    +    GltfData data = new AutoGltfFileParser(path).Parse();
     
         // doMigrate: true で旧バージョンの vrm をロードできます。
    -    if (Vrm10Data.TryParseOrMigrate(data, doMigrate: true, out Vrm10Data vrm))
    -    {
    +    if (Vrm10Data.TryParseOrMigrate(data, doMigrate: true, out Vrm10Data vrm))
    +    {
             // vrm
    -        using (var loader = new Vrm10Importer(vrm))
    -        {
    +        using (var loader = new Vrm10Importer(vrm))
    +        {
                 // migrate しても thumbnail は同じ
    -            var thumbnail  = await loader.LoadVrmThumbnailAsync();
    +            var thumbnail  = await loader.LoadVrmThumbnailAsync();
     
    -            if (vrm.OriginalMetaBeforeMigration != null)
    -            {
    +            if (vrm.OriginalMetaBeforeMigration != null)
    +            {
                     // migrated from vrm-0.x. use OriginalMetaBeforeMigration
    -                UpdateMeta(vrm.OriginalMetaBeforeMigration, thumbnail);
    -            }
    -            else
    -            {
    +                UpdateMeta(vrm.OriginalMetaBeforeMigration, thumbnail);
    +            }
    +            else
    +            {
                     // load vrm-1.0. use newMeta
    -                UpdateMeta(vrm.VrmExtension.Meta, thumbnail);
    -            }
    +                UpdateMeta(vrm.VrmExtension.Meta, thumbnail);
    +            }
     
                 // モデルをロード
    -            RuntimeGltfInstance instance = await loader.LoadAsync();
    -            return instance.GetComponent<Vrm10Instance>();
    -        }
    -    }
    -    else{
    -        throw new Exception("not vrm");
    -    }
    -}
    +            RuntimeGltfInstance instance = await loader.LoadAsync();
    +            return instance.GetComponent<Vrm10Instance>();
    +        }
    +    }
    +    else{
    +        throw new Exception("not vrm");
    +    }
    +}
     
    diff --git a/ja/vrm1/vrm1_springbone.html b/ja/vrm1/vrm1_springbone.html index dd71c5a82..a3fb89572 100644 --- a/ja/vrm1/vrm1_springbone.html +++ b/ja/vrm1/vrm1_springbone.html @@ -356,11 +356,11 @@

    外力

    ジャンプや風など、一時的な力の表現を想定した機能です。

    -
    VRM10Instance instance;
    +
    VRM10Instance instance;
     
     // each frame
     // 既存の Gravity に加算されます
    -instance.Runtime.ExternalForce = new Vector3(0.1f, 0, 0);
    +instance.Runtime.ExternalForce = new Vector3(0.1f, 0, 0);
     
    @@ -375,27 +375,27 @@
  • FastSpringBoneService.ManualUpdate を追加

  • // 管理している VRM-1.0 がすべて入っている
    -List<VRM10Instance> instances;
    +List<VRM10Instance> instances;
     
     // setup
    -foreach(var instance in instances)
    -{
    +foreach(var instance in instances)
    +{
         // SpringBone を手動にするために、
         // VRM-1.0 本体も手動に変更している。
         // VRM本体 => SpringBone という処理順を守る。
    -    instance.UpdateType = UpdateTypes.None;
    -}
    -FastSpringBoneService.Instance.UpdateType = FastSpringBoneService.UpdateTypes.Manual;
    +    instance.UpdateType = UpdateTypes.None;
    +}
    +FastSpringBoneService.Instance.UpdateType = FastSpringBoneService.UpdateTypes.Manual;
     
     // each frame
    -foreach(var instance in instances)
    -{
    +foreach(var instance in instances)
    +{
         // SpringBone よりも先に VRM10Instance を更新
    -    instance.Runtime.Process();
    -}
    +    instance.Runtime.Process();
    +}
     // 最後に FastSpringBoneService を更新
     // すべての VRM-1.0 の SpringBone がまとめて処理されます。
    -FastSpringBoneService.Instance.ManualUpdate(time.deltaTime);
    +FastSpringBoneService.Instance.ManualUpdate(time.deltaTime);