Skip to content

Commit

Permalink
[emapp] add Bone::destinationOrigin to prevent NaN (#311)
Browse files Browse the repository at this point in the history
* [emapp] add `Bone::destinationOrigin` to prevent NaN

* [emapp] add NaN check to `nanoemModelBoneGetDestinationOrigin`

* [docs] updates changelog and remove support of Marshmallow
  • Loading branch information
hkrn committed Apr 23, 2023
1 parent 5f2f44f commit 2faf4f1
Show file tree
Hide file tree
Showing 9 changed files with 40 additions and 23 deletions.
2 changes: 1 addition & 1 deletion docs/change_log.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
.. note::
31.5.0 以前の変更履歴は :doc:`change_log_past` を参照してください

34.9.0 (未リリース)
34.9.0 (2023/4/2)
******************************************

.. important::
Expand Down
20 changes: 6 additions & 14 deletions docs/install.rst
Original file line number Diff line number Diff line change
Expand Up @@ -115,22 +115,14 @@ Facebook とか LINE とかの場合は知ってそうな友達に聞くしか
不具合報告の方法
-------------------------------------------------------

まずは「:doc:`faq`」または「:doc:`trouble_shooting`」を確認してから以下のいずれかの方法で質問してください。

* 「`GitHub の Discussions の Q/A ボード <https://github.com/hkrn/nanoem/discussions/categories/q-a>`_」

* 要 GitHub アカウント
* サービスの性質上英語表記ですが ``Discussions`` タブの方は日本語で質問投げても問題ありません
* ``Issues`` タブの方は原則英語で回答対応のためもし投げる場合は英語でお願いします

* 「`マシュマロ <https://marshmallow-qa.com/shimacpyon>`_」

* ログイン不要
* サービスの性質上書き方が悪いと本人のもとに届かないことがあります
.. important::
「`マシュマロ <https://marshmallow-qa.com>`_」でのサポートも行っていましたが、2023年4月時点での Twitter の情勢の問題によりサポート対象から外しました。今後は GitHub を利用してください。

* また、届いたかどうかについての回答はしません
まずは「:doc:`faq`」または「:doc:`trouble_shooting`」を確認してから「`GitHub の Discussions の Q/A ボード <https://github.com/hkrn/nanoem/discussions/categories/q-a>`_」で質問を行なってください。

* 有料のチョコマシュマロは対応していません
* 要 GitHub アカウント
* サービスの性質上英語表記ですが ``Discussions`` タブの方は日本語で質問投げても問題ありません
* ``Issues`` タブの方は原則英語で回答対応のため、もし投げる場合は英語でお願いします

不具合報告時の注意
-------------------------------------------------------
Expand Down
1 change: 1 addition & 0 deletions emapp/include/emapp/model/Bone.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ class Bone NANOEM_DECL_SEALED : private NonCopyable {
const nanoem_model_bone_t *bonePtr, const char *placeHolder) NANOEM_DECL_NOEXCEPT;
static Matrix3x3 localAxes(const nanoem_model_bone_t *bonePtr) NANOEM_DECL_NOEXCEPT;
static Vector3 origin(const nanoem_model_bone_t *bonePtr) NANOEM_DECL_NOEXCEPT;
static Vector3 destinationOrigin(const nanoem_model_bone_t *bonePtr) NANOEM_DECL_NOEXCEPT;
static Vector3 toVector3(const nanoem_motion_bone_keyframe_t *keyframe) NANOEM_DECL_NOEXCEPT;
static Quaternion toQuaternion(const nanoem_motion_bone_keyframe_t *keyframe) NANOEM_DECL_NOEXCEPT;
static Bone *cast(const nanoem_model_bone_t *bonePtr) NANOEM_DECL_NOEXCEPT;
Expand Down
10 changes: 7 additions & 3 deletions emapp/resources/translations/translations.pb
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@

��@
��@
nanoem.gui.unimplemented$未実装のため現在利用不可
nanoem.gui.camera カメラ%
nanoem.gui.keyframe.copy コピー'
Expand Down Expand Up @@ -1002,7 +1002,9 @@ $nanoem.error.motion.not-model.reasonE読み込まれたモーションはモ
#nanoem.model.measure-height.messageMモデル「%s」の身長の近似値は %.2f センチメートルです。>
#nanoem.model.validator.result.title「%s」の検証結果\
%nanoem.model.validator.result.success3検証した結果問題はありませんでしたd
%nanoem.model.validator.result.failure;検証した結果 %zu 件の問題が見つかりましたJ
%nanoem.model.validator.result.failure;検証した結果 %zu 件の問題が見つかりましたI
*nanoem.model.validator.primitive.float-nan非数値が存在しますI
*nanoem.model.validator.primitive.float-inf無限値が存在しますJ
.nanoem.model.validator.vertex.model.name.emptyモデル名が空ですY
1nanoem.model.validator.vertex.model.comment.empty$モデルのコメントが空ですN
,nanoem.model.validator.vertex.normal.invalid頂点の法線が不正です^
Expand Down Expand Up @@ -1179,7 +1181,7 @@ Ananoem.status.ERROR_DOCUMENT_MODEL_OUTSIDE_PARENT_STATE_NOT_FOUND3モーフの
;nanoem.status.ERROR_DOCUMENT_MODEL_OUTSIDE_PARENT_CORRUPTED-モデルの外部親が破損していますl
2nanoem.status.ERROR_DOCUMENT_SELF_SHADOW_CORRUPTED6セルフシャドウデータが破損しています�
;nanoem.status.ERROR_DOCUMENT_SELF_SHADOW_KEYFRAME_CORRUPTEDBセルフシャドウのキーフレームが破損しています
��F
��F
nanoem.gui.unimplemented*Currently Unavailable due to unimplemented
nanoem.gui.cameraCamera
nanoem.gui.keyframe.copyCopy
Expand Down Expand Up @@ -2204,6 +2206,8 @@ $nanoem.error.motion.not-model.reason,The loading motion is not intended for mo
#nanoem.model.validator.result.titleValidation result of %sD
%nanoem.model.validator.result.successNo validation problem foundH
%nanoem.model.validator.result.failure%zu validation problem(s) foundI
*nanoem.model.validator.primitive.float-nanThere is NaN (Not a Number)?
*nanoem.model.validator.primitive.float-infThere is InfinityI
.nanoem.model.validator.vertex.model.name.emptyThe model name is emptyR
1nanoem.model.validator.vertex.model.comment.emptyComment of the model is emptyO
,nanoem.model.validator.vertex.normal.invalidNormal of the vertex is invalid^
Expand Down
8 changes: 8 additions & 0 deletions emapp/resources/translations/translations.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4231,6 +4231,14 @@
phrase:
en_US: '%zu validation problem(s) found'
ja_JP: '検証した結果 %zu 件の問題が見つかりました'
- key: nanoem.model.validator.primitive.float-nan
phrase:
en_US: 'There is NaN (Not a Number)'
ja_JP: '非数値が存在します'
- key: nanoem.model.validator.primitive.float-inf
phrase:
en_US: 'There is Infinity'
ja_JP: '無限値が存在します'
- key: nanoem.model.validator.vertex.model.name.empty
phrase:
en_US: 'The model name is empty'
Expand Down
3 changes: 1 addition & 2 deletions emapp/src/Model.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2504,9 +2504,8 @@ Model::drawBoneConnections(IPrimitive2D *primitive, const nanoem_model_bone_t *b
}
else if ((isShowAllBones() || isBoneConnectionDrawable(bonePtr)) &&
PrivateModelUtils::isBoneEditingVisible(bonePtr)) {
const nanoem_f32_t *v = nanoemModelBoneGetDestinationOrigin(bonePtr);
const Matrix4x4 transform(worldTransform(PrivateModelUtils::boneWorldMatrix(bonePtr)));
const Vector3 destinationPositon((Matrix3x3(transform) * glm::make_vec3(v)) + Vector3(transform[3]));
const Vector3 destinationPositon(Matrix3x3(transform) * model::Bone::destinationOrigin(bonePtr) + Vector3(transform[3]));
const Vector4 color(connectionBoneColor(bonePtr, Vector4(0, 0, 1, 1), false));
drawBoneConnection(primitive, bonePtr, destinationPositon, color, circleRadius, kDrawBoneConnectionThickness);
}
Expand Down
4 changes: 2 additions & 2 deletions emapp/src/command/ModelObjectCommand.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4868,8 +4868,8 @@ BatchChangeAllBoneObjectsCommand::create(Model *activeModel, const List &objects
void
BatchChangeAllBoneObjectsCommand::save(const nanoem_model_bone_t *bonePtr, Parameter &parameter)
{
parameter.m_origin = glm::make_vec3(nanoemModelBoneGetOrigin(bonePtr));
parameter.m_destinationOrigin = glm::make_vec3(nanoemModelBoneGetDestinationOrigin(bonePtr));
parameter.m_origin = model::Bone::origin(bonePtr);
parameter.m_destinationOrigin = model::Bone::destinationOrigin(bonePtr);
parameter.m_fixedAxis = glm::make_vec3(nanoemModelBoneGetFixedAxis(bonePtr));
parameter.m_localAxisX = glm::make_vec3(nanoemModelBoneGetLocalXAxis(bonePtr));
parameter.m_localAxisZ = glm::make_vec3(nanoemModelBoneGetLocalZAxis(bonePtr));
Expand Down
12 changes: 11 additions & 1 deletion emapp/src/model/Bone.cc
Original file line number Diff line number Diff line change
Expand Up @@ -512,7 +512,7 @@ Bone::localAxes(const nanoem_model_bone_t *bonePtr) NANOEM_DECL_NOEXCEPT
const nanoem_model_bone_t *targetBonePtr = nanoemModelBoneGetTargetBoneObject(bonePtr);
const Vector3 parentOrigin(model::Bone::origin(bonePtr)),
baseOrigin(targetBonePtr ? model::Bone::origin(targetBonePtr)
: glm::make_vec3(nanoemModelBoneGetDestinationOrigin(bonePtr))),
: model::Bone::destinationOrigin(bonePtr)),
directionAxis(glm::normalize(baseOrigin - parentOrigin));
float angle = glm::angle(Constants::kUnitX, directionAxis);
orientation = glm::angleAxis(-angle, Constants::kUnitZ);
Expand All @@ -532,6 +532,16 @@ Bone::origin(const nanoem_model_bone_t *bonePtr) NANOEM_DECL_NOEXCEPT
return glm::make_vec3(nanoemModelBoneGetOrigin(bonePtr)) * Constants::kTranslateDirection;
}

Vector3
Bone::destinationOrigin(const nanoem_model_bone_t *bonePtr) NANOEM_DECL_NOEXCEPT
{
glm::vec3 v(glm::make_vec3(nanoemModelBoneGetDestinationOrigin(bonePtr)));
v.x = glm::isnan(v.x) ? 0.0: v.x;
v.y = glm::isnan(v.y) ? 0.0: v.y;
v.z = glm::isnan(v.z) ? 0.0: v.z;
return v;
}

Vector3
Bone::toVector3(const nanoem_motion_bone_keyframe_t *keyframe) NANOEM_DECL_NOEXCEPT
{
Expand Down
3 changes: 3 additions & 0 deletions emapp/src/model/Validator.cc
Original file line number Diff line number Diff line change
Expand Up @@ -779,6 +779,9 @@ Validator::validateAllBoneObjects(const Model *model, nanoem_u32_t filter, Diagn
if (!validateVector3(nanoemModelBoneGetOrigin(bonePtr), filter, &diag)) {
result.push_back(diag);
}
if (!validateVector3(nanoemModelBoneGetDestinationOrigin(bonePtr), filter, &diag)) {
result.push_back(diag);
}
if (nanoemModelBoneHasInherentTranslation(bonePtr) || nanoemModelBoneHasInherentOrientation(bonePtr)) {
const nanoem_model_bone_t *inherentParentBonePtr = nanoemModelBoneGetInherentParentBoneObject(bonePtr);
if (inherentParentBonePtr == nullptr && testDiagnosticsSeverity(kSeverityTypeError, filter, &diag)) {
Expand Down

0 comments on commit 2faf4f1

Please sign in to comment.