From 5749372e7add48bf56557928e8be41b1680b1aac Mon Sep 17 00:00:00 2001 From: hkrn <129939+hkrn@users.noreply.github.com> Date: Mon, 15 Mar 2021 23:06:27 +0900 Subject: [PATCH 001/488] [emapp] initial progress --- emapp/include/emapp/Project.h | 7 +- emapp/include/emapp/internal/ImGuiWindow.h | 1 + emapp/src/CommandRegistrator.cc | 2 +- emapp/src/Project.cc | 27 ++-- emapp/src/StateController.cc | 9 +- emapp/src/internal/ImGuiWindow.cc | 28 ++-- emapp/src/internal/ModelObjectSelection.cc | 4 +- .../internal/imgui/ModelParameterDialog.cc | 132 +++++++++++++----- .../project_copy_paste_bone_parameters.cc | 3 +- scripts/build.cmake | 1 + 10 files changed, 136 insertions(+), 78 deletions(-) diff --git a/emapp/include/emapp/Project.h b/emapp/include/emapp/Project.h index 5357787c..70d59223 100644 --- a/emapp/include/emapp/Project.h +++ b/emapp/include/emapp/Project.h @@ -131,8 +131,6 @@ class Project NANOEM_DECL_SEALED : private NonCopyable { kEditingModeSelect, kEditingModeMove, kEditingModeRotate, - kEditingModeModel, - kEditingModeEffect, kEditingModeMaxEnum }; enum FilePathMode { @@ -152,8 +150,6 @@ class Project NANOEM_DECL_SEALED : private NonCopyable { kRectangleTransformCoordinateType, kRectangleCameraLookAt, kRectangleCameraZoom, - kRectangleEffect, - kRectangleModelEditing, kRectangleActualFPS, kRectangleTypeMaxEnum, }; @@ -651,7 +647,6 @@ class Project NANOEM_DECL_SEALED : private NonCopyable { ITrack *selectedTrack() NANOEM_DECL_NOEXCEPT; void setSelectedTrack(ITrack *value); EditingMode editingMode() const NANOEM_DECL_NOEXCEPT; - bool isModelEditing() const NANOEM_DECL_NOEXCEPT; void setEditingMode(EditingMode value); FilePathMode filePathMode() const NANOEM_DECL_NOEXCEPT; void setFilePathMode(FilePathMode value); @@ -743,6 +738,8 @@ class Project NANOEM_DECL_SEALED : private NonCopyable { void setMipmapEnabled(bool value); bool isPowerSavingEnabled() const NANOEM_DECL_NOEXCEPT; void setPowerSavingEnabled(bool value); + bool isModelEditingEnabled() const NANOEM_DECL_NOEXCEPT; + void setModelEditingEnabled(bool value); bool isActive() const NANOEM_DECL_NOEXCEPT; void setActive(bool value); diff --git a/emapp/include/emapp/internal/ImGuiWindow.h b/emapp/include/emapp/internal/ImGuiWindow.h index fa3f4ccb..30468f61 100644 --- a/emapp/include/emapp/internal/ImGuiWindow.h +++ b/emapp/include/emapp/internal/ImGuiWindow.h @@ -400,6 +400,7 @@ class ImGuiWindow NANOEM_DECL_SEALED : public IUIWindow, private NonCopyable { void *m_debugger; BufferMap m_buffers; PipelineMap m_pipelines; + Matrix4x4 m_pivotMatrix; Vector4 m_draggingMarkerPanelRect; sg_bindings m_bindings; sg_pipeline_desc m_basePipelineDescription; diff --git a/emapp/src/CommandRegistrator.cc b/emapp/src/CommandRegistrator.cc index 8fa7bfdb..14a41c2e 100644 --- a/emapp/src/CommandRegistrator.cc +++ b/emapp/src/CommandRegistrator.cc @@ -1539,7 +1539,7 @@ CommandRegistrator::internalMoveAllSelectedSelfShadowKeyframes( bool CommandRegistrator::canRegisterMotionCommand() const NANOEM_DECL_NOEXCEPT { - return !(m_project->isPlaying() || m_project->isModelEditing()); + return !(m_project->isPlaying() || m_project->isModelEditingEnabled()); } } /* namespace nanoem */ diff --git a/emapp/src/Project.cc b/emapp/src/Project.cc index 71ee6052..b0252940 100644 --- a/emapp/src/Project.cc +++ b/emapp/src/Project.cc @@ -100,6 +100,7 @@ static const nanoem_u64_t kEnablePhysicsSimulationForBoneKeyframe = 1ull << 26; static const nanoem_u64_t kEnableImageAnisotropy = 1ull << 27; static const nanoem_u64_t kEnableImageMipmap = 1ull << 28; static const nanoem_u64_t kEnablePowerSaving = 1ull << 29; +static const nanoem_u64_t kEnableModelEditing = 1ull << 30; static const nanoem_u64_t kPrivateStateInitialValue = kDisplayTransformHandle | kDisplayUserInterface | kEnableMotionMerge | kEnableUniformedViewportImageSize | kEnableFPSCounter | kEnablePerformanceMonitor | @@ -5197,12 +5198,6 @@ Project::editingMode() const NANOEM_DECL_NOEXCEPT return m_editingMode; } -bool -Project::isModelEditing() const NANOEM_DECL_NOEXCEPT -{ - return m_editingMode == Project::kEditingModeModel; -} - void Project::setEditingMode(EditingMode value) { @@ -5916,6 +5911,18 @@ Project::setPowerSavingEnabled(bool value) EnumUtils::setEnabled(kEnablePowerSaving, m_stateFlags, value); } +bool +Project::isModelEditingEnabled() const NANOEM_DECL_NOEXCEPT +{ + return EnumUtils::isEnabled(kEnableModelEditing, m_stateFlags); +} + +void +Project::setModelEditingEnabled(bool value) +{ + EnumUtils::setEnabled(kEnableModelEditing, m_stateFlags, value); +} + bool Project::isActive() const NANOEM_DECL_NOEXCEPT { @@ -5966,14 +5973,6 @@ Project::internalQueryRectangle(RectangleType type, const Vector4UI16 &viewportR rect = Vector4UI16(offsetX + shift * 1, offsetCameraY, width, width); break; } - case kRectangleEffect: { - rect = Vector4UI16(offset.x + margin * 2, offset.y + margin * 2, width, width); - break; - } - case kRectangleModelEditing: { - rect = Vector4UI16(offset.x + shift * 1 + margin * 2, offset.y + margin * 2, width, width); - break; - } case kRectangleOrientateX: { rect = Vector4UI16(offsetX + shift * 0, offsetOrientateY, width, width); break; diff --git a/emapp/src/StateController.cc b/emapp/src/StateController.cc index 14e2032f..7e729ecf 100644 --- a/emapp/src/StateController.cc +++ b/emapp/src/StateController.cc @@ -166,12 +166,6 @@ class BaseDraggingObjectState : public BaseState { draggingState = createCameraZoomState(logicalScalePosition, project); } } - else if (rectangleType == Project::kRectangleEffect) { - m_stateControllerPtr->toggleEditingMode(Project::kEditingModeEffect); - } - else if (rectangleType == Project::kRectangleModelEditing) { - m_stateControllerPtr->toggleEditingMode(Project::kEditingModeModel); - } return draggingState; } void @@ -1254,7 +1248,7 @@ StateController::setPrimaryDraggingState(Project *project, const Vector2SI32 &lo IState *state = nullptr; if (const Model *model = project->activeModel()) { const IModelObjectSelection *selection = model->selection(); - if (!project->isModelEditing()) { + if (!project->isModelEditingEnabled()) { if (selection->isBoxSelectedBoneModeEnabled()) { state = nanoem_new(DraggingBoxSelectedBoneState(this, m_applicationPtr)); } @@ -1283,6 +1277,7 @@ StateController::setPrimaryDraggingState(Project *project, const Vector2SI32 &lo case IModelObjectSelection::kEditingTypeMorph: case IModelObjectSelection::kEditingTypeNone: default: + state = nanoem_new(DraggingCameraState(this, m_applicationPtr, true)); break; } } diff --git a/emapp/src/internal/ImGuiWindow.cc b/emapp/src/internal/ImGuiWindow.cc index 243eb6da..27ffda06 100644 --- a/emapp/src/internal/ImGuiWindow.cc +++ b/emapp/src/internal/ImGuiWindow.cc @@ -327,6 +327,7 @@ ImGuiWindow::ImGuiWindow(BaseApplicationService *application) , m_requestedScrollHereTrack(nullptr) , m_context(nullptr) , m_debugger(nullptr) + , m_pivotMatrix(Constants::kIdentity) , m_draggingMarkerPanelRect(Constants::kZeroV4) , m_elapsedTime(0) , m_currentMemoryBytes(0) @@ -1709,14 +1710,15 @@ ImGuiWindow::drawMainWindow(const Vector2 &deviceScaleWindowSize, Project *proje if (m_menu) { m_menu->draw(m_debugger); } - { + + if (!project->isModelEditingEnabled()) { const ImGuiStyle &style = ImGui::GetStyle(); const nanoem_f32_t panelHeight = (ImGui::GetFrameHeightWithSpacing() * 8 + style.ItemSpacing.y * 6 + style.WindowPadding.y * 2) * (1.0f / deviceScaleRatio); const ImVec2 &size = ImGui::GetContentRegionAvail(); const nanoem_f32_t timelineWidth = calculateTimelineWidth(size), - viewportHeight = size.y - panelHeight * deviceScaleRatio; + viewportHeight = size.y - (panelHeight * deviceScaleRatio); drawTimeline(timelineWidth, viewportHeight, project); ImGui::SameLine(); ImVec2 posFrom(ImGui::GetCursorScreenPos()); @@ -1724,8 +1726,6 @@ ImGuiWindow::drawMainWindow(const Vector2 &deviceScaleWindowSize, Project *proje if (ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows)) { handleVerticalSplitter(posFrom, size, viewportHeight, deviceScaleRatio); } - } - { Model *activeModel = project->activeModel(); ImGui::BeginChild("panel", ImGui::GetContentRegionAvail(), true); const ImVec2 &innerSize = ImGui::GetContentRegionAvail(); @@ -1751,6 +1751,10 @@ ImGuiWindow::drawMainWindow(const Vector2 &deviceScaleWindowSize, Project *proje drawPlayPanel(panelSize, project); ImGui::EndChild(); } + else { + const ImVec2 &size = ImGui::GetContentRegionAvail(); + drawViewport(size.y, project); + } ImGui::PopStyleVar(); ImGui::End(); restoreDefaultStyle(); @@ -2693,8 +2697,8 @@ ImGuiWindow::drawViewport(nanoem_f32_t viewportHeight, Project *project) ImVec2 offset = ImGui::GetCursorScreenPos(), size = ImGui::GetContentRegionAvail(); size.y -= ImGui::GetFrameHeightWithSpacing(); const Vector4 viewportLayout(offset.x, offset.y, size.x, size.y); + bool hovered = ImGui::IsWindowHovered(); project->resizeUniformedViewportLayout(viewportLayout / deviceScaleRatio); - project->setViewportHovered(ImGui::IsWindowHovered()); const Vector4 viewportImageRect(createViewportImageRect(project, viewportLayout)); const sg_image viewportImageHandle = project->viewportPrimaryImage(); ImGui::Dummy(size); @@ -2716,15 +2720,20 @@ ImGuiWindow::drawViewport(nanoem_f32_t viewportHeight, Project *project) } drawList->AddImage( reinterpret_cast(viewportImageHandle.id), viewportImageFrom, viewportImageTo, uv0, uv1); - if (project->isModelEditing()) { - Matrix4x4 view, projection, matrix(1); + if (project->isModelEditingEnabled()) { + Matrix4x4 view, projection, delta; ImGuizmo::SetDrawlist(drawList); ImGuizmo::SetRect(offset.x, offset.y, size.x, size.y); project->globalCamera()->getViewTransform(view, projection); - ImGuizmo::DrawCubes(glm::value_ptr(view), glm::value_ptr(projection), glm::value_ptr(matrix), 1); ImGuizmo::OPERATION op = ImGuizmo::TRANSLATE; ImGuizmo::MODE mode = ImGuizmo::LOCAL; - ImGuizmo::Manipulate(glm::value_ptr(view), glm::value_ptr(projection), op, mode, glm::value_ptr(matrix)); + ImGuizmo::DrawCubes(glm::value_ptr(view), glm::value_ptr(projection), glm::value_ptr(m_pivotMatrix), 1); + if (ImGuizmo::IsOver()) { + hovered = false; + } + if (ImGuizmo::Manipulate(glm::value_ptr(view), glm::value_ptr(projection), op, mode, glm::value_ptr(m_pivotMatrix), glm::value_ptr(delta))) { + m_pivotMatrix *= delta; + } } if (m_viewportOverlayPtr) { m_primitive2D.setBaseOffset(offset); @@ -2743,6 +2752,7 @@ ImGuiWindow::drawViewport(nanoem_f32_t viewportHeight, Project *project) } drawList->PopClipRect(); drawViewportParameterBox(project); + project->setViewportHovered(hovered); ImGui::EndChild(); } diff --git a/emapp/src/internal/ModelObjectSelection.cc b/emapp/src/internal/ModelObjectSelection.cc index 44064da4..79099db8 100644 --- a/emapp/src/internal/ModelObjectSelection.cc +++ b/emapp/src/internal/ModelObjectSelection.cc @@ -514,7 +514,7 @@ ModelObjectSelection::areAllBonesMovable() const NANOEM_DECL_NOEXCEPT else { movable = nanoemModelBoneIsMovable(activeBone) != 0; } - return movable && !m_parent->project()->isModelEditing(); + return movable && !m_parent->project()->isModelEditingEnabled(); } bool @@ -535,7 +535,7 @@ ModelObjectSelection::areAllBonesRotateable() const NANOEM_DECL_NOEXCEPT else { rotateable = nanoemModelBoneIsRotateable(activeBone) != 0; } - return rotateable && !m_parent->project()->isModelEditing(); + return rotateable && !m_parent->project()->isModelEditingEnabled(); } bool diff --git a/emapp/src/internal/imgui/ModelParameterDialog.cc b/emapp/src/internal/imgui/ModelParameterDialog.cc index cbdc4482..80ad2c03 100644 --- a/emapp/src/internal/imgui/ModelParameterDialog.cc +++ b/emapp/src/internal/imgui/ModelParameterDialog.cc @@ -147,6 +147,7 @@ ModelParameterDialog::draw(Project *project) toggleTab(kTabTypeInfo, project); } close(); + project->setModelEditingEnabled(visible); return visible; } @@ -612,24 +613,27 @@ ModelParameterDialog::layoutAllMaterials(Project *project) Model *activeModel = project->activeModel(); ScopedMutableMaterial material(m_materials[m_materialIndex], activeModel); ScopedMutableModel model(activeModel); + nanoem_rsize_t numMaterials, offset = 0, size = 0; + nanoem_model_material_t *const *materials = nanoemModelGetAllMaterialObjects(nanoemMutableModelGetOriginObject(model), &numMaterials); + for (nanoem_rsize_t i = 0; i < numMaterials; i++) { + const nanoem_model_material_t *currentMaterialPtr = materials[i]; + const size_t innerSize = nanoemModelMaterialGetNumVertexIndices(currentMaterialPtr); + if (currentMaterialPtr == nanoemMutableModelMaterialGetOriginObject(material)) { + size = innerSize; + break; + } + offset += innerSize; + } + nanoem_rsize_t numIndices, rest; + const nanoem_u32_t *indices = nanoemModelGetAllVertexIndices(nanoemMutableModelGetOriginObject(model), &numIndices); + tinystl::vector workingBuffer(numIndices); + rest = numIndices - offset - size; + memcpy(workingBuffer.data(), indices, numIndices * sizeof(workingBuffer[0])); + memmove(workingBuffer.data() + offset, workingBuffer.data() + offset + size, rest * sizeof(workingBuffer[0])); nanoem_status_t status = NANOEM_STATUS_SUCCESS; - nanoem_rsize_t offsetVertexIndices = 0, numTotalVertexIndices, - numVertexIndices = nanoemModelMaterialGetNumVertexIndices(m_materials[m_materialIndex]); - for (nanoem_rsize_t i = 0; i < m_materialIndex; i++) { - offsetVertexIndices += nanoemModelMaterialGetNumVertexIndices(m_materials[i]); - } - const nanoem_u32_t *vertexIndices = - nanoemModelGetAllVertexIndices(activeModel->data(), &numTotalVertexIndices); - tinystl::vector mutableVertexIndices( - vertexIndices, vertexIndices + numTotalVertexIndices); - mutableVertexIndices.erase(mutableVertexIndices.begin() + offsetVertexIndices, - mutableVertexIndices.begin() + offsetVertexIndices + numVertexIndices); + nanoemMutableModelSetVertexIndices(model, workingBuffer.data(), numIndices - size, &status); nanoemMutableModelRemoveMaterialObject(model, material, &status); - nanoemMutableModelSetVertexIndices( - model, mutableVertexIndices.data(), mutableVertexIndices.size(), &status); - if (m_materialIndex > 0) { - m_materialIndex--; - } + nanoemMutableModelMaterialDestroy(material); ByteArray bytes; Error error; activeModel->save(bytes, error); @@ -653,51 +657,103 @@ ModelParameterDialog::layoutAllMaterials(Project *project) m_parent->addLazyExecutionCommand(nanoem_new(DeleteMaterialCommand(materials, m_materialIndex))); } ImGui::SameLine(); + struct BaseMoveMaterialCommand : ImGuiWindow::ILazyExecutionCommand { + struct LayoutPosition { + size_t m_offset; + size_t m_size; + }; + BaseMoveMaterialCommand(nanoem_model_material_t *const *materials, nanoem_rsize_t &materialIndex) + : m_materials(materials) + , m_materialIndex(materialIndex) + { + } + void move(int destination, const LayoutPosition &from, const LayoutPosition &to, Model *activeModel) { + ScopedMutableMaterial material(m_materials[m_materialIndex], activeModel); + ScopedMutableModel model(activeModel); + nanoem_rsize_t numIndices; + const nanoem_u32_t *indices = nanoemModelGetAllVertexIndices(nanoemMutableModelGetOriginObject(model), &numIndices); + tinystl::vector tempFromBuffer(from.m_size), tempToBuffer(to.m_size); + memcpy(tempFromBuffer.data(), indices + from.m_offset, from.m_size * sizeof(tempToBuffer[0])); + memcpy(tempToBuffer.data(), indices + to.m_offset, to.m_size * sizeof(tempToBuffer[0])); + tinystl::vector workingBuffer(numIndices); + memcpy(workingBuffer.data(), indices, numIndices * sizeof(workingBuffer[0])); + memcpy(workingBuffer.data() + from.m_offset, tempFromBuffer.data(), from.m_size * sizeof(tempFromBuffer[0])); + memcpy(workingBuffer.data() + to.m_offset, tempToBuffer.data(), to.m_size * sizeof(tempToBuffer[0])); + nanoem_status_t status = NANOEM_STATUS_SUCCESS; + nanoemMutableModelSetVertexIndices(model, workingBuffer.data(), numIndices, &status); + nanoemMutableModelRemoveMaterialObject(model, material, &status); + nanoemMutableModelInsertMaterialObject(model, material, destination, &status); + } + nanoem_model_material_t *const *m_materials; + nanoem_rsize_t &m_materialIndex; + }; if (ImGuiWindow::handleButton(reinterpret_cast(ImGuiWindow::kFAArrowUp), 0, m_materialIndex > 0)) { - struct MoveMaterialUpCommand : ImGuiWindow::ILazyExecutionCommand { + struct MoveMaterialUpCommand : BaseMoveMaterialCommand { MoveMaterialUpCommand(nanoem_model_material_t *const *materials, nanoem_rsize_t &materialIndex) - : m_materials(materials) - , m_materialIndex(materialIndex) + : BaseMoveMaterialCommand(materials, materialIndex) { } void execute(Project *project) { + const nanoem_model_material_t *activeMaterial = m_materials[m_materialIndex]; Model *activeModel = project->activeModel(); - ScopedMutableMaterial material(m_materials[m_materialIndex], activeModel); - ScopedMutableModel model(activeModel); - nanoem_status_t status = NANOEM_STATUS_SUCCESS; - nanoemMutableModelRemoveMaterialObject(model, material, &status); - int offset = Inline::saturateInt32(--m_materialIndex); - nanoemMutableModelInsertMaterialObject(model, material, offset, &status); + nanoem_rsize_t numMaterials, offset = 0; + nanoem_model_material_t *const *materials = nanoemModelGetAllMaterialObjects(activeModel->data(), &numMaterials); + LayoutPosition from, to; + int destination = 0; + for (nanoem_rsize_t i = 0; i < numMaterials; i++) { + const nanoem_model_material_t *currentMaterialPtr = materials[i]; + size_t size = nanoemModelMaterialGetNumVertexIndices(currentMaterialPtr); + if (currentMaterialPtr == activeMaterial) { + const nanoem_model_material_t *previousMaterialPtr = materials[i - 1]; + destination = i - 1; + to.m_size = nanoemModelMaterialGetNumVertexIndices(previousMaterialPtr); + to.m_offset = offset - to.m_size; + from.m_offset = offset; + from.m_size = size; + break; + } + offset += size; + } + move(destination, from, to, activeModel); } - nanoem_model_material_t *const *m_materials; - nanoem_rsize_t &m_materialIndex; }; m_parent->addLazyExecutionCommand(nanoem_new(MoveMaterialUpCommand(materials, m_materialIndex))); } ImGui::SameLine(); if (ImGuiWindow::handleButton( reinterpret_cast(ImGuiWindow::kFAArrowDown), 0, m_materialIndex < numMaterials)) { - struct MoveMaterialDownCommand : ImGuiWindow::ILazyExecutionCommand { + struct MoveMaterialDownCommand : BaseMoveMaterialCommand { MoveMaterialDownCommand(nanoem_model_material_t *const *materials, nanoem_rsize_t &materialIndex) - : m_materials(materials) - , m_materialIndex(materialIndex) + : BaseMoveMaterialCommand(materials, materialIndex) { } void execute(Project *project) { + const nanoem_model_material_t *activeMaterial = m_materials[m_materialIndex]; Model *activeModel = project->activeModel(); - ScopedMutableMaterial material(m_materials[m_materialIndex], activeModel); - ScopedMutableModel model(activeModel); - nanoem_status_t status = NANOEM_STATUS_SUCCESS; - nanoemMutableModelRemoveMaterialObject(model, material, &status); - int offset = Inline::saturateInt32(++m_materialIndex); - nanoemMutableModelInsertMaterialObject(model, material, offset, &status); + nanoem_rsize_t numMaterials, offset = 0; + nanoem_model_material_t *const *materials = nanoemModelGetAllMaterialObjects(activeModel->data(), &numMaterials); + LayoutPosition from, to; + int destination = 0; + for (nanoem_rsize_t i = 0; i < numMaterials; i++) { + const nanoem_model_material_t *currentMaterialPtr = materials[i]; + size_t size = nanoemModelMaterialGetNumVertexIndices(currentMaterialPtr); + if (currentMaterialPtr == activeMaterial) { + const nanoem_model_material_t *nextMaterialPtr = materials[i + 1]; + destination = i + 1; + to.m_size = nanoemModelMaterialGetNumVertexIndices(nextMaterialPtr); + to.m_offset = offset + to.m_size; + from.m_offset = offset; + from.m_size = size; + break; + } + offset += size; + } + move(destination, from, to, activeModel); } - nanoem_model_material_t *const *m_materials; - nanoem_rsize_t &m_materialIndex; }; m_parent->addLazyExecutionCommand(nanoem_new(MoveMaterialDownCommand(materials, m_materialIndex))); } diff --git a/emapp/test/project/project_copy_paste_bone_parameters.cc b/emapp/test/project/project_copy_paste_bone_parameters.cc index 07d4c6b0..7e9d9b84 100644 --- a/emapp/test/project/project_copy_paste_bone_parameters.cc +++ b/emapp/test/project/project_copy_paste_bone_parameters.cc @@ -45,8 +45,7 @@ TEST_CASE("project_copy_paste_bone_parameters", "[emapp][project]") activeModel->selection()->addAllBones(); SECTION("apply only on select mode") { - const Project::EditingMode modes[] = { Project::kEditingModeRotate, Project::kEditingModeMove, - Project::kEditingModeEffect }; + const Project::EditingMode modes[] = { Project::kEditingModeRotate, Project::kEditingModeMove }; for (auto it : modes) { project->setEditingMode(it); project->handleCopyAction(error); diff --git a/scripts/build.cmake b/scripts/build.cmake index 96711543..e1bd754d 100644 --- a/scripts/build.cmake +++ b/scripts/build.cmake @@ -589,6 +589,7 @@ function(compile_all_repositories _generator _toolset_option _compiler _arch _co set(_path "${_item}/out/${_platform}/${_compiler}") if(EXISTS ${_path}) file(CREATE_LINK ${_path}/ub ${_path}/arm64 SYMBOLIC) + file(CREATE_LINK ${_path}/ub ${_path}/x86_64 SYMBOLIC) endif() endforeach() endif() From cec89d0c18e98ad0e795b997beccdd9ac95b9df3 Mon Sep 17 00:00:00 2001 From: hkrn <129939+hkrn@users.noreply.github.com> Date: Wed, 17 Mar 2021 00:05:19 +0900 Subject: [PATCH 002/488] [emapp] fix compilation of ImGui docking branch --- emapp/src/internal/ImGuiWindow.cc | 20 +++++++++---------- glfw/st/src/GLFWApplicationService.cc | 6 +++--- .../include/Win32ThreadedApplicationService.h | 2 +- win32/src/MainWindow.cc | 2 +- win32/src/Win32ThreadedApplicationService.cc | 8 ++++---- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/emapp/src/internal/ImGuiWindow.cc b/emapp/src/internal/ImGuiWindow.cc index 27ffda06..50588575 100644 --- a/emapp/src/internal/ImGuiWindow.cc +++ b/emapp/src/internal/ImGuiWindow.cc @@ -1087,7 +1087,7 @@ ImGuiWindow::drawAllWindows(Project *project, nanoem_u32_t flags) renderDrawList(project, ImGui::GetDrawData(), sampleCount, buffer, m_bindings, pb); m_applicationPtr->endDefaultPass(); batchLazySetAllObjects(project, seekable); -#if defined(IMGUI_HAS_VIEWPORT) && IMGUI_HAS_VIEWPORT +#if defined(IMGUI_HAS_VIEWPORT) if (EnumUtils::isEnabledT(ImGui::GetIO().ConfigFlags, ImGuiConfigFlags_ViewportsEnable)) { ImGui::UpdatePlatformWindows(); ImGui::RenderPlatformWindowsDefault(nullptr, this); @@ -1100,7 +1100,7 @@ ImGuiWindow::drawAllWindows(Project *project, nanoem_u32_t flags) void ImGuiWindow::drawWindow(Project *project, ImDrawData *drawData, bool load) { -#if defined(IMGUI_HAS_VIEWPORT) && IMGUI_HAS_VIEWPORT +#if defined(IMGUI_HAS_VIEWPORT) SG_PUSH_GROUPF("ImGuiWindow::drawWindow(ID=%u, x=%.1f, y=%.1f, width=%.1f, height=%.1f)", drawData->OwnerViewport->ID, drawData->OwnerViewport->Pos.x, drawData->OwnerViewport->Pos.y, drawData->OwnerViewport->Size.x, drawData->OwnerViewport->Size.y); @@ -1108,10 +1108,10 @@ ImGuiWindow::drawWindow(Project *project, ImDrawData *drawData, bool load) sg::PassBlock pb; Inline::clearZeroMemory(pa); pa.colors[0].action = pa.depth.action = pa.stencil.action = load ? SG_ACTION_LOAD : SG_ACTION_CLEAR; - pa.colors[0].val[0] = 0.0f; - pa.colors[0].val[1] = 0.5f; - pa.colors[0].val[2] = 0.7f; - pa.colors[0].val[3] = 1.0f; + pa.colors[0].value.r = 0.0f; + pa.colors[0].value.g = 0.5f; + pa.colors[0].value.b = 0.7f; + pa.colors[0].value.a = 1.0f; ImGuiID id = drawData->OwnerViewport->ID; int sampleCount; m_applicationPtr->beginDefaultPass(id, pa, drawData->DisplaySize.x, drawData->DisplaySize.y, sampleCount); @@ -1686,7 +1686,7 @@ ImGuiWindow::drawMainWindow(const Vector2 &deviceScaleWindowSize, Project *proje const nanoem_f32_t deviceScaleRatio = project->windowDevicePixelRatio(); saveDefaultStyle(deviceScaleRatio); ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0); -#if defined(IMGUI_HAS_VIEWPORT) && IMGUI_HAS_VIEWPORT +#if defined(IMGUI_HAS_VIEWPORT) if (EnumUtils::isEnabledT(ImGui::GetIO().ConfigFlags, ImGuiConfigFlags_ViewportsEnable)) { ImGuiViewport *viewport = ImGui::GetMainViewport(); ImGui::SetNextWindowViewport(viewport->ID); @@ -3856,7 +3856,7 @@ ImGuiWindow::setupDeviceInput(Project *project) io.MouseWheelH = static_cast(delta.x); io.MouseWheel = static_cast(delta.y); io.DeltaTime = static_cast(stm_sec(stm_laptime(&m_elapsedTime))); -#if defined(IMGUI_HAS_VIEWPORT) && IMGUI_HAS_VIEWPORT +#if defined(IMGUI_HAS_VIEWPORT) if (EnumUtils::isEnabledT(io.ConfigFlags, ImGuiConfigFlags_ViewportsEnable)) { io.MousePos.x = m_screenCursor.m_x; io.MousePos.y = m_screenCursor.m_y; @@ -3981,7 +3981,7 @@ ImGuiWindow::layoutModalDialogWindow(IModalDialog *dialog, Project *project, con const Vector4 desiredWindowSize(dialog->desiredWindowSize(deviceScaleWindowSize, deviceScaleRatio)); ImVec2 actualWindowPos(desiredWindowSize.x, desiredWindowSize.y), actualWindowSize(desiredWindowSize.z, desiredWindowSize.w); -#if defined(IMGUI_HAS_VIEWPORT) && IMGUI_HAS_VIEWPORT +#if defined(IMGUI_HAS_VIEWPORT) const ImVec2 &viewportPosition = ImGui::GetMainViewport()->Pos; actualWindowPos.x += viewportPosition.x; actualWindowPos.y += viewportPosition.y; @@ -4096,7 +4096,7 @@ ImGuiWindow::renderDrawList(const Project *project, const ImDrawData *drawData, m_pipelines.insert(tinystl::make_pair(hash, pipeline)); } if (drawData->CmdListsCount > 0) { -#if defined(IMGUI_HAS_VIEWPORT) && IMGUI_HAS_VIEWPORT +#if defined(IMGUI_HAS_VIEWPORT) const ImVec2 &displayPos = drawData->DisplayPos, &displaySize = drawData->DisplaySize; const nanoem_f32_t normalizedWidth = 1.0f / displaySize.x, normalizedHeight = 1.0f / displaySize.y; const ImVec4 viewportRect( diff --git a/glfw/st/src/GLFWApplicationService.cc b/glfw/st/src/GLFWApplicationService.cc index 70397ebb..0c2dc5e9 100644 --- a/glfw/st/src/GLFWApplicationService.cc +++ b/glfw/st/src/GLFWApplicationService.cc @@ -25,7 +25,7 @@ namespace nanoem { namespace glfw { namespace { -#if defined(IMGUI_HAS_VIEWPORT) && IMGUI_HAS_VIEWPORT +#if defined(IMGUI_HAS_VIEWPORT) struct ViewportWindow { ViewportWindow(GLFWApplicationService *parent, GLFWApplicationClient::Bridge *bridge); ~ViewportWindow(); @@ -434,7 +434,7 @@ GLFWApplicationService::handleInitializeApplication() auto window = static_cast(userData); glfwSetClipboardString(window, value); }; -#if defined(IMGUI_HAS_VIEWPORT) && IMGUI_HAS_VIEWPORT +#if defined(IMGUI_HAS_VIEWPORT) io.BackendFlags |= ImGuiBackendFlags_PlatformHasViewports; ImGuiPlatformIO &platformIO = ImGui::GetPlatformIO(); platformIO.Platform_CreateWindow = [](ImGuiViewport *viewport) { @@ -538,7 +538,7 @@ GLFWApplicationService::handleInitializeApplication() void GLFWApplicationService::updateAllMonitors() { -#if defined(IMGUI_HAS_VIEWPORT) && IMGUI_HAS_VIEWPORT +#if defined(IMGUI_HAS_VIEWPORT) int numMonitors; GLFWmonitor **monitors = glfwGetMonitors(&numMonitors); ImGuiPlatformIO &io = ImGui::GetPlatformIO(); diff --git a/win32/include/Win32ThreadedApplicationService.h b/win32/include/Win32ThreadedApplicationService.h index 91e04196..5c2853f7 100644 --- a/win32/include/Win32ThreadedApplicationService.h +++ b/win32/include/Win32ThreadedApplicationService.h @@ -24,7 +24,7 @@ namespace win32 { class Win32ThreadedApplicationService final : public ThreadedApplicationService { public: -#if defined(IMGUI_HAS_VIEWPORT) && IMGUI_HAS_VIEWPORT +#if defined(IMGUI_HAS_VIEWPORT) struct ViewportData { enum MessageType { kMessageTypeCreateWindow = WM_USER, diff --git a/win32/src/MainWindow.cc b/win32/src/MainWindow.cc index 65236346..a1ae299b 100644 --- a/win32/src/MainWindow.cc +++ b/win32/src/MainWindow.cc @@ -539,7 +539,7 @@ MainWindow::handleWindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) } return DefWindowProcW(hwnd, msg, wparam, lparam); } -#if defined(IMGUI_HAS_VIEWPORT) && IMGUI_HAS_VIEWPORT +#if defined(IMGUI_HAS_VIEWPORT) case Win32ThreadedApplicationService::ViewportData::kMessageTypeCreateWindow: { auto viewport = reinterpret_cast(wparam); if (auto userData = static_cast(viewport->PlatformUserData)) { diff --git a/win32/src/Win32ThreadedApplicationService.cc b/win32/src/Win32ThreadedApplicationService.cc index 470f5ac7..e942651f 100644 --- a/win32/src/Win32ThreadedApplicationService.cc +++ b/win32/src/Win32ThreadedApplicationService.cc @@ -200,7 +200,7 @@ RenderDocDebugCapture::stop() const nanoem_f32_t Win32ThreadedApplicationService::kStandardDPIValue = 96.0f; const wchar_t Win32ThreadedApplicationService::kRegisterClassName[] = L"nanoem"; -#if defined(IMGUI_HAS_VIEWPORT) && IMGUI_HAS_VIEWPORT +#if defined(IMGUI_HAS_VIEWPORT) Win32ThreadedApplicationService::ViewportData::ViewportData() { @@ -625,7 +625,7 @@ Win32ThreadedApplicationService::handleInitializeApplication() setupNewProject(); HWND window = (HWND) m_nativeView; ImGuiIO &io = ImGui::GetIO(); -#if defined(IMGUI_HAS_VIEWPORT) && IMGUI_HAS_VIEWPORT +#if defined(IMGUI_HAS_VIEWPORT) io.BackendFlags |= ImGuiBackendFlags_PlatformHasViewports; ImGuiPlatformIO &platformIO = ImGui::GetPlatformIO(); platformIO.Platform_CreateWindow = [](ImGuiViewport *viewport) { @@ -935,7 +935,7 @@ Win32ThreadedApplicationService::presentDefaultPass(const Project * /* project * updateAllMonitors(); m_requestUpdatingAllMonitors = false; } -#if defined(IMGUI_HAS_VIEWPORT) && IMGUI_HAS_VIEWPORT +#if defined(IMGUI_HAS_VIEWPORT) if (HWND window = m_requestWindowClose.exchange(nullptr)) { if (ImGuiViewport *viewport = ImGui::FindViewportByPlatformHandle(window)) { viewport->PlatformRequestClose = true; @@ -1060,7 +1060,7 @@ Win32ThreadedApplicationService::setupNewProject() void Win32ThreadedApplicationService::updateAllMonitors() { -#if defined(IMGUI_HAS_VIEWPORT) && IMGUI_HAS_VIEWPORT +#if defined(IMGUI_HAS_VIEWPORT) ImGui::GetPlatformIO().Monitors.resize(0); EnumDisplayMonitors( nullptr, nullptr, From edd8d7ffa5986bc8c1b1d0941e7c183e53f29654 Mon Sep 17 00:00:00 2001 From: hkrn <129939+hkrn@users.noreply.github.com> Date: Wed, 17 Mar 2021 00:07:29 +0900 Subject: [PATCH 003/488] [emapp] fix build on ImGui 1.82 --- emapp/src/internal/ImGuiWindow.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/emapp/src/internal/ImGuiWindow.cc b/emapp/src/internal/ImGuiWindow.cc index 50588575..10907015 100644 --- a/emapp/src/internal/ImGuiWindow.cc +++ b/emapp/src/internal/ImGuiWindow.cc @@ -4312,7 +4312,7 @@ ImGuiWindow::PrimitiveContext::strokeRect( { const ImU32 &col = ImGui::ColorConvertFloat4ToU32(ImVec4(color.x, color.y, color.z, color.w)); const ImVec2 a(m_offset.x + rect.x, m_offset.y + rect.y), b(a.x + rect.z, a.y + rect.w); - ImGui::GetWindowDrawList()->AddRect(a, b, col, roundness, ImDrawCornerFlags_All, thickness * m_scaleFactor); + ImGui::GetWindowDrawList()->AddRect(a, b, col, roundness, ImDrawFlags_RoundCornersAll, thickness * m_scaleFactor); } void @@ -4320,7 +4320,7 @@ ImGuiWindow::PrimitiveContext::fillRect(const Vector4 &rect, const Vector4 &colo { const ImU32 &col = ImGui::ColorConvertFloat4ToU32(ImVec4(color.x, color.y, color.z, color.w)); const ImVec2 a(m_offset.x + rect.x, m_offset.y + rect.y), b(a.x + rect.z, a.y + rect.w); - ImGui::GetWindowDrawList()->AddRectFilled(a, b, col, roundness, ImDrawCornerFlags_All); + ImGui::GetWindowDrawList()->AddRectFilled(a, b, col, roundness, ImDrawFlags_RoundCornersAll); } void From 3b1f98964f99d162b561c76c5d2883028d8ade6a Mon Sep 17 00:00:00 2001 From: hkrn <129939+hkrn@users.noreply.github.com> Date: Thu, 18 Mar 2021 10:23:20 +0900 Subject: [PATCH 004/488] [emapp] add mutex lock to prevent race condition bug --- emapp/include/emapp/DefaultTranslator.h | 3 +++ emapp/src/DefaultTranslator.cc | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/emapp/include/emapp/DefaultTranslator.h b/emapp/include/emapp/DefaultTranslator.h index 34b4738e..8d76aacf 100644 --- a/emapp/include/emapp/DefaultTranslator.h +++ b/emapp/include/emapp/DefaultTranslator.h @@ -11,6 +11,8 @@ #include "emapp/Forward.h" #include "emapp/ITranslator.h" +#include "bx/mutex.h" + namespace nanoem { class DefaultTranslator NANOEM_DECL_SEALED : public ITranslator, private NonCopyable { @@ -33,6 +35,7 @@ class DefaultTranslator NANOEM_DECL_SEALED : public ITranslator, private NonCopy StringMap m_phrases; String m_message; LanguageType m_language; + mutable bx::Mutex m_mutex; }; } /* namespace nanoem */ diff --git a/emapp/src/DefaultTranslator.cc b/emapp/src/DefaultTranslator.cc index 5491f2db..eb53b445 100644 --- a/emapp/src/DefaultTranslator.cc +++ b/emapp/src/DefaultTranslator.cc @@ -33,6 +33,8 @@ bool DefaultTranslator::loadFromMemory(const nanoem_u8_t *ptr, size_t length) { if (Nanoem__Translation__Bundle *bundle = nanoem__translation__bundle__unpack(g_protobufc_allocator, length, ptr)) { + bx::MutexScope scope(m_mutex); + BX_UNUSED_1(scope); m_phrases.clear(); for (size_t i = 0, numUnits = bundle->n_units; i < numUnits; i++) { const Nanoem__Translation__Unit *unit = bundle->units[i]; @@ -54,6 +56,8 @@ DefaultTranslator::loadFromMemory(const nanoem_u8_t *ptr, size_t length) const char * DefaultTranslator::findPhrase(const char *text) const NANOEM_DECL_NOEXCEPT { + bx::MutexScope scope(m_mutex); + BX_UNUSED_1(scope); StringMap::const_iterator it = m_phrases.find(text); return it != m_phrases.end() ? it->second.c_str() : text; } @@ -73,6 +77,8 @@ DefaultTranslator::translate(const char *text) const NANOEM_DECL_NOEXCEPT bool DefaultTranslator::isTranslatable(const char *text) const NANOEM_DECL_NOEXCEPT { + bx::MutexScope scope(m_mutex); + BX_UNUSED_1(scope); return m_phrases.find(text) != m_phrases.end(); } From 5ffce0b842bc4c8552e313e559d874dd5f3c7814 Mon Sep 17 00:00:00 2001 From: hkrn <129939+hkrn@users.noreply.github.com> Date: Thu, 18 Mar 2021 10:04:59 +0900 Subject: [PATCH 005/488] [emapp] clang-format --- emapp/src/internal/ImGuiWindow.cc | 5 ++-- .../internal/imgui/ModelParameterDialog.cc | 27 ++++++++++++------- glfw/st/src/MainWindow.cc | 2 +- win32/src/MainWindow.cc | 4 +-- 4 files changed, 24 insertions(+), 14 deletions(-) diff --git a/emapp/src/internal/ImGuiWindow.cc b/emapp/src/internal/ImGuiWindow.cc index 10907015..734de226 100644 --- a/emapp/src/internal/ImGuiWindow.cc +++ b/emapp/src/internal/ImGuiWindow.cc @@ -1710,7 +1710,7 @@ ImGuiWindow::drawMainWindow(const Vector2 &deviceScaleWindowSize, Project *proje if (m_menu) { m_menu->draw(m_debugger); } - + if (!project->isModelEditingEnabled()) { const ImGuiStyle &style = ImGui::GetStyle(); const nanoem_f32_t panelHeight = @@ -2731,7 +2731,8 @@ ImGuiWindow::drawViewport(nanoem_f32_t viewportHeight, Project *project) if (ImGuizmo::IsOver()) { hovered = false; } - if (ImGuizmo::Manipulate(glm::value_ptr(view), glm::value_ptr(projection), op, mode, glm::value_ptr(m_pivotMatrix), glm::value_ptr(delta))) { + if (ImGuizmo::Manipulate(glm::value_ptr(view), glm::value_ptr(projection), op, mode, + glm::value_ptr(m_pivotMatrix), glm::value_ptr(delta))) { m_pivotMatrix *= delta; } } diff --git a/emapp/src/internal/imgui/ModelParameterDialog.cc b/emapp/src/internal/imgui/ModelParameterDialog.cc index 80ad2c03..47309ba5 100644 --- a/emapp/src/internal/imgui/ModelParameterDialog.cc +++ b/emapp/src/internal/imgui/ModelParameterDialog.cc @@ -614,7 +614,8 @@ ModelParameterDialog::layoutAllMaterials(Project *project) ScopedMutableMaterial material(m_materials[m_materialIndex], activeModel); ScopedMutableModel model(activeModel); nanoem_rsize_t numMaterials, offset = 0, size = 0; - nanoem_model_material_t *const *materials = nanoemModelGetAllMaterialObjects(nanoemMutableModelGetOriginObject(model), &numMaterials); + nanoem_model_material_t *const *materials = + nanoemModelGetAllMaterialObjects(nanoemMutableModelGetOriginObject(model), &numMaterials); for (nanoem_rsize_t i = 0; i < numMaterials; i++) { const nanoem_model_material_t *currentMaterialPtr = materials[i]; const size_t innerSize = nanoemModelMaterialGetNumVertexIndices(currentMaterialPtr); @@ -625,11 +626,13 @@ ModelParameterDialog::layoutAllMaterials(Project *project) offset += innerSize; } nanoem_rsize_t numIndices, rest; - const nanoem_u32_t *indices = nanoemModelGetAllVertexIndices(nanoemMutableModelGetOriginObject(model), &numIndices); + const nanoem_u32_t *indices = + nanoemModelGetAllVertexIndices(nanoemMutableModelGetOriginObject(model), &numIndices); tinystl::vector workingBuffer(numIndices); rest = numIndices - offset - size; memcpy(workingBuffer.data(), indices, numIndices * sizeof(workingBuffer[0])); - memmove(workingBuffer.data() + offset, workingBuffer.data() + offset + size, rest * sizeof(workingBuffer[0])); + memmove(workingBuffer.data() + offset, workingBuffer.data() + offset + size, + rest * sizeof(workingBuffer[0])); nanoem_status_t status = NANOEM_STATUS_SUCCESS; nanoemMutableModelSetVertexIndices(model, workingBuffer.data(), numIndices - size, &status); nanoemMutableModelRemoveMaterialObject(model, material, &status); @@ -657,7 +660,7 @@ ModelParameterDialog::layoutAllMaterials(Project *project) m_parent->addLazyExecutionCommand(nanoem_new(DeleteMaterialCommand(materials, m_materialIndex))); } ImGui::SameLine(); - struct BaseMoveMaterialCommand : ImGuiWindow::ILazyExecutionCommand { + struct BaseMoveMaterialCommand : ImGuiWindow::ILazyExecutionCommand { struct LayoutPosition { size_t m_offset; size_t m_size; @@ -667,17 +670,21 @@ ModelParameterDialog::layoutAllMaterials(Project *project) , m_materialIndex(materialIndex) { } - void move(int destination, const LayoutPosition &from, const LayoutPosition &to, Model *activeModel) { + void + move(int destination, const LayoutPosition &from, const LayoutPosition &to, Model *activeModel) + { ScopedMutableMaterial material(m_materials[m_materialIndex], activeModel); ScopedMutableModel model(activeModel); nanoem_rsize_t numIndices; - const nanoem_u32_t *indices = nanoemModelGetAllVertexIndices(nanoemMutableModelGetOriginObject(model), &numIndices); + const nanoem_u32_t *indices = + nanoemModelGetAllVertexIndices(nanoemMutableModelGetOriginObject(model), &numIndices); tinystl::vector tempFromBuffer(from.m_size), tempToBuffer(to.m_size); memcpy(tempFromBuffer.data(), indices + from.m_offset, from.m_size * sizeof(tempToBuffer[0])); memcpy(tempToBuffer.data(), indices + to.m_offset, to.m_size * sizeof(tempToBuffer[0])); tinystl::vector workingBuffer(numIndices); memcpy(workingBuffer.data(), indices, numIndices * sizeof(workingBuffer[0])); - memcpy(workingBuffer.data() + from.m_offset, tempFromBuffer.data(), from.m_size * sizeof(tempFromBuffer[0])); + memcpy( + workingBuffer.data() + from.m_offset, tempFromBuffer.data(), from.m_size * sizeof(tempFromBuffer[0])); memcpy(workingBuffer.data() + to.m_offset, tempToBuffer.data(), to.m_size * sizeof(tempToBuffer[0])); nanoem_status_t status = NANOEM_STATUS_SUCCESS; nanoemMutableModelSetVertexIndices(model, workingBuffer.data(), numIndices, &status); @@ -699,7 +706,8 @@ ModelParameterDialog::layoutAllMaterials(Project *project) const nanoem_model_material_t *activeMaterial = m_materials[m_materialIndex]; Model *activeModel = project->activeModel(); nanoem_rsize_t numMaterials, offset = 0; - nanoem_model_material_t *const *materials = nanoemModelGetAllMaterialObjects(activeModel->data(), &numMaterials); + nanoem_model_material_t *const *materials = + nanoemModelGetAllMaterialObjects(activeModel->data(), &numMaterials); LayoutPosition from, to; int destination = 0; for (nanoem_rsize_t i = 0; i < numMaterials; i++) { @@ -735,7 +743,8 @@ ModelParameterDialog::layoutAllMaterials(Project *project) const nanoem_model_material_t *activeMaterial = m_materials[m_materialIndex]; Model *activeModel = project->activeModel(); nanoem_rsize_t numMaterials, offset = 0; - nanoem_model_material_t *const *materials = nanoemModelGetAllMaterialObjects(activeModel->data(), &numMaterials); + nanoem_model_material_t *const *materials = + nanoemModelGetAllMaterialObjects(activeModel->data(), &numMaterials); LayoutPosition from, to; int destination = 0; for (nanoem_rsize_t i = 0; i < numMaterials; i++) { diff --git a/glfw/st/src/MainWindow.cc b/glfw/st/src/MainWindow.cc index 0d0b5793..b18faf45 100644 --- a/glfw/st/src/MainWindow.cc +++ b/glfw/st/src/MainWindow.cc @@ -159,7 +159,7 @@ MainWindow::initialize() desc.m_handlerFilePath = json_object_dotget_string(config, "glfw.sentry.handler.path"); desc.m_isModelEditingEnabled = preference.isModelEditingEnabled(); desc.m_localeName = json_object_dotget_string(config, "project.locale"); - desc.m_maskString = [](const char* value) { return sentry_value_new_string(value); }; + desc.m_maskString = [](const char *value) { return sentry_value_new_string(value); }; desc.m_rendererName = nullptr; desc.m_transportSendEnvelope = nullptr; desc.m_transportUserData = nullptr; diff --git a/win32/src/MainWindow.cc b/win32/src/MainWindow.cc index a1ae299b..0fb061eb 100644 --- a/win32/src/MainWindow.cc +++ b/win32/src/MainWindow.cc @@ -2152,8 +2152,8 @@ MainWindow::registerAllPrerequisiteEventListeners() StringUtils::getMultiBytesString(userProfilePath, userProfileString); std::string maskedPathString(value, StringUtils::length(value)); size_t startPos = 0, len = userProfileString.size() - 1; - while ((startPos = maskedPathString.find(userProfileString.data(), startPos)) != - std::string::npos) { + while ( + (startPos = maskedPathString.find(userProfileString.data(), startPos)) != std::string::npos) { maskedPathString.replace(startPos, len, "{HOME}"); startPos += len; } From 995b1c798df9ecff2db1f2df8f0040637e1e3460 Mon Sep 17 00:00:00 2001 From: hkrn <129939+hkrn@users.noreply.github.com> Date: Thu, 18 Mar 2021 10:05:23 +0900 Subject: [PATCH 006/488] [macOS] add tracking area configuration --- macos/classes/MainWindow.h | 1 + macos/classes/MainWindow.mm | 44 ++++++++++++++++++++++++++++++++++++- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/macos/classes/MainWindow.h b/macos/classes/MainWindow.h index 37c64d4b..77d0f9d7 100644 --- a/macos/classes/MainWindow.h +++ b/macos/classes/MainWindow.h @@ -71,6 +71,7 @@ class MainWindow : private NonCopyable { void handleMouseMoved(const NSEvent *event); void handleMouseDragged(const NSEvent *event); void handleMouseUp(const NSEvent *event); + void handleMouseExit(const NSEvent *event); void handleRightMouseDown(const NSEvent *event); void handleRightMouseDragged(const NSEvent *event); void handleRightMouseUp(const NSEvent *event); diff --git a/macos/classes/MainWindow.mm b/macos/classes/MainWindow.mm index fca1845b..41f68a03 100644 --- a/macos/classes/MainWindow.mm +++ b/macos/classes/MainWindow.mm @@ -73,6 +73,7 @@ @interface MainWindowOpenGLView : NSOpenGLView { macos::MainWindow *m_window; + NSTrackingArea *m_trackingArea; } - (instancetype)initWithFrame:(NSRect)frameRect @@ -85,6 +86,7 @@ - (BOOL)performDragOperation:(id)sender; @interface MainWindowMetalView : MTKView { macos::MainWindow *m_window; + NSTrackingArea *m_trackingArea; } - (instancetype)initWithFrame:(CGRect)frameRect device:(id)device mainWindow:(macos::MainWindow *)window; @@ -105,6 +107,18 @@ - (instancetype)initWithFrame:(NSRect)frameRect return self; } +- (void)updateTrackingAreas +{ + if (m_trackingArea != nil) { + [self removeTrackingArea:m_trackingArea]; + } + const NSTrackingAreaOptions options = NSTrackingMouseEnteredAndExited | NSTrackingActiveInKeyWindow | + NSTrackingEnabledDuringMouseDrag | NSTrackingCursorUpdate | NSTrackingInVisibleRect | NSTrackingAssumeInside; + m_trackingArea = [[NSTrackingArea alloc] initWithRect:self.bounds options:options owner:self userInfo:nil]; + [self addTrackingArea:m_trackingArea]; + [super updateTrackingAreas]; +} + - (NSDragOperation)draggingEntered:(id)sender { return handleDraggingEntered(sender); @@ -142,6 +156,11 @@ - (void)mouseUp:(NSEvent *)event m_window->handleMouseUp(event); } +- (void)mouseExited:(NSEvent *)event +{ + m_window->handleMouseExit(event); +} + - (void)rightMouseDown:(NSEvent *)event { m_window->handleRightMouseDown(event); @@ -272,6 +291,18 @@ - (instancetype)initWithFrame:(CGRect)frameRect device:(id)device mai return self; } +- (void)updateTrackingAreas +{ + if (m_trackingArea != nil) { + [self removeTrackingArea:m_trackingArea]; + } + const NSTrackingAreaOptions options = NSTrackingMouseEnteredAndExited | NSTrackingActiveInKeyWindow | + NSTrackingEnabledDuringMouseDrag | NSTrackingCursorUpdate | NSTrackingInVisibleRect | NSTrackingAssumeInside; + m_trackingArea = [[NSTrackingArea alloc] initWithRect:self.bounds options:options owner:self userInfo:nil]; + [self addTrackingArea:m_trackingArea]; + [super updateTrackingAreas]; +} + - (NSDragOperation)draggingEntered:(id)sender { return handleDraggingEntered(sender); @@ -309,6 +340,11 @@ - (void)mouseUp:(NSEvent *)event m_window->handleMouseUp(event); } +- (void)mouseExited:(NSEvent *)event +{ + m_window->handleMouseExit(event); +} + - (void)rightMouseDown:(NSEvent *)event { m_window->handleRightMouseDown(event); @@ -749,6 +785,12 @@ - (NSAttributedString *)attributedString } } +void +MainWindow::handleMouseExit(const NSEvent *event) +{ + handleMouseUp(event); +} + void MainWindow::handleRightMouseDown(const NSEvent *event) { @@ -1589,7 +1631,7 @@ - (NSAttributedString *)attributedString BaseApplicationService::SentryDescription desc; NSString *clientUUID = self->m_preference->clientUUID(); desc.m_clientUUID = clientUUID.UTF8String; - desc.m_databaseDirectoryPath =json_object_dotget_string(config, "macos.sentry.database.path"); + desc.m_databaseDirectoryPath = json_object_dotget_string(config, "macos.sentry.database.path"); desc.m_deviceModelName = hardwareModelName; desc.m_dllFilePath = libSentryDllURL.path.UTF8String; desc.m_dsn = sentryDSN; From dd5ce669f1c548fa899f2665245960d9a453d1a0 Mon Sep 17 00:00:00 2001 From: hkrn <129939+hkrn@users.noreply.github.com> Date: Thu, 18 Mar 2021 23:13:45 +0900 Subject: [PATCH 007/488] [emapp] make selection work and add face selection --- emapp/include/emapp/IModelObjectSelection.h | 4 + .../emapp/internal/ModelObjectSelection.h | 6 + .../internal/imgui/ModelParameterDialog.h | 2 + emapp/src/StateController.cc | 292 ++++++++++++------ emapp/src/internal/ModelObjectSelection.cc | 30 ++ .../internal/imgui/ModelParameterDialog.cc | 163 +++++----- 6 files changed, 336 insertions(+), 161 deletions(-) diff --git a/emapp/include/emapp/IModelObjectSelection.h b/emapp/include/emapp/IModelObjectSelection.h index 1fba3c85..39819b56 100644 --- a/emapp/include/emapp/IModelObjectSelection.h +++ b/emapp/include/emapp/IModelObjectSelection.h @@ -45,6 +45,7 @@ class IModelObjectSelection { kSelectTargetModeTypeCircle, kSelectTargetModeTypeMaxEnum }; + virtual ~IModelObjectSelection() NANOEM_DECL_NOEXCEPT { } @@ -57,6 +58,7 @@ class IModelObjectSelection { virtual void addRigidBody(const nanoem_model_rigid_body_t *value) = 0; virtual void addJoint(const nanoem_model_joint_t *value) = 0; virtual void addSoftBody(const nanoem_model_soft_body_t *value) = 0; + virtual void addFace(const Vector3UI32 &value) = 0; virtual void addAllBones() = 0; virtual void addAllDirtyBones() = 0; virtual void addAllMovableBones() = 0; @@ -69,6 +71,7 @@ class IModelObjectSelection { virtual void removeRigidBody(const nanoem_model_rigid_body_t *value) = 0; virtual void removeJoint(const nanoem_model_joint_t *value) = 0; virtual void removeSoftBody(const nanoem_model_soft_body_t *value) = 0; + virtual void removeFace(const Vector3UI32 &value) = 0; virtual void removeAllVertices() = 0; virtual void removeAllBones() = 0; virtual void removeAllMaterials() = 0; @@ -77,6 +80,7 @@ class IModelObjectSelection { virtual void removeAllRigidBodies() = 0; virtual void removeAllJoints() = 0; virtual void removeAllSoftBodies() = 0; + virtual void removeAllFaces() = 0; virtual void clearAll() = 0; virtual void toggleSelectAndActiveBone(const nanoem_model_bone_t *bone, bool isMultipleSelection) = 0; diff --git a/emapp/include/emapp/internal/ModelObjectSelection.h b/emapp/include/emapp/internal/ModelObjectSelection.h index eafda5e7..dabc8993 100644 --- a/emapp/include/emapp/internal/ModelObjectSelection.h +++ b/emapp/include/emapp/internal/ModelObjectSelection.h @@ -26,6 +26,7 @@ class ModelObjectSelection NANOEM_DECL_SEALED : public IModelObjectSelection { void addRigidBody(const nanoem_model_rigid_body_t *value) NANOEM_DECL_OVERRIDE; void addJoint(const nanoem_model_joint_t *value) NANOEM_DECL_OVERRIDE; void addSoftBody(const nanoem_model_soft_body_t *value) NANOEM_DECL_OVERRIDE; + void addFace(const Vector3UI32 &value) NANOEM_DECL_OVERRIDE; void addAllBones() NANOEM_DECL_OVERRIDE; void addAllDirtyBones() NANOEM_DECL_OVERRIDE; void addAllMovableBones() NANOEM_DECL_OVERRIDE; @@ -38,6 +39,7 @@ class ModelObjectSelection NANOEM_DECL_SEALED : public IModelObjectSelection { void removeRigidBody(const nanoem_model_rigid_body_t *value) NANOEM_DECL_OVERRIDE; void removeJoint(const nanoem_model_joint_t *value) NANOEM_DECL_OVERRIDE; void removeSoftBody(const nanoem_model_soft_body_t *value) NANOEM_DECL_OVERRIDE; + void removeFace(const Vector3UI32 &value) NANOEM_DECL_OVERRIDE; void removeAllVertices() NANOEM_DECL_OVERRIDE; void removeAllBones() NANOEM_DECL_OVERRIDE; void removeAllMaterials() NANOEM_DECL_OVERRIDE; @@ -46,6 +48,7 @@ class ModelObjectSelection NANOEM_DECL_SEALED : public IModelObjectSelection { void removeAllRigidBodies() NANOEM_DECL_OVERRIDE; void removeAllJoints() NANOEM_DECL_OVERRIDE; void removeAllSoftBodies() NANOEM_DECL_OVERRIDE; + void removeAllFaces() NANOEM_DECL_OVERRIDE; void clearAll() NANOEM_DECL_OVERRIDE; void toggleSelectAndActiveBone(const nanoem_model_bone_t *bone, bool isMultipleSelection) NANOEM_DECL_OVERRIDE; @@ -95,6 +98,8 @@ class ModelObjectSelection NANOEM_DECL_SEALED : public IModelObjectSelection { void setTargetMode(SelectTargetModeType value) NANOEM_DECL_OVERRIDE; private: + typedef tinystl::unordered_set FaceSet; + Model *m_parent; model::Vertex::Set m_selectedVertexSet; model::Bone::Set m_selectedBoneSet; @@ -104,6 +109,7 @@ class ModelObjectSelection NANOEM_DECL_SEALED : public IModelObjectSelection { model::RigidBody::Set m_selectedRigidBodySet; model::Joint::Set m_selectedJointSet; model::SoftBody::Set m_selectedSoftBodySet; + FaceSet m_selectedFaceSet; nanoem_model_vertex_t *m_hoveredVertex; nanoem_model_material_t *m_hoveredMaterial; nanoem_model_bone_t *m_hoveredBone; diff --git a/emapp/include/emapp/internal/imgui/ModelParameterDialog.h b/emapp/include/emapp/internal/imgui/ModelParameterDialog.h index a884e30f..28366b84 100644 --- a/emapp/include/emapp/internal/imgui/ModelParameterDialog.h +++ b/emapp/include/emapp/internal/imgui/ModelParameterDialog.h @@ -463,6 +463,8 @@ struct ModelParameterDialog : BaseNonModalDialogWindow { void layoutSoftBodyPropertyPane(nanoem_model_soft_body_t *softBodyPtr, Project *project); bool layoutName(const nanoem_unicode_string_t *namePtr, Project *project, StringUtils::UnicodeStringScope &scope); void toggleTab(TabType value, Project *project); + void beforeToggleTab(Project *project); + void afterToggleTab(TabType value, Project *project); void forceUpdateMorph(model::Morph *morph, Project *project); const char *selectedCodecType(const nanoem_codec_type_t type) const NANOEM_DECL_NOEXCEPT; diff --git a/emapp/src/StateController.cc b/emapp/src/StateController.cc index 7e729ecf..c4f6ee3e 100644 --- a/emapp/src/StateController.cc +++ b/emapp/src/StateController.cc @@ -452,7 +452,7 @@ class BaseSelectionState : public BaseDraggingObjectState { } virtual const char *name() const = 0; - virtual void performRectangleSelection(Project *project) = 0; + virtual void commitSelection(Model *model, const Project *project, bool removeAll) = 0; internal::IDraggingState * createTranslateState(int axisIndex, const Vector3SI32 &logicalScalePosition, Project *project) NANOEM_DECL_OVERRIDE @@ -512,7 +512,13 @@ class BaseSelectionState : public BaseDraggingObjectState { void onRelease(const Vector3SI32 &logicalScalePosition) NANOEM_DECL_OVERRIDE { + Project *project = m_stateControllerPtr->currentProject(); + bool removeAll = + EnumUtils::isEnabledT(Project::kCursorModifierTypeShift, logicalScalePosition.z) ? false : true; updateRegion(Vector4SI32(m_lastPosition, Vector2SI32(logicalScalePosition) - m_lastPosition)); + if (Model *model = project->activeModel()) { + commitSelection(model, project, removeAll); + } m_lastPosition = Vector2(); } void @@ -537,7 +543,6 @@ class BaseSelectionState : public BaseDraggingObjectState { m_rect.w *= -1; m_rect.y -= m_rect.w; } - performRectangleSelection(project); } Vector4SI32 m_rect; @@ -560,23 +565,23 @@ class DraggingBoxSelectedBoneState NANOEM_DECL_SEALED : public BaseSelectionStat return "nanoem.gui.viewport.box-selection"; } void - performRectangleSelection(Project *project) NANOEM_DECL_OVERRIDE + commitSelection(Model *model, const Project *project, bool removeAll) NANOEM_DECL_OVERRIDE { - if (Model *model = project->activeModel()) { - const Vector4SI32 rect(deviceScaleRect(project)); - nanoem_rsize_t numBones; - nanoem_model_bone_t *const *bones = nanoemModelGetAllBoneObjects(model->data(), &numBones); - const ICamera *camera = project->activeCamera(); - IModelObjectSelection *selection = model->selection(); + const Vector4SI32 rect(deviceScaleRect(project)); + nanoem_rsize_t numBones; + nanoem_model_bone_t *const *bones = nanoemModelGetAllBoneObjects(model->data(), &numBones); + const ICamera *camera = project->activeCamera(); + IModelObjectSelection *selection = model->selection(); + if (removeAll) { selection->removeAllBones(); - for (nanoem_rsize_t i = 0; i < numBones; i++) { - const nanoem_model_bone_t *bonePtr = bones[i]; - const model::Bone *bone = model::Bone::cast(bonePtr); - const Vector3 position(model->worldTransform(bone->worldTransform())[3]); - const Vector2 coord(camera->toDeviceScreenCoordinateInViewport(position)); - if (Inline::intersectsRectPoint(rect, coord)) { - selection->addBone(bonePtr); - } + } + for (nanoem_rsize_t i = 0; i < numBones; i++) { + const nanoem_model_bone_t *bonePtr = bones[i]; + const model::Bone *bone = model::Bone::cast(bonePtr); + const Vector3 position(model->worldTransform(bone->worldTransform())[3]); + const Vector2 coord(camera->toDeviceScreenCoordinateInViewport(position)); + if (Inline::intersectsRectPoint(rect, coord)) { + selection->addBone(bonePtr); } } } @@ -599,29 +604,134 @@ class DraggingVertexSelectionState NANOEM_DECL_SEALED : public BaseSelectionStat return "nanoem.gui.viewport.select.vertex"; } void - performRectangleSelection(Project *project) NANOEM_DECL_OVERRIDE + commitSelection(Model *model, const Project *project, bool removeAll) NANOEM_DECL_OVERRIDE { - if (Model *model = project->activeModel()) { - const Vector4SI32 rect(deviceScaleRect(project)); - nanoem_rsize_t numVertices; - nanoem_model_vertex_t *const *vertices = nanoemModelGetAllVertexObjects(model->data(), &numVertices); - const ICamera *camera = project->activeCamera(); - IModelObjectSelection *selection = model->selection(); + const Vector4SI32 rect(deviceScaleRect(project)); + nanoem_rsize_t numVertices; + nanoem_model_vertex_t *const *vertices = nanoemModelGetAllVertexObjects(model->data(), &numVertices); + const ICamera *camera = project->activeCamera(); + IModelObjectSelection *selection = model->selection(); + if (removeAll) { + selection->removeAllVertices(); + } + for (nanoem_rsize_t i = 0; i < numVertices; i++) { + const nanoem_model_vertex_t *vertexPtr = vertices[i]; + const model::Vertex *vertex = model::Vertex::cast(vertexPtr); + const bx::simd128_t v = vertex->m_simd.m_origin; + const Vector3 position(bx::simd_x(v), bx::simd_y(v), bx::simd_z(v)); + const Vector2 coord(camera->toDeviceScreenCoordinateInViewport(position)); + if (Inline::intersectsRectPoint(rect, coord)) { + selection->addVertex(vertexPtr); + } + } + } +}; + +class DraggingFaceSelectionState NANOEM_DECL_SEALED : public BaseSelectionState { +public: + DraggingFaceSelectionState(StateController *stateController, BaseApplicationService *application) + : BaseSelectionState(stateController, application) + { + } + ~DraggingFaceSelectionState() NANOEM_DECL_NOEXCEPT + { + } + +private: + const char * + name() const NANOEM_DECL_OVERRIDE + { + return "nanoem.gui.viewport.select.face"; + } + void + commitSelection(Model *model, const Project *project, bool removeAll) NANOEM_DECL_OVERRIDE + { + const Vector4SI32 rect(deviceScaleRect(project)); + nanoem_rsize_t numVertices, numMaterials, numIndices; + nanoem_model_vertex_t *const *vertices = nanoemModelGetAllVertexObjects(model->data(), &numVertices); + nanoem_model_material_t *const *materials = nanoemModelGetAllMaterialObjects(model->data(), &numMaterials); + const nanoem_u32_t *indices = nanoemModelGetAllVertexIndices(model->data(), &numIndices); + const ICamera *camera = project->activeCamera(); + IModelObjectSelection *selection = model->selection(); + if (removeAll) { selection->removeAllVertices(); - for (nanoem_rsize_t i = 0; i < numVertices; i++) { - const nanoem_model_vertex_t *vertexPtr = vertices[i]; - const model::Vertex *vertex = model::Vertex::cast(vertexPtr); - const bx::simd128_t v = vertex->m_simd.m_origin; - const Vector3 position(bx::simd_x(v), bx::simd_y(v), bx::simd_z(v)); - const Vector2 coord(camera->toDeviceScreenCoordinateInViewport(position)); + } + for (nanoem_rsize_t i = 0, offset = 0; i < numMaterials; i++) { + const nanoem_f32_t numVI = nanoemModelMaterialGetNumVertexIndices(materials[i]); + for (nanoem_rsize_t j = 0; j < numVI; j += 3) { + const nanoem_rsize_t o = offset + j; + const nanoem_u32_t i0 = indices[o], i1 = indices[o + 1], i2 = indices[o + 2]; + const nanoem_model_vertex_t *v0 = vertices[i0], *v1 = vertices[i1], *v2 = vertices[i2]; + const Vector3 o0(glm::make_vec3(nanoemModelVertexGetOrigin(v0))), + o1(glm::make_vec3(nanoemModelVertexGetOrigin(v1))), + o2(glm::make_vec3(nanoemModelVertexGetOrigin(v2))), + baryCenter(o0 + (o1 - o0) * 0.5f + (o2 - o0) * 0.5f); + const Vector2 coord(camera->toDeviceScreenCoordinateInViewport(baryCenter)); if (Inline::intersectsRectPoint(rect, coord)) { - selection->addVertex(vertexPtr); + const Vector3UI32 face(i0, i1, i2); + selection->addFace(face); } } } } }; +class DraggingMaterialSelectionState NANOEM_DECL_SEALED : public BaseSelectionState { +public: + DraggingMaterialSelectionState(StateController *stateController, BaseApplicationService *application) + : BaseSelectionState(stateController, application) + { + } + ~DraggingMaterialSelectionState() NANOEM_DECL_NOEXCEPT + { + } + +private: + const char * + name() const NANOEM_DECL_OVERRIDE + { + return "nanoem.gui.viewport.select.material"; + } + void + commitSelection(Model *model, const Project *project, bool removeAll) NANOEM_DECL_OVERRIDE + { + const Vector4SI32 rect(deviceScaleRect(project)); + nanoem_rsize_t numVertices, numMaterials, numIndices; + nanoem_model_vertex_t *const *vertices = nanoemModelGetAllVertexObjects(model->data(), &numVertices); + nanoem_model_material_t *const *materials = nanoemModelGetAllMaterialObjects(model->data(), &numMaterials); + const nanoem_u32_t *indices = nanoemModelGetAllVertexIndices(model->data(), &numIndices); + const ICamera *camera = project->activeCamera(); + IModelObjectSelection *selection = model->selection(); + if (removeAll) { + selection->removeAllMaterials(); + } + for (nanoem_rsize_t i = 0, offset = 0; i < numMaterials; i++) { + const nanoem_model_material_t *materialPtr = materials[i]; + const nanoem_f32_t numVI = nanoemModelMaterialGetNumVertexIndices(materialPtr); + Vector3 aabbMin(FLT_MAX), aabbMax(FLT_MIN); + for (nanoem_rsize_t j = 0; j < numVI; j += 3) { + const nanoem_rsize_t o = offset + j; + const nanoem_u32_t i0 = indices[o], i1 = indices[o + 1], i2 = indices[o + 2]; + const nanoem_model_vertex_t *v0 = vertices[i0], *v1 = vertices[i1], *v2 = vertices[i2]; + const Vector3 o0(glm::make_vec3(nanoemModelVertexGetOrigin(v0))), + o1(glm::make_vec3(nanoemModelVertexGetOrigin(v1))), + o2(glm::make_vec3(nanoemModelVertexGetOrigin(v2))); + aabbMin = glm::min(aabbMin, o0); + aabbMin = glm::min(aabbMin, o1); + aabbMin = glm::min(aabbMin, o2); + aabbMax = glm::max(aabbMax, o0); + aabbMax = glm::max(aabbMax, o1); + aabbMax = glm::max(aabbMax, o2); + } + const Vector3 baryCenter((aabbMin + aabbMax) * 0.5f); + const Vector2 coord(camera->toDeviceScreenCoordinateInViewport(baryCenter)); + if (Inline::intersectsRectPoint(rect, coord)) { + selection->addMaterial(materialPtr); + } + } + } +}; + class DraggingBoneSelectionState NANOEM_DECL_SEALED : public BaseSelectionState { public: DraggingBoneSelectionState(StateController *stateController, BaseApplicationService *application) @@ -639,23 +749,23 @@ class DraggingBoneSelectionState NANOEM_DECL_SEALED : public BaseSelectionState return "nanoem.gui.viewport.select.bone"; } void - performRectangleSelection(Project *project) NANOEM_DECL_OVERRIDE + commitSelection(Model *model, const Project *project, bool removeAll) NANOEM_DECL_OVERRIDE { - if (Model *model = project->activeModel()) { - const Vector4SI32 rect(deviceScaleRect(project)); - nanoem_rsize_t numBones; - nanoem_model_bone_t *const *bones = nanoemModelGetAllBoneObjects(model->data(), &numBones); - const ICamera *camera = project->activeCamera(); - IModelObjectSelection *selection = model->selection(); + const Vector4SI32 rect(deviceScaleRect(project)); + nanoem_rsize_t numBones; + nanoem_model_bone_t *const *bones = nanoemModelGetAllBoneObjects(model->data(), &numBones); + const ICamera *camera = project->activeCamera(); + IModelObjectSelection *selection = model->selection(); + if (removeAll) { selection->removeAllBones(); - for (nanoem_rsize_t i = 0; i < numBones; i++) { - const nanoem_model_bone_t *bonePtr = bones[i]; - const model::Bone *bone = model::Bone::cast(bonePtr); - const Vector3 position(model->worldTransform(bone->worldTransform())[3]); - const Vector2 coord(camera->toDeviceScreenCoordinateInViewport(position)); - if (Inline::intersectsRectPoint(rect, coord)) { - selection->addBone(bonePtr); - } + } + for (nanoem_rsize_t i = 0; i < numBones; i++) { + const nanoem_model_bone_t *bonePtr = bones[i]; + const model::Bone *bone = model::Bone::cast(bonePtr); + const Vector3 position(model->worldTransform(bone->worldTransform())[3]); + const Vector2 coord(camera->toDeviceScreenCoordinateInViewport(position)); + if (Inline::intersectsRectPoint(rect, coord)) { + selection->addBone(bonePtr); } } } @@ -678,26 +788,25 @@ class DraggingRigidBodySelectionState NANOEM_DECL_SEALED : public BaseSelectionS return "nanoem.gui.viewport.select.rigid-body"; } void - performRectangleSelection(Project *project) NANOEM_DECL_OVERRIDE + commitSelection(Model *model, const Project *project, bool removeAll) NANOEM_DECL_OVERRIDE { - if (Model *model = project->activeModel()) { - const Vector4SI32 rect(deviceScaleRect(project)); - nanoem_rsize_t numRigidBodies; - nanoem_model_rigid_body_t *const *bodies = - nanoemModelGetAllRigidBodyObjects(model->data(), &numRigidBodies); - const ICamera *camera = project->activeCamera(); - IModelObjectSelection *selection = model->selection(); + const Vector4SI32 rect(deviceScaleRect(project)); + nanoem_rsize_t numRigidBodies; + nanoem_model_rigid_body_t *const *bodies = nanoemModelGetAllRigidBodyObjects(model->data(), &numRigidBodies); + const ICamera *camera = project->activeCamera(); + IModelObjectSelection *selection = model->selection(); + if (removeAll) { selection->removeAllRigidBodies(); - Matrix4x4 worldTransform; - for (nanoem_rsize_t i = 0; i < numRigidBodies; i++) { - const nanoem_model_rigid_body_t *bodyPtr = bodies[i]; - const model::RigidBody *body = model::RigidBody::cast(bodyPtr); - worldTransform = body->worldTransform(); - const Vector3 position(model->worldTransform(worldTransform)[3]); - const Vector2 coord(camera->toDeviceScreenCoordinateInViewport(position)); - if (Inline::intersectsRectPoint(rect, coord)) { - selection->addRigidBody(bodyPtr); - } + } + Matrix4x4 worldTransform; + for (nanoem_rsize_t i = 0; i < numRigidBodies; i++) { + const nanoem_model_rigid_body_t *bodyPtr = bodies[i]; + const model::RigidBody *body = model::RigidBody::cast(bodyPtr); + worldTransform = body->worldTransform(); + const Vector3 position(model->worldTransform(worldTransform)[3]); + const Vector2 coord(camera->toDeviceScreenCoordinateInViewport(position)); + if (Inline::intersectsRectPoint(rect, coord)) { + selection->addRigidBody(bodyPtr); } } } @@ -720,30 +829,30 @@ class DraggingJointSelectionState NANOEM_DECL_SEALED : public BaseSelectionState return "nanoem.gui.viewport.select.joint"; } void - performRectangleSelection(Project *project) NANOEM_DECL_OVERRIDE + commitSelection(Model *model, const Project *project, bool removeAll) NANOEM_DECL_OVERRIDE { - if (Model *model = project->activeModel()) { - const Vector4SI32 rect(deviceScaleRect(project)); - nanoem_rsize_t numJoints; - nanoem_model_joint_t *const *joints = nanoemModelGetAllJointObjects(model->data(), &numJoints); - const ICamera *camera = project->activeCamera(); - IModelObjectSelection *selection = model->selection(); + const Vector4SI32 rect(deviceScaleRect(project)); + nanoem_rsize_t numJoints; + nanoem_model_joint_t *const *joints = nanoemModelGetAllJointObjects(model->data(), &numJoints); + const ICamera *camera = project->activeCamera(); + IModelObjectSelection *selection = model->selection(); + if (removeAll) { selection->removeAllJoints(); - Matrix4x4 worldTransformA, worldTransformB; - for (nanoem_rsize_t i = 0; i < numJoints; i++) { - const nanoem_model_joint_t *jointPtr = joints[i]; - const model::Joint *joint = model::Joint::cast(jointPtr); - joint->getWorldTransformA(glm::value_ptr(worldTransformA)); - const Vector3 positionA(model->worldTransform(worldTransformA)[3]); - const Vector2 coordA(camera->toDeviceScreenCoordinateInViewport(positionA)); - if (Inline::intersectsRectPoint(rect, coordA)) { - selection->addJoint(jointPtr); - } - const Vector3 positionB(model->worldTransform(worldTransformB)[3]); - const Vector2 coordB(camera->toDeviceScreenCoordinateInViewport(positionB)); - if (Inline::intersectsRectPoint(rect, coordB)) { - selection->addJoint(jointPtr); - } + } + Matrix4x4 worldTransformA, worldTransformB; + for (nanoem_rsize_t i = 0; i < numJoints; i++) { + const nanoem_model_joint_t *jointPtr = joints[i]; + const model::Joint *joint = model::Joint::cast(jointPtr); + joint->getWorldTransformA(glm::value_ptr(worldTransformA)); + const Vector3 positionA(model->worldTransform(worldTransformA)[3]); + const Vector2 coordA(camera->toDeviceScreenCoordinateInViewport(positionA)); + if (Inline::intersectsRectPoint(rect, coordA)) { + selection->addJoint(jointPtr); + } + const Vector3 positionB(model->worldTransform(worldTransformB)[3]); + const Vector2 coordB(camera->toDeviceScreenCoordinateInViewport(positionB)); + if (Inline::intersectsRectPoint(rect, coordB)) { + selection->addJoint(jointPtr); } } } @@ -1261,20 +1370,25 @@ StateController::setPrimaryDraggingState(Project *project, const Vector2SI32 &lo case IModelObjectSelection::kEditingTypeBone: state = nanoem_new(DraggingBoneSelectionState(this, m_applicationPtr)); break; + case IModelObjectSelection::kEditingTypeFace: + state = nanoem_new(DraggingFaceSelectionState(this, m_applicationPtr)); + break; case IModelObjectSelection::kEditingTypeJoint: state = nanoem_new(DraggingJointSelectionState(this, m_applicationPtr)); break; + case IModelObjectSelection::kEditingTypeMaterial: + state = nanoem_new(DraggingMaterialSelectionState(this, m_applicationPtr)); + break; case IModelObjectSelection::kEditingTypeRigidBody: state = nanoem_new(DraggingRigidBodySelectionState(this, m_applicationPtr)); break; case IModelObjectSelection::kEditingTypeVertex: state = nanoem_new(DraggingVertexSelectionState(this, m_applicationPtr)); break; - case IModelObjectSelection::kEditingTypeFace: case IModelObjectSelection::kEditingTypeInfo: case IModelObjectSelection::kEditingTypeLabel: - case IModelObjectSelection::kEditingTypeMaterial: case IModelObjectSelection::kEditingTypeMorph: + case IModelObjectSelection::kEditingTypeSoftBody: case IModelObjectSelection::kEditingTypeNone: default: state = nanoem_new(DraggingCameraState(this, m_applicationPtr, true)); @@ -1294,7 +1408,7 @@ StateController::setSecondaryDraggingState(Project *project, const Vector2SI32 & { if (intersectsViewportLayoutRect(project, logicalScalePosition)) { IState *state = nullptr; - if (project->activeModel()) { + if (project->activeModel() && !project->isModelEditingEnabled()) { state = nanoem_new(DraggingBoneState(this, m_applicationPtr, false)); } else { diff --git a/emapp/src/internal/ModelObjectSelection.cc b/emapp/src/internal/ModelObjectSelection.cc index 79099db8..44ee2127 100644 --- a/emapp/src/internal/ModelObjectSelection.cc +++ b/emapp/src/internal/ModelObjectSelection.cc @@ -9,6 +9,8 @@ #include "emapp/Model.h" #include "emapp/Project.h" +#include "glm/gtx/hash.hpp" + namespace nanoem { namespace internal { @@ -81,6 +83,12 @@ ModelObjectSelection::addSoftBody(const nanoem_model_soft_body_t *value) m_selectedSoftBodySet.insert(value); } +void +ModelObjectSelection::addFace(const Vector3UI32 &value) +{ + m_selectedFaceSet.insert(value); +} + void ModelObjectSelection::addAllBones() { @@ -203,6 +211,12 @@ ModelObjectSelection::removeSoftBody(const nanoem_model_soft_body_t *value) m_selectedSoftBodySet.erase(value); } +void +ModelObjectSelection::removeFace(const Vector3UI32 &value) +{ + m_selectedFaceSet.erase(value); +} + void ModelObjectSelection::removeAllVertices() { @@ -253,6 +267,12 @@ ModelObjectSelection::removeAllSoftBodies() m_selectedSoftBodySet.clear(); } +void +ModelObjectSelection::removeAllFaces() +{ + m_selectedFaceSet.clear(); +} + void ModelObjectSelection::clearAll() { @@ -264,6 +284,7 @@ ModelObjectSelection::clearAll() removeAllMaterials(); removeAllRigidBodies(); removeAllSoftBodies(); + removeAllFaces(); m_hoveredBone = nullptr; m_hoveredJoint = nullptr; m_hoveredLabel = nullptr; @@ -582,3 +603,12 @@ ModelObjectSelection::setTargetMode(SelectTargetModeType value) } /* namespace internal */ } /* namespace nanoem */ + +namespace tinystl { + +template<> +inline size_t hash(const nanoem::Vector3UI32 &value) { + return std::hash()(value); +} + +} /* namespace tinystl */ diff --git a/emapp/src/internal/imgui/ModelParameterDialog.cc b/emapp/src/internal/imgui/ModelParameterDialog.cc index 47309ba5..5758a136 100644 --- a/emapp/src/internal/imgui/ModelParameterDialog.cc +++ b/emapp/src/internal/imgui/ModelParameterDialog.cc @@ -4295,80 +4295,99 @@ void ModelParameterDialog::toggleTab(TabType value, Project *project) { if (value != m_tabType) { - switch (m_tabType) { - case kTabTypeVertex: { - m_activeModel->setShowAllVertexPoints(false); - break; - } - case kTabTypeFace: { - m_activeModel->setShowAllVertexFaces(false); - break; - } - case kTabTypeBone: { - m_activeModel->setShowAllBones(false); - break; - } - case kTabTypeMorph: { - if (Motion *motion = project->resolveMotion(m_activeModel)) { - m_activeModel->synchronizeMotion( - motion, project->currentLocalFrameIndex(), 0, PhysicsEngine::kSimulationTimingBefore); - m_activeModel->resetAllVertices(); - m_activeModel->deformAllMorphs(false); - m_activeModel->markStagingVertexBufferDirty(); - } - break; - } - case kTabTypeRigidBody: { - m_activeModel->setShowAllRigidBodies(false); - break; - } - case kTabTypeJoint: { - m_activeModel->setShowAllJoints(false); - break; - } - case kTabTypeSoftBody: { - break; - } - default: - break; - } + beforeToggleTab(project); m_tabType = value; - switch (value) { - case kTabTypeVertex: { - m_activeModel->setShowAllVertexPoints(true); - project->setEditingMode(Project::kEditingModeNone); - break; - } - case kTabTypeFace: { - m_activeModel->setShowAllVertexFaces(true); - project->setEditingMode(Project::kEditingModeNone); - break; - } - case kTabTypeMaterial: { - project->setEditingMode(Project::kEditingModeNone); - break; - } - case kTabTypeBone: { - m_activeModel->setShowAllBones(true); - break; - } - case kTabTypeRigidBody: { - m_activeModel->setShowAllRigidBodies(true); - project->setEditingMode(Project::kEditingModeNone); - break; - } - case kTabTypeJoint: { - m_activeModel->setShowAllJoints(true); - project->setEditingMode(Project::kEditingModeNone); - break; - } - case kTabTypeSoftBody: { - project->setEditingMode(Project::kEditingModeNone); - break; - } - default: - break; + afterToggleTab(value, project); + } +} + +void +ModelParameterDialog::beforeToggleTab(Project *project) +{ + switch (m_tabType) { + case kTabTypeVertex: { + m_activeModel->setShowAllVertexPoints(false); + break; + } + case kTabTypeFace: { + m_activeModel->setShowAllVertexFaces(false); + break; + } + case kTabTypeBone: { + m_activeModel->setShowAllBones(false); + break; + } + case kTabTypeMorph: { + if (Motion *motion = project->resolveMotion(m_activeModel)) { + m_activeModel->synchronizeMotion( + motion, project->currentLocalFrameIndex(), 0, PhysicsEngine::kSimulationTimingBefore); + m_activeModel->resetAllVertices(); + m_activeModel->deformAllMorphs(false); + m_activeModel->markStagingVertexBufferDirty(); } + break; + } + case kTabTypeRigidBody: { + m_activeModel->setShowAllRigidBodies(false); + break; + } + case kTabTypeJoint: { + m_activeModel->setShowAllJoints(false); + break; + } + case kTabTypeSoftBody: { + break; + } + default: + break; + } +} + +void +ModelParameterDialog::afterToggleTab(TabType value, Project *project) +{ + switch (value) { + case kTabTypeVertex: { + m_activeModel->setShowAllVertexPoints(true); + m_activeModel->selection()->setEditingType(IModelObjectSelection::kEditingTypeVertex); + project->setEditingMode(Project::kEditingModeNone); + break; + } + case kTabTypeFace: { + m_activeModel->setShowAllVertexFaces(true); + m_activeModel->selection()->setEditingType(IModelObjectSelection::kEditingTypeFace); + project->setEditingMode(Project::kEditingModeNone); + break; + } + case kTabTypeMaterial: { + m_activeModel->selection()->setEditingType(IModelObjectSelection::kEditingTypeMaterial); + project->setEditingMode(Project::kEditingModeNone); + break; + } + case kTabTypeBone: { + m_activeModel->selection()->setEditingType(IModelObjectSelection::kEditingTypeBone); + m_activeModel->setShowAllBones(true); + break; + } + case kTabTypeRigidBody: { + m_activeModel->setShowAllRigidBodies(true); + m_activeModel->selection()->setEditingType(IModelObjectSelection::kEditingTypeRigidBody); + project->setEditingMode(Project::kEditingModeNone); + break; + } + case kTabTypeJoint: { + m_activeModel->setShowAllJoints(true); + m_activeModel->selection()->setEditingType(IModelObjectSelection::kEditingTypeJoint); + project->setEditingMode(Project::kEditingModeNone); + break; + } + case kTabTypeSoftBody: { + m_activeModel->selection()->setEditingType(IModelObjectSelection::kEditingTypeSoftBody); + project->setEditingMode(Project::kEditingModeNone); + break; + } + default: + break; } } From c9bae2c6574af36e92e252ea01c33010e2a86e3f Mon Sep 17 00:00:00 2001 From: hkrn <129939+hkrn@users.noreply.github.com> Date: Fri, 19 Mar 2021 22:45:35 +0900 Subject: [PATCH 008/488] [emapp] add toggle modeling enabled event and it's handler --- emapp/include/emapp/ApplicationMenuBuilder.h | 1 + emapp/include/emapp/BaseApplicationClient.h | 4 + emapp/include/emapp/IEventPublisher.h | 1 + .../emapp/internal/StubEventPublisher.h | 5 + emapp/resources/protobuf/application.proto | 4 + emapp/src/ApplicationMenuBuilder.cc | 26 ++++ emapp/src/BaseApplicationClient.cc | 24 ++++ emapp/src/BaseApplicationService.cc | 14 ++ emapp/src/Project.cc | 25 ++-- emapp/src/protoc/application.pb-c.c | 128 +++++++++++++++--- emapp/src/protoc/application.pb-c.h | 36 +++++ 11 files changed, 243 insertions(+), 25 deletions(-) diff --git a/emapp/include/emapp/ApplicationMenuBuilder.h b/emapp/include/emapp/ApplicationMenuBuilder.h index 089d7472..77eb2699 100644 --- a/emapp/include/emapp/ApplicationMenuBuilder.h +++ b/emapp/include/emapp/ApplicationMenuBuilder.h @@ -378,6 +378,7 @@ class ApplicationMenuBuilder : private NonCopyable { static void handleCanPasteEvent(void *userData, bool value); static void handleSetWindowPixelRatioEvent(void *userData, nanoem_f32_t value); static void handleSetViewportPixelRatioEvent(void *userData, nanoem_f32_t value); + static void handleToggleModelEditingEnabledEvent(void *userData, bool value); void addMorphMenuItems(const StringList &morphs, nanoem_model_morph_category_t category); void togglAllMutatingActionMenuItems(bool value); diff --git a/emapp/include/emapp/BaseApplicationClient.h b/emapp/include/emapp/BaseApplicationClient.h index 1b15f380..62dc52aa 100644 --- a/emapp/include/emapp/BaseApplicationClient.h +++ b/emapp/include/emapp/BaseApplicationClient.h @@ -121,6 +121,7 @@ class BaseApplicationClient : private NonCopyable { typedef void (*pfn_handleToggleActiveAccessoryAddBlendEnabledEvent)(void *userData, bool value); typedef void (*pfn_handleToggleActiveAccessoryShadowEnabledEvent)(void *userData, bool value); typedef void (*pfn_handleToggleActiveAccessoryVisibleEvent)(void *userData, bool value); + typedef void (*pfn_handleToggleModelEditingEnabledEvent)(void *userData, bool value); typedef void (*pfn_handleUpdateProgressEvent)( void *userData, nanoem_u32_t value, nanoem_u32_t total, nanoem_u32_t type, const char *text); typedef void (*pfn_handleStartProgressEvent)( @@ -379,6 +380,8 @@ class BaseApplicationClient : private NonCopyable { pfn_handleToggleActiveAccessoryShadowEnabledEvent listener, void *userData, bool once); void addToggleActiveAccessoryVisibleEventListener( pfn_handleToggleActiveAccessoryVisibleEvent listener, void *userData, bool once); + void addToggleModelEditingEnabledEventListener( + pfn_handleToggleModelEditingEnabledEvent listener, void *userData, bool once); void addUpdateProgressEventListener(pfn_handleUpdateProgressEvent listener, void *userData, bool once); void addStartProgressEventListener(pfn_handleStartProgressEvent listener, void *userData, bool once); void addStopProgressEventListener(pfn_handleStopProgressEvent listener, void *userData, bool once); @@ -484,6 +487,7 @@ class BaseApplicationClient : private NonCopyable { pfn_handleToggleActiveAccessoryAddBlendEnabledEvent handleToggleActiveAccessoryAddBlendEnabledEvent; pfn_handleToggleActiveAccessoryShadowEnabledEvent handleToggleActiveAccessoryShadowEnabledEvent; pfn_handleToggleActiveAccessoryVisibleEvent handleToggleActiveAccessoryVisibleEvent; + pfn_handleToggleModelEditingEnabledEvent handleToggleModelEditingEnabledEvent; pfn_handleUpdateProgressEvent handleUpdateProgressEvent; pfn_handleStartProgressEvent handleStartProgressEvent; pfn_handleStopProgressEvent handleStopProgressEvent; diff --git a/emapp/include/emapp/IEventPublisher.h b/emapp/include/emapp/IEventPublisher.h index 384df461..73b7cd89 100644 --- a/emapp/include/emapp/IEventPublisher.h +++ b/emapp/include/emapp/IEventPublisher.h @@ -73,6 +73,7 @@ class IEventPublisher { virtual void publishToggleActiveAccessoryAddBlendEnabledEvent(bool value) = 0; virtual void publishToggleActiveAccessoryGroundShadowEnabledEvent(bool value) = 0; virtual void publishToggleActiveAccessoryVisibleEvent(bool value) = 0; + virtual void publishToggleModelEditingEnabledEvent(bool value) = 0; virtual void publishConsumePassEvent(nanoem_u64_t globalFrameIndex) = 0; virtual void publishAddModalDialogEvent() = 0; virtual void publishClearModalDialogEvent() = 0; diff --git a/emapp/include/emapp/internal/StubEventPublisher.h b/emapp/include/emapp/internal/StubEventPublisher.h index c5c200d8..4344cdd9 100644 --- a/emapp/include/emapp/internal/StubEventPublisher.h +++ b/emapp/include/emapp/internal/StubEventPublisher.h @@ -302,6 +302,11 @@ class StubEventPublisher NANOEM_DECL_SEALED : public IEventPublisher, private No BX_UNUSED_1(value); } void + publishToggleModelEditingEnabledEvent(bool value) NANOEM_DECL_OVERRIDE + { + BX_UNUSED_1(value); + } + void publishUpdateProgressEvent( nanoem_u32_t value, nanoem_u32_t total, nanoem_u32_t type, const char *text) NANOEM_DECL_OVERRIDE { diff --git a/emapp/resources/protobuf/application.proto b/emapp/resources/protobuf/application.proto index 96490ab4..e53a8e43 100644 --- a/emapp/resources/protobuf/application.proto +++ b/emapp/resources/protobuf/application.proto @@ -1474,6 +1474,9 @@ message SetWindowDevicePixelRatioEvent { message SetViewportDevicePixelRatioEvent { required float value = 1; }; +message ToggleModelEditingEnabledEvent { + required bool value = 1; +} message PingPongEvent { }; @@ -1615,6 +1618,7 @@ message Event { CanPasteEvent can_paste_event = 88; SetWindowDevicePixelRatioEvent set_window_device_pixel_ratio_event = 89; SetViewportDevicePixelRatioEvent set_viewport_device_pixel_ratio_event = 90; + ToggleModelEditingEnabledEvent toggle_model_editing_enabled = 91; PingPongEvent ping_pong = 1000; IsProjectDirtyResponseEvent is_project_dirty = 1001; GetAllModelBonesResponseEvent get_all_model_bones = 1002; diff --git a/emapp/src/ApplicationMenuBuilder.cc b/emapp/src/ApplicationMenuBuilder.cc index 8980d0bd..26dc23b8 100644 --- a/emapp/src/ApplicationMenuBuilder.cc +++ b/emapp/src/ApplicationMenuBuilder.cc @@ -837,6 +837,7 @@ ApplicationMenuBuilder::build() m_client->addCanPasteEventListener(handleCanPasteEvent, this, false); m_client->addSetWindowDevicePixelRatioEventListener(handleSetWindowPixelRatioEvent, this, false); m_client->addSetViewportDevicePixelRatioEventListener(handleSetViewportPixelRatioEvent, this, false); + m_client->addToggleModelEditingEnabledEventListener(handleToggleModelEditingEnabledEvent, this, false); } void @@ -1802,6 +1803,31 @@ ApplicationMenuBuilder::handleSetViewportPixelRatioEvent(void *userData, nanoem_ self->setMenuItemChecked(kMenuItemTypeProjectEnableHighResolutionViewport, value > 1.0f); } +void +ApplicationMenuBuilder::handleToggleModelEditingEnabledEvent(void *userData, bool value) +{ + ApplicationMenuBuilder *self = static_cast(userData); + const bool invert = value ? false : true; + self->setMenuItemEnable(kMenuItemTypeProjectPlay, invert); + self->setMenuItemEnable(kMenuItemTypeFileImportCameraMotion, invert); + self->setMenuItemEnable(kMenuItemTypeFileImportLightMotion, invert); + self->setMenuItemEnable(kMenuItemTypeFileImportModelMotion, invert); + self->setMenuItemEnable(kMenuItemTypeModelRegisterKeyframe, invert); + self->setMenuItemEnable(kMenuItemTypeMotionInsertEmptyTimelineFrame, invert); + self->setMenuItemEnable(kMenuItemTypeMotionRemoveTimelineFrame, invert); + self->setMenuItemEnable(kMenuItemTypeMotionReset, invert); + self->setMenuItemEnable(kMenuItemTypeEditSelectAll, invert); + self->setMenuItemEnable(kMenuItemTypeEditMorphRegisterAllMorphs, invert); + self->setMenuItemEnable(kMenuItemTypeEditMorphRemoveAllEyeKeyframes, invert); + self->setMenuItemEnable(kMenuItemTypeEditMorphRemoveAllEyebrowKeyframes, invert); + self->setMenuItemEnable(kMenuItemTypeEditMorphRemoveAllLipKeyframes, invert); + self->setMenuItemEnable(kMenuItemTypeModelRemoveAllSelectedKeyframes, invert); + self->setMenuItemEnable(kMenuItemTypeCameraRegisterKeyframe, invert); + self->setMenuItemEnable(kMenuItemTypeCameraRemoveAllSelectedKeyframes, invert); + self->setMenuItemEnable(kMenuItemTypeLightRegisterKeyframe, invert); + self->setMenuItemEnable(kMenuItemTypeLightRemoveAllSelectedKeyframes, invert); +} + void ApplicationMenuBuilder::addMorphMenuItems(const StringList &morphs, nanoem_model_morph_category_t category) { diff --git a/emapp/src/BaseApplicationClient.cc b/emapp/src/BaseApplicationClient.cc index 38b80ca1..65155409 100644 --- a/emapp/src/BaseApplicationClient.cc +++ b/emapp/src/BaseApplicationClient.cc @@ -2499,6 +2499,15 @@ BaseApplicationClient::addToggleActiveAccessoryVisibleEventListener( m_eventListeners[NANOEM__APPLICATION__EVENT__TYPE_TOGGLE_ACTIVE_ACCESSORY_VISIBLE].push_back(l); } +void +BaseApplicationClient::addToggleModelEditingEnabledEventListener( + pfn_handleToggleModelEditingEnabledEvent listener, void *userData, bool once) +{ + EventListener l = { userData, once, { nullptr } }; + l.u.handleToggleModelEditingEnabledEvent = listener; + m_eventListeners[NANOEM__APPLICATION__EVENT__TYPE_TOGGLE_MODEL_EDITING_ENABLED].push_back(l); +} + void BaseApplicationClient::addUpdateProgressEventListener(pfn_handleUpdateProgressEvent listener, void *userData, bool once) { @@ -3999,6 +4008,21 @@ BaseApplicationClient::dispatchEventMessage(const nanoem_u8_t *data, size_t size } break; } + case NANOEM__APPLICATION__EVENT__TYPE_TOGGLE_MODEL_EDITING_ENABLED: { + EventListenerListMap::iterator it = m_eventListeners.find(event->type_case); + if (it != m_eventListeners.end()) { + EventListenerList &listeners = it->second; + const Nanoem__Application__ToggleModelEditingEnabledEvent *e = + event->toggle_model_editing_enabled; + bool enabled = e->value != 0; + for (EventListenerList::iterator it2 = listeners.begin(); it2 != listeners.end();) { + const EventListener &listener = *it2; + listener.u.handleToggleModelEditingEnabledEvent(listener.userData, enabled); + it2 = listener.once ? listeners.erase(it2) : it2 + 1; + } + } + break; + } case NANOEM__APPLICATION__EVENT__TYPE__NOT_SET: default: break; diff --git a/emapp/src/BaseApplicationService.cc b/emapp/src/BaseApplicationService.cc index c6cc6377..f31c69d2 100644 --- a/emapp/src/BaseApplicationService.cc +++ b/emapp/src/BaseApplicationService.cc @@ -342,6 +342,7 @@ class BaseApplicationService::EventPublisher : public IEventPublisher { void publishToggleActiveAccessoryAddBlendEnabledEvent(bool value) NANOEM_DECL_OVERRIDE; void publishToggleActiveAccessoryGroundShadowEnabledEvent(bool value) NANOEM_DECL_OVERRIDE; void publishToggleActiveAccessoryVisibleEvent(bool value) NANOEM_DECL_OVERRIDE; + void publishToggleModelEditingEnabledEvent(bool value) NANOEM_DECL_OVERRIDE; void publishUpdateProgressEvent( nanoem_u32_t value, nanoem_u32_t total, nanoem_u32_t type, const char *text) NANOEM_DECL_OVERRIDE; void publishStartProgressEvent(const char *title, const char *text, nanoem_u32_t total) NANOEM_DECL_OVERRIDE; @@ -1286,6 +1287,19 @@ BaseApplicationService::EventPublisher::publishToggleActiveAccessoryVisibleEvent sendEventMessage(event); } +void +BaseApplicationService::EventPublisher::publishToggleModelEditingEnabledEvent(bool value) +{ + Nanoem__Application__ToggleModelEditingEnabledEvent base = + NANOEM__APPLICATION__TOGGLE_MODEL_EDITING_ENABLED_EVENT__INIT; + base.value = value; + Nanoem__Application__Event event = NANOEM__APPLICATION__EVENT__INIT; + event.timestamp = internal::ApplicationUtils::timestamp(); + event.type_case = NANOEM__APPLICATION__EVENT__TYPE_TOGGLE_MODEL_EDITING_ENABLED; + event.toggle_model_editing_enabled = &base; + sendEventMessage(event); +} + void BaseApplicationService::EventPublisher::publishUpdateProgressEvent( nanoem_u32_t value, nanoem_u32_t total, nanoem_u32_t type, const char *text) diff --git a/emapp/src/Project.cc b/emapp/src/Project.cc index b0252940..b858005c 100644 --- a/emapp/src/Project.cc +++ b/emapp/src/Project.cc @@ -2355,12 +2355,15 @@ Project::clearBackgroundVideo() void Project::play() { - const nanoem_frame_index_t durationAt = duration(), localFrameIndexAt = currentLocalFrameIndex(); - preparePlaying(); - synchronizeAllMotions(playingSegment().frameIndexFrom(), 0, PhysicsEngine::kSimulationTimingBefore); - resetPhysicsSimulation(); - m_audioPlayer->play(); - eventPublisher()->publishPlayEvent(durationAt, localFrameIndexAt); + const bool playable = !isModelEditingEnabled(); + if (playable) { + const nanoem_frame_index_t durationAt = duration(), localFrameIndexAt = currentLocalFrameIndex(); + preparePlaying(); + synchronizeAllMotions(playingSegment().frameIndexFrom(), 0, PhysicsEngine::kSimulationTimingBefore); + resetPhysicsSimulation(); + m_audioPlayer->play(); + eventPublisher()->publishPlayEvent(durationAt, localFrameIndexAt); + } } void @@ -2394,7 +2397,8 @@ Project::pause(bool force) void Project::resume(bool force) { - if (force || m_audioPlayer->wasPlaying()) { + const bool resumeable = (force || m_audioPlayer->wasPlaying()) && !isModelEditingEnabled(); + if (resumeable) { const nanoem_frame_index_t lastDuration = duration(), lastLocalFrameIndex = currentLocalFrameIndex(); preparePlaying(); m_audioPlayer->resume(); @@ -2574,7 +2578,7 @@ Project::pushUndo(undo_command_t *command) bool Project::canSeek() const NANOEM_DECL_NOEXCEPT { - bool seekable = true; + bool seekable = isModelEditingEnabled(); if (const Model *model = activeModel()) { seekable &= !(model->hasAnyDirtyBone() && isConfirmSeekEnabled(NANOEM_MUTABLE_MOTION_KEYFRAME_TYPE_BONE)); seekable &= !(model->hasAnyDirtyMorph() && isConfirmSeekEnabled(NANOEM_MUTABLE_MOTION_KEYFRAME_TYPE_MORPH)); @@ -5920,7 +5924,10 @@ Project::isModelEditingEnabled() const NANOEM_DECL_NOEXCEPT void Project::setModelEditingEnabled(bool value) { - EnumUtils::setEnabled(kEnableModelEditing, m_stateFlags, value); + if (isModelEditingEnabled() != value) { + EnumUtils::setEnabled(kEnableModelEditing, m_stateFlags, value); + eventPublisher()->publishToggleModelEditingEnabledEvent(value); + } } bool diff --git a/emapp/src/protoc/application.pb-c.c b/emapp/src/protoc/application.pb-c.c index a688a9fc..c48505f7 100644 --- a/emapp/src/protoc/application.pb-c.c +++ b/emapp/src/protoc/application.pb-c.c @@ -11707,6 +11707,51 @@ void nanoem__application__set_viewport_device_pixel_ratio_event__free_unpacked assert(message->base.descriptor == &nanoem__application__set_viewport_device_pixel_ratio_event__descriptor); protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); } +void nanoem__application__toggle_model_editing_enabled_event__init + (Nanoem__Application__ToggleModelEditingEnabledEvent *message) +{ + static const Nanoem__Application__ToggleModelEditingEnabledEvent init_value = NANOEM__APPLICATION__TOGGLE_MODEL_EDITING_ENABLED_EVENT__INIT; + *message = init_value; +} +size_t nanoem__application__toggle_model_editing_enabled_event__get_packed_size + (const Nanoem__Application__ToggleModelEditingEnabledEvent *message) +{ + assert(message->base.descriptor == &nanoem__application__toggle_model_editing_enabled_event__descriptor); + return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message)); +} +size_t nanoem__application__toggle_model_editing_enabled_event__pack + (const Nanoem__Application__ToggleModelEditingEnabledEvent *message, + uint8_t *out) +{ + assert(message->base.descriptor == &nanoem__application__toggle_model_editing_enabled_event__descriptor); + return protobuf_c_message_pack ((const ProtobufCMessage*)message, out); +} +size_t nanoem__application__toggle_model_editing_enabled_event__pack_to_buffer + (const Nanoem__Application__ToggleModelEditingEnabledEvent *message, + ProtobufCBuffer *buffer) +{ + assert(message->base.descriptor == &nanoem__application__toggle_model_editing_enabled_event__descriptor); + return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer); +} +Nanoem__Application__ToggleModelEditingEnabledEvent * + nanoem__application__toggle_model_editing_enabled_event__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data) +{ + return (Nanoem__Application__ToggleModelEditingEnabledEvent *) + protobuf_c_message_unpack (&nanoem__application__toggle_model_editing_enabled_event__descriptor, + allocator, len, data); +} +void nanoem__application__toggle_model_editing_enabled_event__free_unpacked + (Nanoem__Application__ToggleModelEditingEnabledEvent *message, + ProtobufCAllocator *allocator) +{ + if(!message) + return; + assert(message->base.descriptor == &nanoem__application__toggle_model_editing_enabled_event__descriptor); + protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); +} void nanoem__application__ping_pong_event__init (Nanoem__Application__PingPongEvent *message) { @@ -30362,6 +30407,44 @@ const ProtobufCMessageDescriptor nanoem__application__set_viewport_device_pixel_ (ProtobufCMessageInit) nanoem__application__set_viewport_device_pixel_ratio_event__init, NULL,NULL,NULL /* reserved[123] */ }; +static const ProtobufCFieldDescriptor nanoem__application__toggle_model_editing_enabled_event__field_descriptors[1] = +{ + { + "value", + 1, + PROTOBUF_C_LABEL_REQUIRED, + PROTOBUF_C_TYPE_BOOL, + 0, /* quantifier_offset */ + offsetof(Nanoem__Application__ToggleModelEditingEnabledEvent, value), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, +}; +static const unsigned nanoem__application__toggle_model_editing_enabled_event__field_indices_by_name[] = { + 0, /* field[0] = value */ +}; +static const ProtobufCIntRange nanoem__application__toggle_model_editing_enabled_event__number_ranges[1 + 1] = +{ + { 1, 0 }, + { 0, 1 } +}; +const ProtobufCMessageDescriptor nanoem__application__toggle_model_editing_enabled_event__descriptor = +{ + PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC, + "nanoem.application.ToggleModelEditingEnabledEvent", + "ToggleModelEditingEnabledEvent", + "Nanoem__Application__ToggleModelEditingEnabledEvent", + "nanoem.application", + sizeof(Nanoem__Application__ToggleModelEditingEnabledEvent), + 1, + nanoem__application__toggle_model_editing_enabled_event__field_descriptors, + nanoem__application__toggle_model_editing_enabled_event__field_indices_by_name, + 1, nanoem__application__toggle_model_editing_enabled_event__number_ranges, + (ProtobufCMessageInit) nanoem__application__toggle_model_editing_enabled_event__init, + NULL,NULL,NULL /* reserved[123] */ +}; #define nanoem__application__ping_pong_event__field_descriptors NULL #define nanoem__application__ping_pong_event__field_indices_by_name NULL #define nanoem__application__ping_pong_event__number_ranges NULL @@ -31043,7 +31126,7 @@ const ProtobufCMessageDescriptor nanoem__application__get_handle_file_urirespons (ProtobufCMessageInit) nanoem__application__get_handle_file_uriresponse_event__init, NULL,NULL,NULL /* reserved[123] */ }; -static const ProtobufCFieldDescriptor nanoem__application__event__field_descriptors[95] = +static const ProtobufCFieldDescriptor nanoem__application__event__field_descriptors[96] = { { "timestamp", @@ -32041,6 +32124,18 @@ static const ProtobufCFieldDescriptor nanoem__application__event__field_descript 0 | PROTOBUF_C_FIELD_FLAG_ONEOF, /* flags */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, + { + "toggle_model_editing_enabled", + 91, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_MESSAGE, + offsetof(Nanoem__Application__Event, type_case), + offsetof(Nanoem__Application__Event, toggle_model_editing_enabled), + &nanoem__application__toggle_model_editing_enabled_event__descriptor, + NULL, + 0 | PROTOBUF_C_FIELD_FLAG_ONEOF, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, { "ping_pong", 1000, @@ -32211,21 +32306,21 @@ static const unsigned nanoem__application__event__field_indices_by_name[] = { 23, /* field[23] = discard_project_after_confirm */ 48, /* field[48] = enable_cursor */ 55, /* field[55] = error */ - 89, /* field[89] = get_all_accessories */ - 85, /* field[85] = get_all_model_bones */ - 86, /* field[86] = get_all_model_morphs */ - 90, /* field[90] = get_all_models */ - 88, /* field[88] = get_background_image_texture_handle */ - 94, /* field[94] = get_handle_file_uri */ - 87, /* field[87] = get_project_file_uri */ + 90, /* field[90] = get_all_accessories */ + 86, /* field[86] = get_all_model_bones */ + 87, /* field[87] = get_all_model_morphs */ + 91, /* field[91] = get_all_models */ + 89, /* field[89] = get_background_image_texture_handle */ + 95, /* field[95] = get_handle_file_uri */ + 88, /* field[88] = get_project_file_uri */ 53, /* field[53] = initialization_complete */ - 84, /* field[84] = is_project_dirty */ + 85, /* field[85] = is_project_dirty */ 18, /* field[18] = pause */ - 83, /* field[83] = ping_pong */ + 84, /* field[84] = ping_pong */ 16, /* field[16] = play */ - 92, /* field[92] = query_open_multiple_files_dialog */ - 91, /* field[91] = query_open_single_file_dialog */ - 93, /* field[93] = query_save_file_dialog */ + 93, /* field[93] = query_open_multiple_files_dialog */ + 92, /* field[92] = query_open_single_file_dialog */ + 94, /* field[94] = query_save_file_dialog */ 4, /* field[4] = redo */ 13, /* field[13] = remove_accessory */ 10, /* field[10] = remove_model */ @@ -32271,6 +32366,7 @@ static const unsigned nanoem__application__event__field_indices_by_name[] = { 46, /* field[46] = toggle_active_model_vertex_shader_skinning */ 40, /* field[40] = toggle_active_model_visible */ 29, /* field[29] = toggle_grid_enabled */ + 83, /* field[83] = toggle_model_editing_enabled */ 27, /* field[27] = toggle_project_compute_shader_skinning_enabled */ 24, /* field[24] = toggle_project_effect_enabled */ 25, /* field[25] = toggle_project_ground_shadow_enabled */ @@ -32287,8 +32383,8 @@ static const ProtobufCIntRange nanoem__application__event__number_ranges[3 + 1] { { 1, 0 }, { 10, 2 }, - { 1000, 83 }, - { 0, 95 } + { 1000, 84 }, + { 0, 96 } }; const ProtobufCMessageDescriptor nanoem__application__event__descriptor = { @@ -32298,7 +32394,7 @@ const ProtobufCMessageDescriptor nanoem__application__event__descriptor = "Nanoem__Application__Event", "nanoem.application", sizeof(Nanoem__Application__Event), - 95, + 96, nanoem__application__event__field_descriptors, nanoem__application__event__field_indices_by_name, 3, nanoem__application__event__number_ranges, diff --git a/emapp/src/protoc/application.pb-c.h b/emapp/src/protoc/application.pb-c.h index 341bf4cb..44055bd0 100644 --- a/emapp/src/protoc/application.pb-c.h +++ b/emapp/src/protoc/application.pb-c.h @@ -302,6 +302,7 @@ typedef struct _Nanoem__Application__CanCopyEvent Nanoem__Application__CanCopyEv typedef struct _Nanoem__Application__CanPasteEvent Nanoem__Application__CanPasteEvent; typedef struct _Nanoem__Application__SetWindowDevicePixelRatioEvent Nanoem__Application__SetWindowDevicePixelRatioEvent; typedef struct _Nanoem__Application__SetViewportDevicePixelRatioEvent Nanoem__Application__SetViewportDevicePixelRatioEvent; +typedef struct _Nanoem__Application__ToggleModelEditingEnabledEvent Nanoem__Application__ToggleModelEditingEnabledEvent; typedef struct _Nanoem__Application__PingPongEvent Nanoem__Application__PingPongEvent; typedef struct _Nanoem__Application__IsProjectDirtyResponseEvent Nanoem__Application__IsProjectDirtyResponseEvent; typedef struct _Nanoem__Application__GetAllModelBonesResponseEvent Nanoem__Application__GetAllModelBonesResponseEvent; @@ -4154,6 +4155,16 @@ struct _Nanoem__Application__SetViewportDevicePixelRatioEvent , 0 } +struct _Nanoem__Application__ToggleModelEditingEnabledEvent +{ + ProtobufCMessage base; + protobuf_c_boolean value; +}; +#define NANOEM__APPLICATION__TOGGLE_MODEL_EDITING_ENABLED_EVENT__INIT \ + { PROTOBUF_C_MESSAGE_INIT (&nanoem__application__toggle_model_editing_enabled_event__descriptor) \ + , 0 } + + struct _Nanoem__Application__PingPongEvent { ProtobufCMessage base; @@ -4399,6 +4410,7 @@ typedef enum { NANOEM__APPLICATION__EVENT__TYPE_CAN_PASTE_EVENT = 88, NANOEM__APPLICATION__EVENT__TYPE_SET_WINDOW_DEVICE_PIXEL_RATIO_EVENT = 89, NANOEM__APPLICATION__EVENT__TYPE_SET_VIEWPORT_DEVICE_PIXEL_RATIO_EVENT = 90, + NANOEM__APPLICATION__EVENT__TYPE_TOGGLE_MODEL_EDITING_ENABLED = 91, NANOEM__APPLICATION__EVENT__TYPE_PING_PONG = 1000, NANOEM__APPLICATION__EVENT__TYPE_IS_PROJECT_DIRTY = 1001, NANOEM__APPLICATION__EVENT__TYPE_GET_ALL_MODEL_BONES = 1002, @@ -4503,6 +4515,7 @@ struct _Nanoem__Application__Event Nanoem__Application__CanPasteEvent *can_paste_event; Nanoem__Application__SetWindowDevicePixelRatioEvent *set_window_device_pixel_ratio_event; Nanoem__Application__SetViewportDevicePixelRatioEvent *set_viewport_device_pixel_ratio_event; + Nanoem__Application__ToggleModelEditingEnabledEvent *toggle_model_editing_enabled; Nanoem__Application__PingPongEvent *ping_pong; Nanoem__Application__IsProjectDirtyResponseEvent *is_project_dirty; Nanoem__Application__GetAllModelBonesResponseEvent *get_all_model_bones; @@ -9476,6 +9489,25 @@ Nanoem__Application__SetViewportDevicePixelRatioEvent * void nanoem__application__set_viewport_device_pixel_ratio_event__free_unpacked (Nanoem__Application__SetViewportDevicePixelRatioEvent *message, ProtobufCAllocator *allocator); +/* Nanoem__Application__ToggleModelEditingEnabledEvent methods */ +void nanoem__application__toggle_model_editing_enabled_event__init + (Nanoem__Application__ToggleModelEditingEnabledEvent *message); +size_t nanoem__application__toggle_model_editing_enabled_event__get_packed_size + (const Nanoem__Application__ToggleModelEditingEnabledEvent *message); +size_t nanoem__application__toggle_model_editing_enabled_event__pack + (const Nanoem__Application__ToggleModelEditingEnabledEvent *message, + uint8_t *out); +size_t nanoem__application__toggle_model_editing_enabled_event__pack_to_buffer + (const Nanoem__Application__ToggleModelEditingEnabledEvent *message, + ProtobufCBuffer *buffer); +Nanoem__Application__ToggleModelEditingEnabledEvent * + nanoem__application__toggle_model_editing_enabled_event__unpack + (ProtobufCAllocator *allocator, + size_t len, + const uint8_t *data); +void nanoem__application__toggle_model_editing_enabled_event__free_unpacked + (Nanoem__Application__ToggleModelEditingEnabledEvent *message, + ProtobufCAllocator *allocator); /* Nanoem__Application__PingPongEvent methods */ void nanoem__application__ping_pong_event__init (Nanoem__Application__PingPongEvent *message); @@ -10589,6 +10621,9 @@ typedef void (*Nanoem__Application__SetWindowDevicePixelRatioEvent_Closure) typedef void (*Nanoem__Application__SetViewportDevicePixelRatioEvent_Closure) (const Nanoem__Application__SetViewportDevicePixelRatioEvent *message, void *closure_data); +typedef void (*Nanoem__Application__ToggleModelEditingEnabledEvent_Closure) + (const Nanoem__Application__ToggleModelEditingEnabledEvent *message, + void *closure_data); typedef void (*Nanoem__Application__PingPongEvent_Closure) (const Nanoem__Application__PingPongEvent *message, void *closure_data); @@ -10927,6 +10962,7 @@ extern const ProtobufCMessageDescriptor nanoem__application__can_copy_event__des extern const ProtobufCMessageDescriptor nanoem__application__can_paste_event__descriptor; extern const ProtobufCMessageDescriptor nanoem__application__set_window_device_pixel_ratio_event__descriptor; extern const ProtobufCMessageDescriptor nanoem__application__set_viewport_device_pixel_ratio_event__descriptor; +extern const ProtobufCMessageDescriptor nanoem__application__toggle_model_editing_enabled_event__descriptor; extern const ProtobufCMessageDescriptor nanoem__application__ping_pong_event__descriptor; extern const ProtobufCMessageDescriptor nanoem__application__is_project_dirty_response_event__descriptor; extern const ProtobufCMessageDescriptor nanoem__application__get_all_model_bones_response_event__descriptor; From 5f261fdd21498a42d1fdd90beab667e925bddcbb Mon Sep 17 00:00:00 2001 From: hkrn <129939+hkrn@users.noreply.github.com> Date: Sat, 20 Mar 2021 10:14:08 +0900 Subject: [PATCH 009/488] [emapp] add containsVertexIndex and highlight --- emapp/include/emapp/IModelObjectSelection.h | 1 + emapp/include/emapp/internal/ModelObjectSelection.h | 3 +++ emapp/src/Model.cc | 2 +- emapp/src/StateController.cc | 2 +- emapp/src/internal/ModelObjectSelection.cc | 13 +++++++++++++ 5 files changed, 19 insertions(+), 2 deletions(-) diff --git a/emapp/include/emapp/IModelObjectSelection.h b/emapp/include/emapp/IModelObjectSelection.h index 39819b56..167ca0b6 100644 --- a/emapp/include/emapp/IModelObjectSelection.h +++ b/emapp/include/emapp/IModelObjectSelection.h @@ -118,6 +118,7 @@ class IModelObjectSelection { virtual bool containsRigidBody(const nanoem_model_rigid_body_t *value) const NANOEM_DECL_NOEXCEPT = 0; virtual bool containsJoint(const nanoem_model_joint_t *value) const NANOEM_DECL_NOEXCEPT = 0; virtual bool containsSoftBody(const nanoem_model_soft_body_t *value) const NANOEM_DECL_NOEXCEPT = 0; + virtual bool containsVertexIndex(nanoem_u32_t value) const NANOEM_DECL_NOEXCEPT = 0; virtual bool containsAnyBone() const NANOEM_DECL_NOEXCEPT = 0; virtual bool areAllBonesMovable() const NANOEM_DECL_NOEXCEPT = 0; virtual bool areAllBonesRotateable() const NANOEM_DECL_NOEXCEPT = 0; diff --git a/emapp/include/emapp/internal/ModelObjectSelection.h b/emapp/include/emapp/internal/ModelObjectSelection.h index dabc8993..6b0ef120 100644 --- a/emapp/include/emapp/internal/ModelObjectSelection.h +++ b/emapp/include/emapp/internal/ModelObjectSelection.h @@ -86,6 +86,7 @@ class ModelObjectSelection NANOEM_DECL_SEALED : public IModelObjectSelection { bool containsRigidBody(const nanoem_model_rigid_body_t *value) const NANOEM_DECL_NOEXCEPT_OVERRIDE; bool containsJoint(const nanoem_model_joint_t *value) const NANOEM_DECL_NOEXCEPT_OVERRIDE; bool containsSoftBody(const nanoem_model_soft_body_t *value) const NANOEM_DECL_NOEXCEPT_OVERRIDE; + bool containsVertexIndex(nanoem_u32_t value) const NANOEM_DECL_NOEXCEPT_OVERRIDE; bool areAllBonesMovable() const NANOEM_DECL_NOEXCEPT_OVERRIDE; bool areAllBonesRotateable() const NANOEM_DECL_NOEXCEPT_OVERRIDE; bool containsAnyBone() const NANOEM_DECL_NOEXCEPT_OVERRIDE; @@ -99,6 +100,7 @@ class ModelObjectSelection NANOEM_DECL_SEALED : public IModelObjectSelection { private: typedef tinystl::unordered_set FaceSet; + typedef tinystl::unordered_set VertexIndexSet; Model *m_parent; model::Vertex::Set m_selectedVertexSet; @@ -110,6 +112,7 @@ class ModelObjectSelection NANOEM_DECL_SEALED : public IModelObjectSelection { model::Joint::Set m_selectedJointSet; model::SoftBody::Set m_selectedSoftBodySet; FaceSet m_selectedFaceSet; + VertexIndexSet m_vertexIndexSet; nanoem_model_vertex_t *m_hoveredVertex; nanoem_model_material_t *m_hoveredMaterial; nanoem_model_bone_t *m_hoveredBone; diff --git a/emapp/src/Model.cc b/emapp/src/Model.cc index cb07d979..63668c85 100644 --- a/emapp/src/Model.cc +++ b/emapp/src/Model.cc @@ -3731,7 +3731,7 @@ Model::drawAllVertexFaces() else { Model::VertexUnit::performSkinningByType(vertex, ptr, &normal); } - vertexUnit.m_color = glm::u8vec4(0, 0, 0, 0x7f); + vertexUnit.m_color = m_selection->containsVertexIndex(i) ? glm::u8vec4(0xff, 0, 0, 0x7f) : glm::u8vec4(0, 0, 0, 0x7f); } internal::LineDrawer *drawer = lineDrawer(); sg::update_buffer(m_drawAllLines.m_vertexBuffer, m_drawAllLines.m_vertices.data(), diff --git a/emapp/src/StateController.cc b/emapp/src/StateController.cc index c4f6ee3e..817404a5 100644 --- a/emapp/src/StateController.cc +++ b/emapp/src/StateController.cc @@ -654,7 +654,7 @@ class DraggingFaceSelectionState NANOEM_DECL_SEALED : public BaseSelectionState const ICamera *camera = project->activeCamera(); IModelObjectSelection *selection = model->selection(); if (removeAll) { - selection->removeAllVertices(); + selection->removeAllFaces(); } for (nanoem_rsize_t i = 0, offset = 0; i < numMaterials; i++) { const nanoem_f32_t numVI = nanoemModelMaterialGetNumVertexIndices(materials[i]); diff --git a/emapp/src/internal/ModelObjectSelection.cc b/emapp/src/internal/ModelObjectSelection.cc index 44ee2127..7d33792e 100644 --- a/emapp/src/internal/ModelObjectSelection.cc +++ b/emapp/src/internal/ModelObjectSelection.cc @@ -87,6 +87,9 @@ void ModelObjectSelection::addFace(const Vector3UI32 &value) { m_selectedFaceSet.insert(value); + m_vertexIndexSet.insert(value.x); + m_vertexIndexSet.insert(value.y); + m_vertexIndexSet.insert(value.z); } void @@ -215,6 +218,9 @@ void ModelObjectSelection::removeFace(const Vector3UI32 &value) { m_selectedFaceSet.erase(value); + m_vertexIndexSet.erase(value.x); + m_vertexIndexSet.erase(value.y); + m_vertexIndexSet.erase(value.z); } void @@ -271,6 +277,7 @@ void ModelObjectSelection::removeAllFaces() { m_selectedFaceSet.clear(); + m_vertexIndexSet.clear(); } void @@ -518,6 +525,12 @@ ModelObjectSelection::containsSoftBody(const nanoem_model_soft_body_t *value) co return m_selectedSoftBodySet.find(value) != m_selectedSoftBodySet.end(); } +bool +ModelObjectSelection::containsVertexIndex(nanoem_u32_t value) const NANOEM_DECL_NOEXCEPT +{ + return m_vertexIndexSet.find(value) != m_vertexIndexSet.end(); +} + bool ModelObjectSelection::areAllBonesMovable() const NANOEM_DECL_NOEXCEPT { From c3ec043f5a6b222809897f7a46e4a181439ecfe7 Mon Sep 17 00:00:00 2001 From: hkrn <129939+hkrn@users.noreply.github.com> Date: Sat, 20 Mar 2021 10:37:08 +0900 Subject: [PATCH 010/488] [emapp] replace glm::u8vec[234] to Vector[234]U8 --- emapp/include/emapp/BaseApplicationClient.h | 8 +- emapp/include/emapp/BezierCurve.h | 12 +-- emapp/include/emapp/Forward.h | 5 +- emapp/include/emapp/ICamera.h | 6 +- emapp/include/emapp/PerspectiveCamera.h | 14 +-- .../emapp/command/BaseBoneKeyframeCommand.h | 4 +- .../emapp/command/BaseCameraKeyframeCommand.h | 4 +- .../include/emapp/internal/ApplicationUtils.h | 4 +- emapp/include/emapp/internal/ImGuiWindow.h | 2 +- ...oneKeyframeInterpolationCurveGraphDialog.h | 2 +- ...eraKeyframeInterpolationCurveGraphDialog.h | 2 +- emapp/include/emapp/model/BindPose.h | 2 +- emapp/include/emapp/model/Bone.h | 12 +-- emapp/src/BaseApplicationClient.cc | 8 +- emapp/src/BaseApplicationService.cc | 4 +- emapp/src/BezierCurve.cc | 10 +- emapp/src/CommandMessage.inl | 4 +- emapp/src/Grid.cc | 6 +- emapp/src/Model.cc | 7 +- emapp/src/PerspectiveCamera.cc | 10 +- emapp/src/command/AddBoneKeyframeCommand.cc | 2 +- emapp/src/internal/ApplicationUtils.cc | 6 +- emapp/src/internal/ImGuiWindow.cc | 8 +- ...seKeyframeInterpolationCurveGraphDialog.cc | 4 +- emapp/src/internal/project/JSON.cc | 4 +- emapp/src/model/Bone.cc | 10 +- emapp/test/common.h | 14 +-- emapp/test/common/matcher.cc | 4 +- emapp/test/common/stringify.cc | 2 +- emapp/test/motion/motion_add_bone_keyframe.cc | 40 ++++---- .../test/motion/motion_add_camera_keyframe.cc | 54 +++++------ .../motion/motion_remove_bone_keyframe.cc | 64 ++++++------- .../motion/motion_remove_camera_keyframe.cc | 94 +++++++++---------- .../motion/motion_update_bone_keyframe.cc | 48 +++++----- .../motion/motion_update_camera_keyframe.cc | 80 ++++++++-------- .../project_bezier_curve_adjustment.cc | 12 +-- .../project/project_redo_remove_drawable.cc | 16 ++-- 37 files changed, 296 insertions(+), 292 deletions(-) diff --git a/emapp/include/emapp/BaseApplicationClient.h b/emapp/include/emapp/BaseApplicationClient.h index 62dc52aa..33de842a 100644 --- a/emapp/include/emapp/BaseApplicationClient.h +++ b/emapp/include/emapp/BaseApplicationClient.h @@ -225,8 +225,8 @@ class BaseApplicationClient : private NonCopyable { void sendRemoveAllSelectedMorphKeyframesMessage(nanoem_u16_t handle, const StringList &names); void sendRemoveSelfShadowKeyframeMessage(); void sendBoneBezierControlPointMessage( - nanoem_u16_t handle, const String &name, const glm::u8vec4 &value, nanoem_u32_t type); - void sendCameraBezierControlPointMessage(const glm::u8vec4 &value, nanoem_u32_t type); + nanoem_u16_t handle, const String &name, const Vector4U8 &value, nanoem_u32_t type); + void sendCameraBezierControlPointMessage(const Vector4U8 &value, nanoem_u32_t type); void sendSelectBoneMessage(nanoem_u16_t handle, const String &name); void sendSelectAllBonesMessage(nanoem_u16_t handle); void sendSelectAllDirtyBonesMessage(nanoem_u16_t handle); @@ -257,7 +257,7 @@ class BaseApplicationClient : private NonCopyable { void sendSetModelShadowMapEnabledMessage(nanoem_u16_t handle, bool value); void sendSetDrawableOrderIndexMessage(nanoem_u16_t handle, int value); void sendSetModelTransformOrderIndexMessage(nanoem_u16_t handle, int value); - void sendSetModelBoneKeyframeInterpolationMessage(nanoem_u16_t handle, const glm::u8vec4 *values); + void sendSetModelBoneKeyframeInterpolationMessage(nanoem_u16_t handle, const Vector4U8 *values); void sendUpdatePerformanceMonitorMessage( nanoem_f32_t cpu, nanoem_u64_t currentMemorySize, nanoem_u64_t maxMemorySize); void sendLoadAllModelPluginsMessage(const URIList &values); @@ -271,7 +271,7 @@ class BaseApplicationClient : private NonCopyable { void sendScreenCursorPressMessage(const Vector2SI32 &coord, int type, int modifiers); void sendScreenCursorMoveMessage(const Vector2SI32 &coord, int type, int modifiers); void sendScreenCursorReleaseMessage(const Vector2SI32 &coord, int type, int modifiers); - void sendSetCameraKeyframeInterpolationMessage(const glm::u8vec4 *values); + void sendSetCameraKeyframeInterpolationMessage(const Vector4U8 *values); void sendIsProjectDirtyRequestMessage(pfn_isProjectDirtyCallback callback, void *userData); void sendGetProjectFileURIRequestMessage(pfn_getProjectFileURICallback callback, void *userData); void sendGetAllModelBonesRequestMessage(nanoem_u16_t handle, pfn_getAllModelBonesCallback callback, void *userData); diff --git a/emapp/include/emapp/BezierCurve.h b/emapp/include/emapp/BezierCurve.h index 7002bf27..295b7da9 100644 --- a/emapp/include/emapp/BezierCurve.h +++ b/emapp/include/emapp/BezierCurve.h @@ -17,15 +17,15 @@ class BezierCurve NANOEM_DECL_SEALED : private NonCopyable { typedef tinystl::unordered_map Map; typedef tinystl::pair Pair; - BezierCurve(const glm::u8vec2 &c0, const glm::u8vec2 &c1, nanoem_frame_index_t interval); + BezierCurve(const Vector2U8 &c0, const Vector2U8 &c1, nanoem_frame_index_t interval); ~BezierCurve() NANOEM_DECL_NOEXCEPT; nanoem_f32_t value(nanoem_f32_t value) const NANOEM_DECL_NOEXCEPT; nanoem_frame_index_t length() const NANOEM_DECL_NOEXCEPT; Pair split(const nanoem_f32_t t) const; - glm::u8vec4 toParameters() const NANOEM_DECL_NOEXCEPT; - glm::u8vec2 c0() const NANOEM_DECL_NOEXCEPT; - glm::u8vec2 c1() const NANOEM_DECL_NOEXCEPT; + Vector4U8 toParameters() const NANOEM_DECL_NOEXCEPT; + Vector2U8 c0() const NANOEM_DECL_NOEXCEPT; + Vector2U8 c1() const NANOEM_DECL_NOEXCEPT; static nanoem_u64_t toHash(const nanoem_u8_t *parameters, nanoem_frame_index_t interval) NANOEM_DECL_NOEXCEPT; @@ -45,8 +45,8 @@ class BezierCurve NANOEM_DECL_SEALED : private NonCopyable { static const Vector2 kP0; static const Vector2 kP1; PointList m_parameters; - glm::u8vec2 m_c0; - glm::u8vec2 m_c1; + Vector2U8 m_c0; + Vector2U8 m_c1; nanoem_frame_index_t m_interval; }; diff --git a/emapp/include/emapp/Forward.h b/emapp/include/emapp/Forward.h index 5a77e108..a1126cf2 100644 --- a/emapp/include/emapp/Forward.h +++ b/emapp/include/emapp/Forward.h @@ -971,6 +971,9 @@ typedef glm::vec<4, nanoem_f32_t, glm::packed_highp> Vector4; typedef glm::vec<2, nanoem_i32_t, glm::packed_highp> Vector2SI32; typedef glm::vec<3, nanoem_i32_t, glm::packed_highp> Vector3SI32; typedef glm::vec<4, nanoem_i32_t, glm::packed_highp> Vector4SI32; +typedef glm::vec<2, nanoem_u8_t, glm::packed_highp> Vector2U8; +typedef glm::vec<3, nanoem_u8_t, glm::packed_highp> Vector3U8; +typedef glm::vec<4, nanoem_u8_t, glm::packed_highp> Vector4U8; typedef glm::vec<2, nanoem_u16_t, glm::packed_highp> Vector2UI16; typedef glm::vec<3, nanoem_u16_t, glm::packed_highp> Vector3UI16; typedef glm::vec<4, nanoem_u16_t, glm::packed_highp> Vector4UI16; @@ -1225,7 +1228,7 @@ BX_ALIGN_DECL_16(struct) LineVertexUnit { Vector3 m_position; - glm::u8vec4 m_color; + Vector4U8 m_color; }; BX_ALIGN_DECL_16(struct) diff --git a/emapp/include/emapp/ICamera.h b/emapp/include/emapp/ICamera.h index db9bae0d..1f49e364 100644 --- a/emapp/include/emapp/ICamera.h +++ b/emapp/include/emapp/ICamera.h @@ -66,11 +66,11 @@ class ICamera { virtual void setFov(int value) = 0; virtual nanoem_f32_t fovRadians() const NANOEM_DECL_NOEXCEPT = 0; virtual void setFovRadians(nanoem_f32_t value) = 0; - virtual glm::u8vec4 automaticBezierControlPoint() const NANOEM_DECL_NOEXCEPT = 0; - virtual glm::u8vec4 bezierControlPoints( + virtual Vector4U8 automaticBezierControlPoint() const NANOEM_DECL_NOEXCEPT = 0; + virtual Vector4U8 bezierControlPoints( nanoem_motion_camera_keyframe_interpolation_type_t index) const NANOEM_DECL_NOEXCEPT = 0; virtual void setBezierControlPoints( - nanoem_motion_camera_keyframe_interpolation_type_t index, const glm::u8vec4 &value) = 0; + nanoem_motion_camera_keyframe_interpolation_type_t index, const Vector4U8 &value) = 0; virtual bool isLinearInterpolation( nanoem_motion_camera_keyframe_interpolation_type_t index) const NANOEM_DECL_NOEXCEPT = 0; virtual bool isPerspective() const NANOEM_DECL_NOEXCEPT = 0; diff --git a/emapp/include/emapp/PerspectiveCamera.h b/emapp/include/emapp/PerspectiveCamera.h index 7dd9eb7c..57d33eb2 100644 --- a/emapp/include/emapp/PerspectiveCamera.h +++ b/emapp/include/emapp/PerspectiveCamera.h @@ -26,8 +26,8 @@ class PerspectiveCamera NANOEM_DECL_SEALED : public ICamera, private NonCopyable static const int kMaxFov; static const int kMinFov; static const int kInitialFov; - static const glm::u8vec4 kDefaultBezierControlPoint; - static const glm::u8vec4 kDefaultAutomaticBezierControlPoint; + static const Vector4U8 kDefaultBezierControlPoint; + static const Vector4U8 kDefaultAutomaticBezierControlPoint; PerspectiveCamera(Project *project); ~PerspectiveCamera() NANOEM_DECL_NOEXCEPT; @@ -64,11 +64,11 @@ class PerspectiveCamera NANOEM_DECL_SEALED : public ICamera, private NonCopyable void setFov(int value) NANOEM_DECL_OVERRIDE; nanoem_f32_t fovRadians() const NANOEM_DECL_NOEXCEPT_OVERRIDE; void setFovRadians(nanoem_f32_t value) NANOEM_DECL_OVERRIDE; - glm::u8vec4 automaticBezierControlPoint() const NANOEM_DECL_NOEXCEPT_OVERRIDE; - glm::u8vec4 bezierControlPoints( + Vector4U8 automaticBezierControlPoint() const NANOEM_DECL_NOEXCEPT_OVERRIDE; + Vector4U8 bezierControlPoints( nanoem_motion_camera_keyframe_interpolation_type_t index) const NANOEM_DECL_NOEXCEPT_OVERRIDE; void setBezierControlPoints( - nanoem_motion_camera_keyframe_interpolation_type_t index, const glm::u8vec4 &value) NANOEM_DECL_OVERRIDE; + nanoem_motion_camera_keyframe_interpolation_type_t index, const Vector4U8 &value) NANOEM_DECL_OVERRIDE; bool isLinearInterpolation( nanoem_motion_camera_keyframe_interpolation_type_t index) const NANOEM_DECL_NOEXCEPT_OVERRIDE; bool isPerspective() const NANOEM_DECL_NOEXCEPT_OVERRIDE; @@ -106,8 +106,8 @@ class PerspectiveCamera NANOEM_DECL_SEALED : public ICamera, private NonCopyable Vector3 m_angle; nanoem_f32_t m_distance; tinystl::pair m_fov; - glm::u8vec4 m_bezierControlPoints[NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_MAX_ENUM]; - glm::u8vec4 m_automaticBezierControlPoint; + Vector4U8 m_bezierControlPoints[NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_MAX_ENUM]; + Vector4U8 m_automaticBezierControlPoint; FollowingType m_followingType; bool m_isLinearInterpolation[NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_MAX_ENUM]; bool m_perspective; diff --git a/emapp/include/emapp/command/BaseBoneKeyframeCommand.h b/emapp/include/emapp/command/BaseBoneKeyframeCommand.h index 3a0f9fa1..13f23bb6 100644 --- a/emapp/include/emapp/command/BaseBoneKeyframeCommand.h +++ b/emapp/include/emapp/command/BaseBoneKeyframeCommand.h @@ -21,10 +21,10 @@ class BaseBoneKeyframeCommand : public BaseKeyframeCommand { protected: struct BezierControlPointParameter { - glm::u8vec4 m_value[NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_MAX_ENUM]; + Vector4U8 m_value[NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_MAX_ENUM]; }; struct BezierControlPointParameterTranslationOnly { - glm::u8vec4 m_value[NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION]; + Vector4U8 m_value[NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION]; }; typedef tinystl::pair BezierControlPointParameterTranslationOnlyPair; diff --git a/emapp/include/emapp/command/BaseCameraKeyframeCommand.h b/emapp/include/emapp/command/BaseCameraKeyframeCommand.h index 695068ed..066c33b1 100644 --- a/emapp/include/emapp/command/BaseCameraKeyframeCommand.h +++ b/emapp/include/emapp/command/BaseCameraKeyframeCommand.h @@ -19,10 +19,10 @@ class BaseCameraKeyframeCommand : public BaseKeyframeCommand { protected: struct BezierControlPointParameter { - glm::u8vec4 m_value[NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_MAX_ENUM]; + Vector4U8 m_value[NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_MAX_ENUM]; }; struct BezierControlPointParameterLookAtOnly { - glm::u8vec4 m_value[NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE]; + Vector4U8 m_value[NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE]; }; typedef tinystl::pair BezierControlPointParameterLookAtOnlyPair; diff --git a/emapp/include/emapp/internal/ApplicationUtils.h b/emapp/include/emapp/internal/ApplicationUtils.h index 1af7d567..3537b4f8 100644 --- a/emapp/include/emapp/internal/ApplicationUtils.h +++ b/emapp/include/emapp/internal/ApplicationUtils.h @@ -38,12 +38,12 @@ class ApplicationUtils NANOEM_DECL_SEALED : private NonCopyable { static void allocateStringList( const StringList &input, char **&output, size_t &length, MutableStringList &stringList); static void freeStringList(char **&output) NANOEM_DECL_NOEXCEPT; - static glm::u8vec4 toU8V(const Nanoem__Common__Interpolation *i) NANOEM_DECL_NOEXCEPT; + static Vector4U8 toU8V(const Nanoem__Common__Interpolation *i) NANOEM_DECL_NOEXCEPT; static void allocateURIList(const URIList &values, Nanoem__Application__URI **&uris, size_t &numURIs, MutableStringList &absolutePathList, MutableStringList &fragmentList); static void freeURIList(Nanoem__Application__URI **uris, size_t numURIs) NANOEM_DECL_NOEXCEPT; static Nanoem__Common__Interpolation *assignInteprolation( - Nanoem__Common__Interpolation &i, const glm::u8vec4 &value) NANOEM_DECL_NOEXCEPT; + Nanoem__Common__Interpolation &i, const Vector4U8 &value) NANOEM_DECL_NOEXCEPT; static void constructPluginList(const Nanoem__Application__Plugin *const *items, nanoem_rsize_t numItems, BaseApplicationClient::PluginItemList &plugins); }; diff --git a/emapp/include/emapp/internal/ImGuiWindow.h b/emapp/include/emapp/internal/ImGuiWindow.h index 30468f61..aef15fb5 100644 --- a/emapp/include/emapp/internal/ImGuiWindow.h +++ b/emapp/include/emapp/internal/ImGuiWindow.h @@ -205,7 +205,7 @@ class ImGuiWindow NANOEM_DECL_SEALED : public IUIWindow, private NonCopyable { { Vector4 m_position; Vector3 m_uv; - glm::u8vec4 m_color; + Vector4U8 m_color; }; struct Buffer { Buffer(); diff --git a/emapp/include/emapp/internal/imgui/BoneKeyframeInterpolationCurveGraphDialog.h b/emapp/include/emapp/internal/imgui/BoneKeyframeInterpolationCurveGraphDialog.h index 9a696d66..f1d61bb2 100644 --- a/emapp/include/emapp/internal/imgui/BoneKeyframeInterpolationCurveGraphDialog.h +++ b/emapp/include/emapp/internal/imgui/BoneKeyframeInterpolationCurveGraphDialog.h @@ -22,7 +22,7 @@ struct BoneKeyframeInterpolationCurveGraphDialog : BaseKeyframeInterpolationCurv Model *m_activeModel; nanoem_motion_bone_keyframe_interpolation_type_t m_type; - glm::u8vec4 m_controlPoint; + Vector4U8 m_controlPoint; }; } /* namespace imgui */ diff --git a/emapp/include/emapp/internal/imgui/CameraKeyframeInterpolationCurveGraphDialog.h b/emapp/include/emapp/internal/imgui/CameraKeyframeInterpolationCurveGraphDialog.h index ce3050dd..1ef8c445 100644 --- a/emapp/include/emapp/internal/imgui/CameraKeyframeInterpolationCurveGraphDialog.h +++ b/emapp/include/emapp/internal/imgui/CameraKeyframeInterpolationCurveGraphDialog.h @@ -21,7 +21,7 @@ struct CameraKeyframeInterpolationCurveGraphDialog : BaseKeyframeInterpolationCu bool draw(Project *project); nanoem_motion_camera_keyframe_interpolation_type_t m_type; - glm::u8vec4 m_controlPoint; + Vector4U8 m_controlPoint; }; } /* namespace imgui */ diff --git a/emapp/include/emapp/model/BindPose.h b/emapp/include/emapp/model/BindPose.h index 7c7d1140..58169f69 100644 --- a/emapp/include/emapp/model/BindPose.h +++ b/emapp/include/emapp/model/BindPose.h @@ -46,7 +46,7 @@ struct BindPose { Vector3 m_localUserTranslation; Quaternion m_localMorphOrientation; Quaternion m_localUserOrientation; - glm::u8vec4 m_bezierControlPoints[NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_MAX_ENUM]; + Vector4U8 m_bezierControlPoints[NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_MAX_ENUM]; }; tinystl::vector m_parameters; }; diff --git a/emapp/include/emapp/model/Bone.h b/emapp/include/emapp/model/Bone.h index 10d371fb..1e00e37f 100644 --- a/emapp/include/emapp/model/Bone.h +++ b/emapp/include/emapp/model/Bone.h @@ -29,8 +29,8 @@ class Bone NANOEM_DECL_SEALED : private NonCopyable { typedef tinystl::unordered_map OutsideParentMap; typedef tinystl::vector MutableList; typedef tinystl::unordered_set MutableSet; - static const glm::u8vec4 kDefaultBezierControlPoint; - static const glm::u8vec4 kDefaultAutomaticBezierControlPoint; + static const Vector4U8 kDefaultBezierControlPoint; + static const Vector4U8 kDefaultAutomaticBezierControlPoint; typedef tinystl::pair IndexPair; typedef tinystl::vector IndexSet; @@ -96,8 +96,8 @@ class Bone NANOEM_DECL_SEALED : private NonCopyable { void setLocalMorphTranslation(const Vector3 &value); Vector3 localUserTranslation() const NANOEM_DECL_NOEXCEPT; void setLocalUserTranslation(const Vector3 &value); - glm::u8vec4 bezierControlPoints(nanoem_motion_bone_keyframe_interpolation_type_t index) const NANOEM_DECL_NOEXCEPT; - void setBezierControlPoints(nanoem_motion_bone_keyframe_interpolation_type_t index, const glm::u8vec4 &value); + Vector4U8 bezierControlPoints(nanoem_motion_bone_keyframe_interpolation_type_t index) const NANOEM_DECL_NOEXCEPT; + void setBezierControlPoints(nanoem_motion_bone_keyframe_interpolation_type_t index, const Vector4U8 &value); bool isLinearInterpolation(nanoem_motion_bone_keyframe_interpolation_type_t index) const NANOEM_DECL_NOEXCEPT; void setLinearInterpolation(nanoem_motion_bone_keyframe_interpolation_type_t index, bool value); @@ -117,7 +117,7 @@ class Bone NANOEM_DECL_SEALED : private NonCopyable { ~FrameTransform() NANOEM_DECL_NOEXCEPT; Vector3 m_translation; Quaternion m_orientation; - glm::u8vec4 m_bezierControlPoints[NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_MAX_ENUM]; + Vector4U8 m_bezierControlPoints[NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_MAX_ENUM]; bool m_enableLinearInterpolation[NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_MAX_ENUM]; }; static void destroy(void *opaque, nanoem_model_object_t *object) NANOEM_DECL_NOEXCEPT; @@ -146,7 +146,7 @@ class Bone NANOEM_DECL_SEALED : private NonCopyable { Vector3 m_localInherentTranslation; Vector3 m_localMorphTranslation; Vector3 m_localUserTranslation; - glm::u8vec4 m_bezierControlPoints[NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_MAX_ENUM]; + Vector4U8 m_bezierControlPoints[NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_MAX_ENUM]; bool m_isLinearInterpolation[NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_MAX_ENUM]; bool m_dirty; }; diff --git a/emapp/src/BaseApplicationClient.cc b/emapp/src/BaseApplicationClient.cc index 65155409..dfd4baa2 100644 --- a/emapp/src/BaseApplicationClient.cc +++ b/emapp/src/BaseApplicationClient.cc @@ -1049,7 +1049,7 @@ BaseApplicationClient::sendRemoveSelfShadowKeyframeMessage() void BaseApplicationClient::sendBoneBezierControlPointMessage( - nanoem_u16_t handle, const String &name, const glm::u8vec4 &value, nanoem_u32_t type) + nanoem_u16_t handle, const String &name, const Vector4U8 &value, nanoem_u32_t type) { Nanoem__Application__SetBoneBezierControlPointCommand action = NANOEM__APPLICATION__SET_BONE_BEZIER_CONTROL_POINT_COMMAND__INIT; @@ -1073,7 +1073,7 @@ BaseApplicationClient::sendBoneBezierControlPointMessage( } void -BaseApplicationClient::sendCameraBezierControlPointMessage(const glm::u8vec4 &value, nanoem_u32_t type) +BaseApplicationClient::sendCameraBezierControlPointMessage(const Vector4U8 &value, nanoem_u32_t type) { Nanoem__Application__SetCameraBezierControlPointCommand action = NANOEM__APPLICATION__SET_CAMERA_BEZIER_CONTROL_POINT_COMMAND__INIT; @@ -1514,7 +1514,7 @@ BaseApplicationClient::sendSetModelTransformOrderIndexMessage(nanoem_u16_t handl } void -BaseApplicationClient::sendSetModelBoneKeyframeInterpolationMessage(nanoem_u16_t handle, const glm::u8vec4 *values) +BaseApplicationClient::sendSetModelBoneKeyframeInterpolationMessage(nanoem_u16_t handle, const Vector4U8 *values) { Nanoem__Application__SetModelBoneKeyframeInterpolationCommand action = NANOEM__APPLICATION__SET_MODEL_BONE_KEYFRAME_INTERPOLATION_COMMAND__INIT; @@ -1717,7 +1717,7 @@ BaseApplicationClient::sendScreenCursorReleaseMessage(const Vector2SI32 &coord, } void -BaseApplicationClient::sendSetCameraKeyframeInterpolationMessage(const glm::u8vec4 *values) +BaseApplicationClient::sendSetCameraKeyframeInterpolationMessage(const Vector4U8 *values) { Nanoem__Application__SetCameraKeyframeInterpolationCommand action = NANOEM__APPLICATION__SET_CAMERA_KEYFRAME_INTERPOLATION_COMMAND__INIT; diff --git a/emapp/src/BaseApplicationService.cc b/emapp/src/BaseApplicationService.cc index f31c69d2..c792c981 100644 --- a/emapp/src/BaseApplicationService.cc +++ b/emapp/src/BaseApplicationService.cc @@ -3964,7 +3964,7 @@ BaseApplicationService::handleCommandMessage(Nanoem__Application__Command *comma : project->activeModel(); if (model && commandPtr->bone_name) { if (const nanoem_model_bone_t *bonePtr = model->findBone(commandPtr->bone_name)) { - const glm::u8vec4 value(commandPtr->x0, commandPtr->y0, commandPtr->x1, commandPtr->y1); + const Vector4U8 value(commandPtr->x0, commandPtr->y0, commandPtr->x1, commandPtr->y1); model::Bone *bone = model::Bone::cast(bonePtr); bone->setBezierControlPoints( static_cast(commandPtr->type), value); @@ -3975,7 +3975,7 @@ BaseApplicationService::handleCommandMessage(Nanoem__Application__Command *comma case NANOEM__APPLICATION__COMMAND__TYPE_SET_CAMERA_BEZIER_CONTROL_POINT: { const Nanoem__Application__SetCameraBezierControlPointCommand *commandPtr = command->set_camera_bezier_control_point; - const glm::u8vec4 value(commandPtr->x0, commandPtr->y0, commandPtr->x1, commandPtr->y1); + const Vector4U8 value(commandPtr->x0, commandPtr->y0, commandPtr->x1, commandPtr->y1); project->globalCamera()->setBezierControlPoints( static_cast(commandPtr->type), value); break; diff --git a/emapp/src/BezierCurve.cc b/emapp/src/BezierCurve.cc index d8374a92..c6ba16aa 100644 --- a/emapp/src/BezierCurve.cc +++ b/emapp/src/BezierCurve.cc @@ -13,7 +13,7 @@ namespace nanoem { const Vector2 BezierCurve::kP0 = Vector2(0); const Vector2 BezierCurve::kP1 = Vector2(127); -BezierCurve::BezierCurve(const glm::u8vec2 &c0, const glm::u8vec2 &c1, nanoem_frame_index_t interval) +BezierCurve::BezierCurve(const Vector2U8 &c0, const Vector2U8 &c1, nanoem_frame_index_t interval) : m_c0(c0) , m_c1(c1) , m_interval(interval) @@ -71,19 +71,19 @@ BezierCurve::split(const nanoem_f32_t t) const return Pair(lvalue, rvalue); } -glm::u8vec4 +Vector4U8 BezierCurve::toParameters() const NANOEM_DECL_NOEXCEPT { - return glm::u8vec4(m_c0, m_c1); + return Vector4U8(m_c0, m_c1); } -glm::u8vec2 +Vector2U8 BezierCurve::c0() const NANOEM_DECL_NOEXCEPT { return m_c0; } -glm::u8vec2 +Vector2U8 BezierCurve::c1() const NANOEM_DECL_NOEXCEPT { return m_c1; diff --git a/emapp/src/CommandMessage.inl b/emapp/src/CommandMessage.inl index 41d40c2e..855dfb06 100644 --- a/emapp/src/CommandMessage.inl +++ b/emapp/src/CommandMessage.inl @@ -105,7 +105,7 @@ public: nanoem_delete(q); } static inline void - setInterpolation(const glm::u8vec4 &v, Nanoem__Common__Interpolation *&i) + setInterpolation(const Vector4U8 &v, Nanoem__Common__Interpolation *&i) { i = nanoem_new(Nanoem__Common__Interpolation); nanoem__common__interpolation__init(i); @@ -115,7 +115,7 @@ public: i->y1 = v.w; } static inline void - getInterpolation(const Nanoem__Common__Interpolation *i, glm::u8vec4 &v) + getInterpolation(const Nanoem__Common__Interpolation *i, Vector4U8 &v) { v.x = i->x0; v.y = i->y0; diff --git a/emapp/src/Grid.cc b/emapp/src/Grid.cc index 31c71ed8..d8965184 100644 --- a/emapp/src/Grid.cc +++ b/emapp/src/Grid.cc @@ -145,7 +145,7 @@ Grid::numVertices() const void Grid::generateXGrid(sg::LineVertexUnit *vertices, int &index) { - const glm::u8vec4 color(m_lineColor * Vector3(0xff), m_opacity * 0xff); + const Vector4U8 color(m_lineColor * Vector3(0xff), m_opacity * 0xff); for (int i = -int(m_size.x); i <= int(m_size.x); i++) { nanoem_f32_t height = m_size.y * m_cell.y; nanoem_f32_t x = i * m_cell.x; @@ -163,7 +163,7 @@ Grid::generateXGrid(sg::LineVertexUnit *vertices, int &index) void Grid::generateYGrid(sg::LineVertexUnit *vertices, int &index) { - const glm::u8vec4 color(m_lineColor * Vector3(0xff), m_opacity * 0xff); + const Vector4U8 color(m_lineColor * Vector3(0xff), m_opacity * 0xff); for (int i = -int(m_size.y); i <= int(m_size.y); i++) { nanoem_f32_t width = m_size.x * m_cell.x; nanoem_f32_t z = i * m_cell.y; @@ -181,7 +181,7 @@ Grid::generateYGrid(sg::LineVertexUnit *vertices, int &index) void Grid::generateUnit(sg::LineVertexUnit *vertices, const Vector3 &color, int &index) { - const glm::u8vec4 c(color * Vector3(0xff), m_opacity * 0xff); + const Vector4U8 c(color * Vector3(0xff), m_opacity * 0xff); nanoem_f32_t width = m_size.x * m_cell.x; sg::LineVertexUnit &from = vertices[index]; from.m_position = Vector3(0, 0, 0); diff --git a/emapp/src/Model.cc b/emapp/src/Model.cc index 63668c85..0992b738 100644 --- a/emapp/src/Model.cc +++ b/emapp/src/Model.cc @@ -496,7 +496,7 @@ Model::DrawIndexedBuffer::fillShape(const par_shapes_mesh *shape, const Vector4 if (!sg::is_valid(m_vertexBuffer)) { size_t size = sizeof(m_vertices[0]) * numVertices; m_vertices.resize(numVertices); - const glm::u8vec4 &normalizedColor = color * Vector4(0xff); + const Vector4U8 &normalizedColor = color * Vector4(0xff); for (nanoem_u32_t i = 0; i < numVertices; i++) { sg::LineVertexUnit &unit = m_vertices[i]; unit.m_position = Vector4(glm::make_vec3(&shape->points[i * 3]), 1); @@ -3642,7 +3642,7 @@ Model::drawAllVertexPoints() Model::VertexUnit::performSkinningByType(vertex, ptr, &normal); } vertexUnit.m_color = - m_selection->containsVertex(vertexPtr) ? glm::u8vec4(0xff, 0, 0, 0xff) : glm::u8vec4(0, 0, 0xff, 0xff); + m_selection->containsVertex(vertexPtr) ? Vector4U8(0xff, 0, 0, 0xff) : Vector4U8(0, 0, 0xff, 0xff); } const nanoem_rsize_t size = Inline::saturateInt32(sizeof(*vertexUnits) * numNewVertices); if (size > 0) { @@ -3731,7 +3731,8 @@ Model::drawAllVertexFaces() else { Model::VertexUnit::performSkinningByType(vertex, ptr, &normal); } - vertexUnit.m_color = m_selection->containsVertexIndex(i) ? glm::u8vec4(0xff, 0, 0, 0x7f) : glm::u8vec4(0, 0, 0, 0x7f); + vertexUnit.m_color = + m_selection->containsVertexIndex(i) ? Vector4U8(0xff, 0, 0, 0x7f) : Vector4U8(0, 0, 0, 0x7f); } internal::LineDrawer *drawer = lineDrawer(); sg::update_buffer(m_drawAllLines.m_vertexBuffer, m_drawAllLines.m_vertices.data(), diff --git a/emapp/src/PerspectiveCamera.cc b/emapp/src/PerspectiveCamera.cc index 59dcd724..bdbc393b 100644 --- a/emapp/src/PerspectiveCamera.cc +++ b/emapp/src/PerspectiveCamera.cc @@ -40,8 +40,8 @@ const nanoem_f32_t PerspectiveCamera::kInitialFovRadian = glm::radians(nanoem_f3 const int PerspectiveCamera::kMaxFov = 135; const int PerspectiveCamera::kMinFov = 1; const int PerspectiveCamera::kInitialFov = 30; -const glm::u8vec4 PerspectiveCamera::kDefaultBezierControlPoint = glm::u8vec4(20, 20, 107, 107); -const glm::u8vec4 PerspectiveCamera::kDefaultAutomaticBezierControlPoint = glm::u8vec4(64, 0, 64, 127); +const Vector4U8 PerspectiveCamera::kDefaultBezierControlPoint = Vector4U8(20, 20, 107, 107); +const Vector4U8 PerspectiveCamera::kDefaultAutomaticBezierControlPoint = Vector4U8(64, 0, 64, 127); PerspectiveCamera::PerspectiveCamera(Project *project) : m_project(project) @@ -505,13 +505,13 @@ PerspectiveCamera::setFovRadians(nanoem_f32_t value) } } -glm::u8vec4 +Vector4U8 PerspectiveCamera::automaticBezierControlPoint() const NANOEM_DECL_NOEXCEPT { return m_automaticBezierControlPoint; } -glm::u8vec4 +Vector4U8 PerspectiveCamera::bezierControlPoints( nanoem_motion_camera_keyframe_interpolation_type_t index) const NANOEM_DECL_NOEXCEPT { @@ -520,7 +520,7 @@ PerspectiveCamera::bezierControlPoints( void PerspectiveCamera::setBezierControlPoints( - nanoem_motion_camera_keyframe_interpolation_type_t index, const glm::u8vec4 &value) + nanoem_motion_camera_keyframe_interpolation_type_t index, const Vector4U8 &value) { m_bezierControlPoints[index] = value; } diff --git a/emapp/src/command/AddBoneKeyframeCommand.cc b/emapp/src/command/AddBoneKeyframeCommand.cc index f5ec645f..a3744d7d 100644 --- a/emapp/src/command/AddBoneKeyframeCommand.cc +++ b/emapp/src/command/AddBoneKeyframeCommand.cc @@ -147,7 +147,7 @@ AddBoneKeyframeCommand::toKeyframe(const nanoem_model_bone_t *bonePtr, const Mot for (nanoem_rsize_t i = 0; i < BX_COUNTOF(p.first.m_value); i++) { nanoem_motion_bone_keyframe_interpolation_type_t type = nanoem_motion_bone_keyframe_interpolation_type_t(i); - const glm::u8vec4 &prevKeyframeInterpolationParameter = + const Vector4U8 &prevKeyframeInterpolationParameter = glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(prevKeyframe, type)); newState.m_parameter.m_value[i] = bone->bezierControlPoints(type); if (enableBezierCurveAdjustment && movable) { diff --git a/emapp/src/internal/ApplicationUtils.cc b/emapp/src/internal/ApplicationUtils.cc index 72e3176d..4def97ab 100644 --- a/emapp/src/internal/ApplicationUtils.cc +++ b/emapp/src/internal/ApplicationUtils.cc @@ -88,10 +88,10 @@ ApplicationUtils::freeStringList(char **&output) NANOEM_DECL_NOEXCEPT delete[] output; } -glm::u8vec4 +Vector4U8 ApplicationUtils::toU8V(const Nanoem__Common__Interpolation *i) NANOEM_DECL_NOEXCEPT { - return glm::u8vec4(i->x0, i->y0, i->x1, i->y1); + return Vector4U8(i->x0, i->y0, i->x1, i->y1); } void @@ -122,7 +122,7 @@ ApplicationUtils::freeURIList(Nanoem__Application__URI **uris, size_t numURIs) N } Nanoem__Common__Interpolation * -ApplicationUtils::assignInteprolation(Nanoem__Common__Interpolation &i, const glm::u8vec4 &value) NANOEM_DECL_NOEXCEPT +ApplicationUtils::assignInteprolation(Nanoem__Common__Interpolation &i, const Vector4U8 &value) NANOEM_DECL_NOEXCEPT { i = NANOEM__COMMON__INTERPOLATION__INIT; i.x0 = value.x; diff --git a/emapp/src/internal/ImGuiWindow.cc b/emapp/src/internal/ImGuiWindow.cc index 734de226..f1c4d5f1 100644 --- a/emapp/src/internal/ImGuiWindow.cc +++ b/emapp/src/internal/ImGuiWindow.cc @@ -2871,13 +2871,13 @@ ImGuiWindow::drawCommonInterpolationControls(Project *project) void ImGuiWindow::drawBoneInterpolationPanel(const ImVec2 &panelSize, Model *activeModel, Project *project) { - static const glm::u8vec4 kMinCurvePointValue(0), kMaxCurvePointValue(0x7f); + static const Vector4U8 kMinCurvePointValue(0), kMaxCurvePointValue(0x7f); ImGui::BeginChild("interpolation", panelSize, true); ImGui::TextUnformatted(tr("nanoem.gui.panel.interpolation")); ImGui::Separator(); ImGui::Spacing(); ImGui::PushItemWidth(-1); - glm::u8vec4 controlPoint(20, 20, 107, 107); + Vector4U8 controlPoint(20, 20, 107, 107); nanoem_motion_bone_keyframe_interpolation_type_t type = project->boneKeyframeInterpolationType(); model::Bone *bone = nullptr; if (Motion *activeMotion = project->resolveMotion(activeModel)) { @@ -2955,13 +2955,13 @@ ImGuiWindow::drawBoneInterpolationPanel(const ImVec2 &panelSize, Model *activeMo void ImGuiWindow::drawCameraInterpolationPanel(const ImVec2 &panelSize, Project *project) { - static const glm::u8vec4 kMinCurvePointValue(0), kMaxCurvePointValue(0x7f); + static const Vector4U8 kMinCurvePointValue(0), kMaxCurvePointValue(0x7f); ImGui::BeginChild("interpolation", panelSize, true); ImGui::TextUnformatted(tr("nanoem.gui.panel.interpolation")); ImGui::Separator(); ImGui::Spacing(); ImGui::PushItemWidth(-1); - glm::u8vec4 controlPoint(20, 20, 107, 107); + Vector4U8 controlPoint(20, 20, 107, 107); nanoem_motion_camera_keyframe_interpolation_type_t type = project->cameraKeyframeInterpolationType(); controlPoint = project->globalCamera()->bezierControlPoints(type); if (handleButton(reinterpret_cast(kFACogs))) { diff --git a/emapp/src/internal/imgui/BaseKeyframeInterpolationCurveGraphDialog.cc b/emapp/src/internal/imgui/BaseKeyframeInterpolationCurveGraphDialog.cc index 7e36824d..e4e15a6c 100644 --- a/emapp/src/internal/imgui/BaseKeyframeInterpolationCurveGraphDialog.cc +++ b/emapp/src/internal/imgui/BaseKeyframeInterpolationCurveGraphDialog.cc @@ -123,7 +123,7 @@ BaseKeyframeInterpolationCurveGraphDialog::drawXCircle(ImDrawList *drawList, con ImGui::InvisibleButton("x", circleRect); if (ImGui::IsItemActive() && ImGui::IsMouseDragging(ImGuiMouseButton_Left)) { ImVec2 pos = ImGui::GetMousePos(); - const glm::u8vec2 newControlPoint( + const Vector2U8 newControlPoint( glm::ceil((glm::clamp(pos.x - rectFrom.x, 0.0f, avail.y) / avail.x) * kInterpolationMaxFloatValue), kInterpolationMaxFloatValue - glm::ceil((glm::clamp(pos.y - rectFrom.y, 0.0f, avail.y) / avail.y) * kInterpolationMaxFloatValue)); @@ -142,7 +142,7 @@ BaseKeyframeInterpolationCurveGraphDialog::drawYCircle(ImDrawList *drawList, con ImGui::InvisibleButton("y", circleRect); if (ImGui::IsItemActive() && ImGui::IsMouseDragging(ImGuiMouseButton_Left)) { ImVec2 pos = ImGui::GetMousePos(); - const glm::u8vec2 newControlPoint( + const Vector2U8 newControlPoint( glm::ceil((glm::clamp(pos.x - rectFrom.x, 0.0f, avail.y) / avail.x) * kInterpolationMaxFloatValue), kInterpolationMaxFloatValue - glm::ceil((glm::clamp(pos.y - rectFrom.y, 0.0f, avail.y) / avail.y) * kInterpolationMaxFloatValue)); diff --git a/emapp/src/internal/project/JSON.cc b/emapp/src/internal/project/JSON.cc index 865b11c6..65737b94 100644 --- a/emapp/src/internal/project/JSON.cc +++ b/emapp/src/internal/project/JSON.cc @@ -75,7 +75,7 @@ JSON::load(const JSON_Value *value) } JSON_Array *colorValue = json_object_dotget_array(root, "screen.color"); if (json_array_get_count(colorValue) >= 4) { - const glm::u8vec4 screenColor(json_array_get_number(colorValue, 0), json_array_get_number(colorValue, 1), + const Vector4U8 screenColor(json_array_get_number(colorValue, 0), json_array_get_number(colorValue, 1), json_array_get_number(colorValue, 2), json_array_get_number(colorValue, 3)); m_project->setViewportBackgroundColor(Vector4(screenColor) / Vector4(0xff)); } @@ -141,7 +141,7 @@ JSON::save(JSON_Value *value) const ShadowCamera *shadowCamera = m_project->shadowCamera(); json_object_dotset_number(root, "shadowmap.distance", shadowCamera->distance()); json_object_dotset_number(root, "shadowmap.mode", shadowCamera->coverageMode()); - const glm::u8vec4 color(m_project->viewportBackgroundColor() * Vector4(0xff)); + const Vector4U8 color(m_project->viewportBackgroundColor() * Vector4(0xff)); JSON_Value *colorValue = json_value_init_array(); JSON_Array *colorArray = json_array(colorValue); json_array_append_number(colorArray, color.x); diff --git a/emapp/src/model/Bone.cc b/emapp/src/model/Bone.cc index 1cab8415..4b45f789 100644 --- a/emapp/src/model/Bone.cc +++ b/emapp/src/model/Bone.cc @@ -44,8 +44,8 @@ shrink3x3(const bx::float4x4_t *m, bx::float4x4_t *o) NANOEM_DECL_NOEXCEPT } /* anonymous */ -const glm::u8vec4 Bone::kDefaultBezierControlPoint = glm::u8vec4(20, 20, 107, 107); -const glm::u8vec4 Bone::kDefaultAutomaticBezierControlPoint = glm::u8vec4(64, 0, 64, 127); +const Vector4U8 Bone::kDefaultBezierControlPoint = Vector4U8(20, 20, 107, 107); +const Vector4U8 Bone::kDefaultAutomaticBezierControlPoint = Vector4U8(64, 0, 64, 127); const Bone::FrameTransform Bone::FrameTransform::kInitialFrameTransform = FrameTransform(); @@ -608,14 +608,14 @@ Bone::setLocalMorphTranslation(const Vector3 &value) m_localMorphTranslation = value; } -glm::u8vec4 +Vector4U8 Bone::bezierControlPoints(nanoem_motion_bone_keyframe_interpolation_type_t index) const NANOEM_DECL_NOEXCEPT { return m_bezierControlPoints[index]; } void -Bone::setBezierControlPoints(nanoem_motion_bone_keyframe_interpolation_type_t index, const glm::u8vec4 &value) +Bone::setBezierControlPoints(nanoem_motion_bone_keyframe_interpolation_type_t index, const Vector4U8 &value) { m_bezierControlPoints[index] = value; } @@ -874,7 +874,7 @@ Bone::Bone(const PlaceHolder & /* holder */) NANOEM_DECL_NOEXCEPT : m_localOrien identify(&m_matrices.m_skinningTransform); identify(&m_matrices.m_worldTransform); for (size_t i = 0; i < BX_COUNTOF(m_isLinearInterpolation); i++) { - m_bezierControlPoints[i] = glm::u8vec4(0); + m_bezierControlPoints[i] = Vector4U8(0); m_isLinearInterpolation[i] = true; } } diff --git a/emapp/test/common.h b/emapp/test/common.h index 83c50758..cccaa308 100644 --- a/emapp/test/common.h +++ b/emapp/test/common.h @@ -43,8 +43,8 @@ template <> struct StringMaker { template <> struct StringMaker { static std::string convert(const nanoem::Vector4 &value); }; -template <> struct StringMaker { - static std::string convert(const glm::u8vec4 &value); +template <> struct StringMaker { + static std::string convert(const nanoem::Vector4U8 &value); }; template <> struct StringMaker { static std::string convert(const nanoem_motion_outside_parent_t *const &value); @@ -101,12 +101,12 @@ struct EqualsVec4 : Catch::Matchers::Impl::MatcherBase { nanoem::Vector4 m_data; }; -struct EqualsU8Vec4 : Catch::Matchers::Impl::MatcherBase { - EqualsU8Vec4(const glm::u8vec4 &v); +struct EqualsU8Vec4 : Catch::Matchers::Impl::MatcherBase { + EqualsU8Vec4(const nanoem::Vector4U8 &v); EqualsU8Vec4(const EqualsU8Vec4 &v); - bool match(const glm::u8vec4 &v) const override; + bool match(const nanoem::Vector4U8 &v) const override; std::string describe() const override; - glm::u8vec4 m_data; + nanoem::Vector4U8 m_data; }; struct EqualsQuat : Catch::Matchers::Impl::MatcherBase { @@ -144,7 +144,7 @@ Equals(const nanoem::Vector4 &v) } static inline matcher::EqualsU8Vec4 -Equals(const glm::u8vec4 &v) +Equals(const nanoem::Vector4U8 &v) { return matcher::EqualsU8Vec4(v); } diff --git a/emapp/test/common/matcher.cc b/emapp/test/common/matcher.cc index 7edd2b63..8472a007 100644 --- a/emapp/test/common/matcher.cc +++ b/emapp/test/common/matcher.cc @@ -78,7 +78,7 @@ EqualsVec4::describe() const return "== " + glm::to_string(m_data); } -EqualsU8Vec4::EqualsU8Vec4(const glm::u8vec4 &v) +EqualsU8Vec4::EqualsU8Vec4(const Vector4U8 &v) : m_data(v) { } @@ -89,7 +89,7 @@ EqualsU8Vec4::EqualsU8Vec4(const EqualsU8Vec4 &v) } bool -EqualsU8Vec4::match(const glm::u8vec4 &v) const +EqualsU8Vec4::match(const Vector4U8 &v) const { return m_data == v; } diff --git a/emapp/test/common/stringify.cc b/emapp/test/common/stringify.cc index 7cce4a23..036209b7 100644 --- a/emapp/test/common/stringify.cc +++ b/emapp/test/common/stringify.cc @@ -60,7 +60,7 @@ StringMaker::convert(const Vector4 &value) } std::string -StringMaker::convert(const glm::u8vec4 &value) +StringMaker::convert(const Vector4U8 &value) { return glm::to_string(value); } diff --git a/emapp/test/motion/motion_add_bone_keyframe.cc b/emapp/test/motion/motion_add_bone_keyframe.cc index d0179e57..f1673be4 100644 --- a/emapp/test/motion/motion_add_bone_keyframe.cc +++ b/emapp/test/motion/motion_add_bone_keyframe.cc @@ -32,13 +32,13 @@ TEST_CASE("motion_add_bone_keyframe", "[emapp][motion]") bone->setLocalUserTranslation(Vector3(0.1, 0.2, 0.3)); bone->setLocalUserOrientation(Quaternion(0.9f, 0.1f, 0.2f, 0.3f)); bone->setBezierControlPoints( - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X, glm::u8vec4(2, 4, 6, 8)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X, Vector4U8(2, 4, 6, 8)); bone->setBezierControlPoints( - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y, glm::u8vec4(3, 5, 7, 9)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y, Vector4U8(3, 5, 7, 9)); bone->setBezierControlPoints( - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z, glm::u8vec4(11, 13, 15, 17)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z, Vector4U8(11, 13, 15, 17)); bone->setBezierControlPoints( - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION, glm::u8vec4(12, 14, 16, 18)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION, Vector4U8(12, 14, 16, 18)); bone->setDirty(true); activeModel->performAllBonesTransform(); } @@ -60,13 +60,13 @@ TEST_CASE("motion_add_bone_keyframe", "[emapp][motion]") CHECK( glm::make_quat(nanoemMotionBoneKeyframeGetOrientation(keyframe)) == Quaternion(0.9f, 0.1f, 0.2f, 0.3f)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X)) == glm::u8vec4(2, 4, 6, 8)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X)) == Vector4U8(2, 4, 6, 8)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y)) == glm::u8vec4(3, 5, 7, 9)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y)) == Vector4U8(3, 5, 7, 9)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z)) == glm::u8vec4(11, 13, 15, 17)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z)) == Vector4U8(11, 13, 15, 17)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION)) == glm::u8vec4(12, 14, 16, 18)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION)) == Vector4U8(12, 14, 16, 18)); CHECK(project->duration() == 1337); CHECK(first->motionDuration(activeModel) == 1337); CHECK(first->motionDuration(other1Model) == 0); @@ -106,13 +106,13 @@ TEST_CASE("motion_add_bone_keyframe", "[emapp][motion]") CHECK( glm::make_quat(nanoemMotionBoneKeyframeGetOrientation(keyframe)) == Quaternion(0.9f, 0.1f, 0.2f, 0.3f)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X)) == glm::u8vec4(2, 4, 6, 8)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X)) == Vector4U8(2, 4, 6, 8)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y)) == glm::u8vec4(3, 5, 7, 9)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y)) == Vector4U8(3, 5, 7, 9)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z)) == glm::u8vec4(11, 13, 15, 17)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z)) == Vector4U8(11, 13, 15, 17)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION)) == glm::u8vec4(12, 14, 16, 18)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION)) == Vector4U8(12, 14, 16, 18)); CHECK(project->duration() == 1337); CHECK(first->motionDuration(activeModel) == 1337); CHECK(first->motionDuration(other1Model) == 0); @@ -133,13 +133,13 @@ TEST_CASE("motion_add_bone_keyframe", "[emapp][motion]") CHECK( glm::make_quat(nanoemMotionBoneKeyframeGetOrientation(keyframe)) == Quaternion(0.9f, 0.1f, 0.2f, 0.3f)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X)) == glm::u8vec4(2, 4, 6, 8)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X)) == Vector4U8(2, 4, 6, 8)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y)) == glm::u8vec4(3, 5, 7, 9)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y)) == Vector4U8(3, 5, 7, 9)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z)) == glm::u8vec4(11, 13, 15, 17)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z)) == Vector4U8(11, 13, 15, 17)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION)) == glm::u8vec4(12, 14, 16, 18)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION)) == Vector4U8(12, 14, 16, 18)); CHECK(project2->duration() == 1337); CHECK(second->motionDuration(activeModel2) == 1337); CHECK_FALSE(scope.hasAnyError()); @@ -159,13 +159,13 @@ TEST_CASE("motion_add_bone_keyframe", "[emapp][motion]") bone->setLocalUserTranslation(Vector3(0.1, 0.2, 0.3)); bone->setLocalUserOrientation(Quaternion(0.9f, 0.1f, 0.2f, 0.3f)); bone->setBezierControlPoints( - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X, glm::u8vec4(2, 4, 6, 8)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X, Vector4U8(2, 4, 6, 8)); bone->setBezierControlPoints( - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y, glm::u8vec4(3, 5, 7, 9)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y, Vector4U8(3, 5, 7, 9)); bone->setBezierControlPoints( - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z, glm::u8vec4(11, 13, 15, 17)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z, Vector4U8(11, 13, 15, 17)); bone->setBezierControlPoints( - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION, glm::u8vec4(12, 14, 16, 18)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION, Vector4U8(12, 14, 16, 18)); bone->setDirty(true); activeModel->performAllBonesTransform(); CommandRegistrator registrator(project); diff --git a/emapp/test/motion/motion_add_camera_keyframe.cc b/emapp/test/motion/motion_add_camera_keyframe.cc index 8a17f2b7..9ef731fa 100644 --- a/emapp/test/motion/motion_add_camera_keyframe.cc +++ b/emapp/test/motion/motion_add_camera_keyframe.cc @@ -26,17 +26,17 @@ TEST_CASE("motion_add_camera_keyframe", "[emapp][motion]") camera->setFovRadians(glm::radians(35.0f)); camera->setDistance(511); camera->setBezierControlPoints( - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_X, glm::u8vec4(2, 4, 6, 8)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_X, Vector4U8(2, 4, 6, 8)); camera->setBezierControlPoints( - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Y, glm::u8vec4(3, 5, 7, 9)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Y, Vector4U8(3, 5, 7, 9)); camera->setBezierControlPoints( - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Z, glm::u8vec4(11, 13, 15, 17)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Z, Vector4U8(11, 13, 15, 17)); camera->setBezierControlPoints( - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE, glm::u8vec4(12, 14, 16, 18)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE, Vector4U8(12, 14, 16, 18)); camera->setBezierControlPoints( - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_FOV, glm::u8vec4(24, 26, 28, 30)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_FOV, Vector4U8(24, 26, 28, 30)); camera->setBezierControlPoints( - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_DISTANCE, glm::u8vec4(25, 27, 29, 31)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_DISTANCE, Vector4U8(25, 27, 29, 31)); } CommandRegistrator registrator(project); registrator.registerAddCameraKeyframesCommandByCurrentLocalFrameIndex(); @@ -53,17 +53,17 @@ TEST_CASE("motion_add_camera_keyframe", "[emapp][motion]") CHECK(nanoemMotionCameraKeyframeGetDistance(keyframe) == Approx(-511)); CHECK(project->duration() == 1337); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( - keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_X)) == glm::u8vec4(2, 4, 6, 8)); + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_X)) == Vector4U8(2, 4, 6, 8)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( - keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Y)) == glm::u8vec4(3, 5, 7, 9)); + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Y)) == Vector4U8(3, 5, 7, 9)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Z)) == glm::u8vec4(11, 13, 15, 17)); - CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE)) == glm::u8vec4(12, 14, 16, 18)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Z)) == Vector4U8(11, 13, 15, 17)); + CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE)) == Vector4U8(12, 14, 16, 18)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( - keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_FOV)) == glm::u8vec4(24, 26, 28, 30)); + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_FOV)) == Vector4U8(24, 26, 28, 30)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_DISTANCE)) == glm::u8vec4(25, 27, 29, 31)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_DISTANCE)) == Vector4U8(25, 27, 29, 31)); CHECK(project->cameraMotion()->isDirty()); CHECK_FALSE(scope.hasAnyError()); } @@ -89,17 +89,17 @@ TEST_CASE("motion_add_camera_keyframe", "[emapp][motion]") CHECK(nanoemMotionCameraKeyframeGetDistance(keyframe) == Approx(-511)); CHECK(project->duration() == 1337); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( - keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_X)) == glm::u8vec4(2, 4, 6, 8)); + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_X)) == Vector4U8(2, 4, 6, 8)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( - keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Y)) == glm::u8vec4(3, 5, 7, 9)); - CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Z)) == glm::u8vec4(11, 13, 15, 17)); + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Y)) == Vector4U8(3, 5, 7, 9)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE)) == glm::u8vec4(12, 14, 16, 18)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Z)) == Vector4U8(11, 13, 15, 17)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( - keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_FOV)) == glm::u8vec4(24, 26, 28, 30)); + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE)) == Vector4U8(12, 14, 16, 18)); + CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_FOV)) == Vector4U8(24, 26, 28, 30)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_DISTANCE)) == glm::u8vec4(25, 27, 29, 31)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_DISTANCE)) == Vector4U8(25, 27, 29, 31)); CHECK_FALSE(scope.hasAnyError()); } SECTION("recovery") @@ -118,17 +118,17 @@ TEST_CASE("motion_add_camera_keyframe", "[emapp][motion]") CHECK(nanoemMotionCameraKeyframeGetDistance(keyframe) == Approx(-511)); CHECK(project2->duration() == 1337); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( - keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_X)) == glm::u8vec4(2, 4, 6, 8)); + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_X)) == Vector4U8(2, 4, 6, 8)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( - keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Y)) == glm::u8vec4(3, 5, 7, 9)); - CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Z)) == glm::u8vec4(11, 13, 15, 17)); + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Y)) == Vector4U8(3, 5, 7, 9)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE)) == glm::u8vec4(12, 14, 16, 18)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Z)) == Vector4U8(11, 13, 15, 17)); + CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE)) == Vector4U8(12, 14, 16, 18)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( - keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_FOV)) == glm::u8vec4(24, 26, 28, 30)); + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_FOV)) == Vector4U8(24, 26, 28, 30)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_DISTANCE)) == glm::u8vec4(25, 27, 29, 31)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_DISTANCE)) == Vector4U8(25, 27, 29, 31)); CHECK_FALSE(scope.hasAnyError()); } } diff --git a/emapp/test/motion/motion_remove_bone_keyframe.cc b/emapp/test/motion/motion_remove_bone_keyframe.cc index 90069c9f..efb7e724 100644 --- a/emapp/test/motion/motion_remove_bone_keyframe.cc +++ b/emapp/test/motion/motion_remove_bone_keyframe.cc @@ -32,13 +32,13 @@ TEST_CASE("motion_remove_bone_keyframe", "[emapp][motion]") bone->setLocalUserTranslation(Vector3(0.1, 0.2, 0.3)); bone->setLocalUserOrientation(Quaternion(0.9f, 0.1f, 0.2f, 0.3f)); bone->setBezierControlPoints( - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X, glm::u8vec4(2, 4, 6, 8)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X, Vector4U8(2, 4, 6, 8)); bone->setBezierControlPoints( - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y, glm::u8vec4(3, 5, 7, 9)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y, Vector4U8(3, 5, 7, 9)); bone->setBezierControlPoints( - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z, glm::u8vec4(11, 13, 15, 17)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z, Vector4U8(11, 13, 15, 17)); bone->setBezierControlPoints( - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION, glm::u8vec4(12, 14, 16, 18)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION, Vector4U8(12, 14, 16, 18)); bone->setDirty(true); activeModel->performAllBonesTransform(); } @@ -79,13 +79,13 @@ TEST_CASE("motion_remove_bone_keyframe", "[emapp][motion]") CHECK_THAT(glm::make_quat(nanoemMotionBoneKeyframeGetOrientation(keyframe)), Equals(Quaternion(0.9f, 0.1f, 0.2f, 0.3f))); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X)) == glm::u8vec4(2, 4, 6, 8)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X)) == Vector4U8(2, 4, 6, 8)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y)) == glm::u8vec4(3, 5, 7, 9)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y)) == Vector4U8(3, 5, 7, 9)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z)) == glm::u8vec4(11, 13, 15, 17)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z)) == Vector4U8(11, 13, 15, 17)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION)) == glm::u8vec4(12, 14, 16, 18)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION)) == Vector4U8(12, 14, 16, 18)); CHECK(project->duration() == 1337); CHECK(first->motionDuration(activeModel) == 1337); CHECK(first->motionDuration(other1Model) == 0); @@ -134,13 +134,13 @@ TEST_CASE("motion_remove_bone_keyframe", "[emapp][motion]") bone->setLocalUserTranslation(Vector3(0.1, 0.2, 0.3)); bone->setLocalUserOrientation(Quaternion(0.9f, 0.1f, 0.2f, 0.3f)); bone->setBezierControlPoints( - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X, glm::u8vec4(2, 4, 6, 8)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X, Vector4U8(2, 4, 6, 8)); bone->setBezierControlPoints( - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y, glm::u8vec4(3, 5, 7, 9)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y, Vector4U8(3, 5, 7, 9)); bone->setBezierControlPoints( - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z, glm::u8vec4(11, 13, 15, 17)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z, Vector4U8(11, 13, 15, 17)); bone->setBezierControlPoints( - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION, glm::u8vec4(12, 14, 16, 18)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION, Vector4U8(12, 14, 16, 18)); bone->setDirty(true); activeModel->performAllBonesTransform(); CommandRegistrator registrator(project); @@ -172,13 +172,13 @@ TEST_CASE("motion_remove_bone_keyframe_at_zero", "[emapp][motion]") bone->setLocalUserTranslation(Vector3(0.1, 0.2, 0.3)); bone->setLocalUserOrientation(Quaternion(0.9f, 0.1f, 0.2f, 0.3f)); bone->setBezierControlPoints( - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X, glm::u8vec4(2, 4, 6, 8)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X, Vector4U8(2, 4, 6, 8)); bone->setBezierControlPoints( - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y, glm::u8vec4(3, 5, 7, 9)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y, Vector4U8(3, 5, 7, 9)); bone->setBezierControlPoints( - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z, glm::u8vec4(11, 13, 15, 17)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z, Vector4U8(11, 13, 15, 17)); bone->setBezierControlPoints( - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION, glm::u8vec4(12, 14, 16, 18)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION, Vector4U8(12, 14, 16, 18)); bone->setDirty(true); activeModel->performAllBonesTransform(); } @@ -196,13 +196,13 @@ TEST_CASE("motion_remove_bone_keyframe_at_zero", "[emapp][motion]") CHECK_THAT(glm::make_vec3(nanoemMotionBoneKeyframeGetTranslation(keyframe)), Equals(Constants::kZeroV3)); CHECK_THAT(glm::make_quat(nanoemMotionBoneKeyframeGetOrientation(keyframe)), Equals(Constants::kZeroQ)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X)) == glm::u8vec4(20, 20, 107, 107)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X)) == Vector4U8(20, 20, 107, 107)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y)) == glm::u8vec4(20, 20, 107, 107)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y)) == Vector4U8(20, 20, 107, 107)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z)) == glm::u8vec4(20, 20, 107, 107)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z)) == Vector4U8(20, 20, 107, 107)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION)) == glm::u8vec4(20, 20, 107, 107)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION)) == Vector4U8(20, 20, 107, 107)); CHECK(keyframe); CHECK(project->duration() == project->baseDuration()); CHECK(first->motionDuration(activeModel) == 0); @@ -225,13 +225,13 @@ TEST_CASE("motion_remove_bone_keyframe_at_zero", "[emapp][motion]") CHECK_THAT(glm::make_quat(nanoemMotionBoneKeyframeGetOrientation(keyframe)), Equals(Quaternion(0.9f, 0.1f, 0.2f, 0.3f))); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X)) == glm::u8vec4(2, 4, 6, 8)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X)) == Vector4U8(2, 4, 6, 8)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y)) == glm::u8vec4(3, 5, 7, 9)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y)) == Vector4U8(3, 5, 7, 9)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z)) == glm::u8vec4(11, 13, 15, 17)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z)) == Vector4U8(11, 13, 15, 17)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION)) == glm::u8vec4(12, 14, 16, 18)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION)) == Vector4U8(12, 14, 16, 18)); CHECK(project->duration() == project->baseDuration()); CHECK(first->motionDuration(activeModel) == 0); CHECK(first->motionDuration(other1Model) == 0); @@ -248,13 +248,13 @@ TEST_CASE("motion_remove_bone_keyframe_at_zero", "[emapp][motion]") CHECK_THAT(glm::make_vec3(nanoemMotionBoneKeyframeGetTranslation(keyframe)), Equals(Constants::kZeroV3)); CHECK_THAT(glm::make_quat(nanoemMotionBoneKeyframeGetOrientation(keyframe)), Equals(Constants::kZeroQ)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X)) == glm::u8vec4(20, 20, 107, 107)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X)) == Vector4U8(20, 20, 107, 107)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y)) == glm::u8vec4(20, 20, 107, 107)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y)) == Vector4U8(20, 20, 107, 107)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z)) == glm::u8vec4(20, 20, 107, 107)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z)) == Vector4U8(20, 20, 107, 107)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION)) == glm::u8vec4(20, 20, 107, 107)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION)) == Vector4U8(20, 20, 107, 107)); CHECK(keyframe); CHECK(project->duration() == project->baseDuration()); CHECK(first->motionDuration(activeModel) == 0); @@ -273,13 +273,13 @@ TEST_CASE("motion_remove_bone_keyframe_at_zero", "[emapp][motion]") CHECK_THAT(glm::make_vec3(nanoemMotionBoneKeyframeGetTranslation(keyframe)), Equals(Constants::kZeroV3)); CHECK_THAT(glm::make_quat(nanoemMotionBoneKeyframeGetOrientation(keyframe)), Equals(Constants::kZeroQ)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X)) == glm::u8vec4(20, 20, 107, 107)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X)) == Vector4U8(20, 20, 107, 107)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y)) == glm::u8vec4(20, 20, 107, 107)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y)) == Vector4U8(20, 20, 107, 107)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z)) == glm::u8vec4(20, 20, 107, 107)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z)) == Vector4U8(20, 20, 107, 107)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION)) == glm::u8vec4(20, 20, 107, 107)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION)) == Vector4U8(20, 20, 107, 107)); CHECK(keyframe); CHECK(project2->duration() == project->baseDuration()); CHECK(second->motionDuration(activeModel2) == 0); diff --git a/emapp/test/motion/motion_remove_camera_keyframe.cc b/emapp/test/motion/motion_remove_camera_keyframe.cc index e60680b1..de70a00e 100644 --- a/emapp/test/motion/motion_remove_camera_keyframe.cc +++ b/emapp/test/motion/motion_remove_camera_keyframe.cc @@ -27,17 +27,17 @@ TEST_CASE("motion_remove_camera_keyframe", "[emapp][motion]") camera->setFovRadians(glm::radians(32.0f)); camera->setDistance(767); camera->setBezierControlPoints( - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_X, glm::u8vec4(8, 6, 4, 2)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_X, Vector4U8(8, 6, 4, 2)); camera->setBezierControlPoints( - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Y, glm::u8vec4(9, 7, 5, 3)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Y, Vector4U8(9, 7, 5, 3)); camera->setBezierControlPoints( - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Z, glm::u8vec4(17, 15, 13, 11)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Z, Vector4U8(17, 15, 13, 11)); camera->setBezierControlPoints( - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE, glm::u8vec4(18, 16, 14, 12)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE, Vector4U8(18, 16, 14, 12)); camera->setBezierControlPoints( - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_FOV, glm::u8vec4(30, 28, 26, 24)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_FOV, Vector4U8(30, 28, 26, 24)); camera->setBezierControlPoints( - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_DISTANCE, glm::u8vec4(31, 29, 27, 25)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_DISTANCE, Vector4U8(31, 29, 27, 25)); } CommandRegistrator registrator(project); registrator.registerAddCameraKeyframesCommandByCurrentLocalFrameIndex(); @@ -63,17 +63,17 @@ TEST_CASE("motion_remove_camera_keyframe", "[emapp][motion]") CHECK(nanoemMotionCameraKeyframeGetFov(keyframe) == 32); CHECK(nanoemMotionCameraKeyframeGetDistance(keyframe) == Approx(767)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( - keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_X)) == glm::u8vec4(8, 6, 4, 2)); + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_X)) == Vector4U8(8, 6, 4, 2)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( - keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Y)) == glm::u8vec4(9, 7, 5, 3)); + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Y)) == Vector4U8(9, 7, 5, 3)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Z)) == glm::u8vec4(17, 15, 13, 11)); - CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE)) == glm::u8vec4(18, 16, 14, 12)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Z)) == Vector4U8(17, 15, 13, 11)); + CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE)) == Vector4U8(18, 16, 14, 12)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( - keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_FOV)) == glm::u8vec4(30, 28, 26, 24)); + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_FOV)) == Vector4U8(30, 28, 26, 24)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_DISTANCE)) == glm::u8vec4(31, 29, 27, 25)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_DISTANCE)) == Vector4U8(31, 29, 27, 25)); CHECK(project->duration() == 1337); CHECK_FALSE(scope.hasAnyError()); } @@ -111,17 +111,17 @@ TEST_CASE("motion_remove_camera_keyframe_at_zero", "[emapp][motion]") camera->setFovRadians(glm::radians(32.0f)); camera->setDistance(767); camera->setBezierControlPoints( - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_X, glm::u8vec4(8, 6, 4, 2)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_X, Vector4U8(8, 6, 4, 2)); camera->setBezierControlPoints( - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Y, glm::u8vec4(9, 7, 5, 3)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Y, Vector4U8(9, 7, 5, 3)); camera->setBezierControlPoints( - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Z, glm::u8vec4(17, 15, 13, 11)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Z, Vector4U8(17, 15, 13, 11)); camera->setBezierControlPoints( - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE, glm::u8vec4(18, 16, 14, 12)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE, Vector4U8(18, 16, 14, 12)); camera->setBezierControlPoints( - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_FOV, glm::u8vec4(30, 28, 26, 24)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_FOV, Vector4U8(30, 28, 26, 24)); camera->setBezierControlPoints( - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_DISTANCE, glm::u8vec4(31, 29, 27, 25)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_DISTANCE, Vector4U8(31, 29, 27, 25)); } CommandRegistrator registrator(project); registrator.registerAddCameraKeyframesCommandByCurrentLocalFrameIndex(); @@ -137,17 +137,17 @@ TEST_CASE("motion_remove_camera_keyframe_at_zero", "[emapp][motion]") CHECK(nanoemMotionCameraKeyframeGetFov(keyframe) == 30); CHECK(nanoemMotionCameraKeyframeGetDistance(keyframe) == Approx(-45)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_X)) == glm::u8vec4(20, 20, 107, 107)); - CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Y)) == glm::u8vec4(20, 20, 107, 107)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_X)) == Vector4U8(20, 20, 107, 107)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Z)) == glm::u8vec4(20, 20, 107, 107)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Y)) == Vector4U8(20, 20, 107, 107)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE)) == glm::u8vec4(20, 20, 107, 107)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Z)) == Vector4U8(20, 20, 107, 107)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_FOV)) == glm::u8vec4(20, 20, 107, 107)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE)) == Vector4U8(20, 20, 107, 107)); + CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_FOV)) == Vector4U8(20, 20, 107, 107)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_DISTANCE)) == glm::u8vec4(20, 20, 107, 107)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_DISTANCE)) == Vector4U8(20, 20, 107, 107)); CHECK(project->duration() == project->baseDuration()); CHECK_FALSE(scope.hasAnyError()); } @@ -164,17 +164,17 @@ TEST_CASE("motion_remove_camera_keyframe_at_zero", "[emapp][motion]") CHECK(nanoemMotionCameraKeyframeGetFov(keyframe) == 32); CHECK(nanoemMotionCameraKeyframeGetDistance(keyframe) == Approx(767)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( - keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_X)) == glm::u8vec4(8, 6, 4, 2)); + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_X)) == Vector4U8(8, 6, 4, 2)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( - keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Y)) == glm::u8vec4(9, 7, 5, 3)); - CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Z)) == glm::u8vec4(17, 15, 13, 11)); + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Y)) == Vector4U8(9, 7, 5, 3)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE)) == glm::u8vec4(18, 16, 14, 12)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Z)) == Vector4U8(17, 15, 13, 11)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( - keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_FOV)) == glm::u8vec4(30, 28, 26, 24)); + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE)) == Vector4U8(18, 16, 14, 12)); + CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_FOV)) == Vector4U8(30, 28, 26, 24)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_DISTANCE)) == glm::u8vec4(31, 29, 27, 25)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_DISTANCE)) == Vector4U8(31, 29, 27, 25)); CHECK(project->duration() == project->baseDuration()); CHECK_FALSE(scope.hasAnyError()); } @@ -190,17 +190,17 @@ TEST_CASE("motion_remove_camera_keyframe_at_zero", "[emapp][motion]") CHECK(nanoemMotionCameraKeyframeGetFov(keyframe) == 30); CHECK(nanoemMotionCameraKeyframeGetDistance(keyframe) == Approx(-45)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_X)) == glm::u8vec4(20, 20, 107, 107)); - CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Y)) == glm::u8vec4(20, 20, 107, 107)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_X)) == Vector4U8(20, 20, 107, 107)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Z)) == glm::u8vec4(20, 20, 107, 107)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Y)) == Vector4U8(20, 20, 107, 107)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE)) == glm::u8vec4(20, 20, 107, 107)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Z)) == Vector4U8(20, 20, 107, 107)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_FOV)) == glm::u8vec4(20, 20, 107, 107)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE)) == Vector4U8(20, 20, 107, 107)); + CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_FOV)) == Vector4U8(20, 20, 107, 107)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_DISTANCE)) == glm::u8vec4(20, 20, 107, 107)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_DISTANCE)) == Vector4U8(20, 20, 107, 107)); CHECK(project->duration() == project->baseDuration()); CHECK_FALSE(scope.hasAnyError()); } @@ -218,17 +218,17 @@ TEST_CASE("motion_remove_camera_keyframe_at_zero", "[emapp][motion]") CHECK(nanoemMotionCameraKeyframeGetFov(keyframe) == 30); CHECK(nanoemMotionCameraKeyframeGetDistance(keyframe) == Approx(-45)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_X)) == glm::u8vec4(20, 20, 107, 107)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_X)) == Vector4U8(20, 20, 107, 107)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Y)) == glm::u8vec4(20, 20, 107, 107)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Y)) == Vector4U8(20, 20, 107, 107)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Z)) == glm::u8vec4(20, 20, 107, 107)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Z)) == Vector4U8(20, 20, 107, 107)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE)) == glm::u8vec4(20, 20, 107, 107)); - CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_FOV)) == glm::u8vec4(20, 20, 107, 107)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE)) == Vector4U8(20, 20, 107, 107)); + CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_FOV)) == Vector4U8(20, 20, 107, 107)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_DISTANCE)) == glm::u8vec4(20, 20, 107, 107)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_DISTANCE)) == Vector4U8(20, 20, 107, 107)); CHECK(project2->duration() == project->baseDuration()); CHECK_FALSE(scope.hasAnyError()); } diff --git a/emapp/test/motion/motion_update_bone_keyframe.cc b/emapp/test/motion/motion_update_bone_keyframe.cc index c6378205..fdc4a113 100644 --- a/emapp/test/motion/motion_update_bone_keyframe.cc +++ b/emapp/test/motion/motion_update_bone_keyframe.cc @@ -32,13 +32,13 @@ TEST_CASE("motion_update_bone_keyframe", "[emapp][motion]") bone->setLocalUserTranslation(Vector3(0.1, 0.2, 0.3)); bone->setLocalUserOrientation(Quaternion(0.9f, 0.1f, 0.2f, 0.3f)); bone->setBezierControlPoints( - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X, glm::u8vec4(2, 4, 6, 8)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X, Vector4U8(2, 4, 6, 8)); bone->setBezierControlPoints( - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y, glm::u8vec4(3, 5, 7, 9)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y, Vector4U8(3, 5, 7, 9)); bone->setBezierControlPoints( - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z, glm::u8vec4(11, 13, 15, 17)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z, Vector4U8(11, 13, 15, 17)); bone->setBezierControlPoints( - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION, glm::u8vec4(12, 14, 16, 18)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION, Vector4U8(12, 14, 16, 18)); bone->setDirty(true); activeModel->performAllBonesTransform(); } @@ -49,13 +49,13 @@ TEST_CASE("motion_update_bone_keyframe", "[emapp][motion]") bone->setLocalUserTranslation(Vector3(0.3, 0.2, 0.1)); bone->setLocalUserOrientation(Quaternion(0.9f, 0.3f, 0.2f, 0.1f)); bone->setBezierControlPoints( - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X, glm::u8vec4(8, 6, 4, 2)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X, Vector4U8(8, 6, 4, 2)); bone->setBezierControlPoints( - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y, glm::u8vec4(9, 7, 5, 3)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y, Vector4U8(9, 7, 5, 3)); bone->setBezierControlPoints( - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z, glm::u8vec4(17, 15, 13, 11)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z, Vector4U8(17, 15, 13, 11)); bone->setBezierControlPoints( - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION, glm::u8vec4(18, 16, 14, 12)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION, Vector4U8(18, 16, 14, 12)); bone->setDirty(true); activeModel->performAllBonesTransform(); } @@ -76,13 +76,13 @@ TEST_CASE("motion_update_bone_keyframe", "[emapp][motion]") CHECK( glm::make_quat(nanoemMotionBoneKeyframeGetOrientation(keyframe)) == Quaternion(0.9f, 0.3f, 0.2f, 0.1f)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X)) == glm::u8vec4(8, 6, 4, 2)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X)) == Vector4U8(8, 6, 4, 2)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y)) == glm::u8vec4(9, 7, 5, 3)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y)) == Vector4U8(9, 7, 5, 3)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z)) == glm::u8vec4(17, 15, 13, 11)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z)) == Vector4U8(17, 15, 13, 11)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION)) == glm::u8vec4(18, 16, 14, 12)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION)) == Vector4U8(18, 16, 14, 12)); CHECK(project->duration() == 1337); CHECK(first->motionDuration(activeModel) == 1337); CHECK(first->motionDuration(other1Model) == 0); @@ -109,13 +109,13 @@ TEST_CASE("motion_update_bone_keyframe", "[emapp][motion]") CHECK_THAT(glm::make_quat(nanoemMotionBoneKeyframeGetOrientation(keyframe)), Equals(Quaternion(0.9f, 0.1f, 0.2f, 0.3f))); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X)) == glm::u8vec4(2, 4, 6, 8)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X)) == Vector4U8(2, 4, 6, 8)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y)) == glm::u8vec4(3, 5, 7, 9)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y)) == Vector4U8(3, 5, 7, 9)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z)) == glm::u8vec4(11, 13, 15, 17)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z)) == Vector4U8(11, 13, 15, 17)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION)) == glm::u8vec4(12, 14, 16, 18)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION)) == Vector4U8(12, 14, 16, 18)); CHECK(project->duration() == 1337); CHECK(first->motionDuration(activeModel) == 1337); CHECK(first->motionDuration(other1Model) == 0); @@ -139,13 +139,13 @@ TEST_CASE("motion_update_bone_keyframe", "[emapp][motion]") CHECK( glm::make_quat(nanoemMotionBoneKeyframeGetOrientation(keyframe)) == Quaternion(0.9f, 0.3f, 0.2f, 0.1f)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X)) == glm::u8vec4(8, 6, 4, 2)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X)) == Vector4U8(8, 6, 4, 2)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y)) == glm::u8vec4(9, 7, 5, 3)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y)) == Vector4U8(9, 7, 5, 3)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z)) == glm::u8vec4(17, 15, 13, 11)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z)) == Vector4U8(17, 15, 13, 11)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION)) == glm::u8vec4(18, 16, 14, 12)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION)) == Vector4U8(18, 16, 14, 12)); CHECK(project->duration() == 1337); CHECK(first->motionDuration(activeModel) == 1337); CHECK(first->motionDuration(other1Model) == 0); @@ -168,13 +168,13 @@ TEST_CASE("motion_update_bone_keyframe", "[emapp][motion]") CHECK( glm::make_quat(nanoemMotionBoneKeyframeGetOrientation(keyframe)) == Quaternion(0.9f, 0.3f, 0.2f, 0.1f)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X)) == glm::u8vec4(8, 6, 4, 2)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X)) == Vector4U8(8, 6, 4, 2)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y)) == glm::u8vec4(9, 7, 5, 3)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y)) == Vector4U8(9, 7, 5, 3)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z)) == glm::u8vec4(17, 15, 13, 11)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z)) == Vector4U8(17, 15, 13, 11)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION)) == glm::u8vec4(18, 16, 14, 12)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION)) == Vector4U8(18, 16, 14, 12)); CHECK(project2->duration() == 1337); CHECK(second->motionDuration(activeModel2) == 1337); CHECK_FALSE(scope.hasAnyError()); diff --git a/emapp/test/motion/motion_update_camera_keyframe.cc b/emapp/test/motion/motion_update_camera_keyframe.cc index 8c41e7f0..6291dacb 100644 --- a/emapp/test/motion/motion_update_camera_keyframe.cc +++ b/emapp/test/motion/motion_update_camera_keyframe.cc @@ -26,17 +26,17 @@ TEST_CASE("motion_update_camera_keyframe", "[emapp][motion]") camera->setFovRadians(glm::radians(35.0f)); camera->setDistance(511); camera->setBezierControlPoints( - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_X, glm::u8vec4(2, 4, 6, 8)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_X, Vector4U8(2, 4, 6, 8)); camera->setBezierControlPoints( - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Y, glm::u8vec4(3, 5, 7, 9)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Y, Vector4U8(3, 5, 7, 9)); camera->setBezierControlPoints( - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Z, glm::u8vec4(11, 13, 15, 17)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Z, Vector4U8(11, 13, 15, 17)); camera->setBezierControlPoints( - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE, glm::u8vec4(12, 14, 16, 18)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE, Vector4U8(12, 14, 16, 18)); camera->setBezierControlPoints( - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_FOV, glm::u8vec4(24, 26, 28, 30)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_FOV, Vector4U8(24, 26, 28, 30)); camera->setBezierControlPoints( - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_DISTANCE, glm::u8vec4(25, 27, 29, 31)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_DISTANCE, Vector4U8(25, 27, 29, 31)); } CommandRegistrator registrator(project); registrator.registerAddCameraKeyframesCommandByCurrentLocalFrameIndex(); @@ -46,17 +46,17 @@ TEST_CASE("motion_update_camera_keyframe", "[emapp][motion]") camera->setFovRadians(glm::radians(36.0f)); camera->setDistance(512); camera->setBezierControlPoints( - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_X, glm::u8vec4(8, 6, 4, 2)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_X, Vector4U8(8, 6, 4, 2)); camera->setBezierControlPoints( - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Y, glm::u8vec4(9, 7, 5, 3)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Y, Vector4U8(9, 7, 5, 3)); camera->setBezierControlPoints( - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Z, glm::u8vec4(17, 15, 13, 11)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Z, Vector4U8(17, 15, 13, 11)); camera->setBezierControlPoints( - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE, glm::u8vec4(18, 16, 14, 12)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE, Vector4U8(18, 16, 14, 12)); camera->setBezierControlPoints( - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_FOV, glm::u8vec4(30, 28, 26, 24)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_FOV, Vector4U8(30, 28, 26, 24)); camera->setBezierControlPoints( - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_DISTANCE, glm::u8vec4(31, 29, 27, 25)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_DISTANCE, Vector4U8(31, 29, 27, 25)); } registrator.registerAddCameraKeyframesCommandByCurrentLocalFrameIndex(); SECTION("updating current camera keyframe") @@ -72,17 +72,17 @@ TEST_CASE("motion_update_camera_keyframe", "[emapp][motion]") CHECK(nanoemMotionCameraKeyframeGetDistance(keyframe) == Approx(-512)); CHECK(project->duration() == 1337); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( - keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_X)) == glm::u8vec4(8, 6, 4, 2)); + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_X)) == Vector4U8(8, 6, 4, 2)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( - keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Y)) == glm::u8vec4(9, 7, 5, 3)); + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Y)) == Vector4U8(9, 7, 5, 3)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Z)) == glm::u8vec4(17, 15, 13, 11)); - CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE)) == glm::u8vec4(18, 16, 14, 12)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Z)) == Vector4U8(17, 15, 13, 11)); + CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE)) == Vector4U8(18, 16, 14, 12)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( - keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_FOV)) == glm::u8vec4(30, 28, 26, 24)); + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_FOV)) == Vector4U8(30, 28, 26, 24)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_DISTANCE)) == glm::u8vec4(31, 29, 27, 25)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_DISTANCE)) == Vector4U8(31, 29, 27, 25)); CHECK(project->cameraMotion()->isDirty()); CHECK_FALSE(scope.hasAnyError()); } @@ -100,17 +100,17 @@ TEST_CASE("motion_update_camera_keyframe", "[emapp][motion]") CHECK(nanoemMotionCameraKeyframeGetDistance(keyframe) == Approx(511)); CHECK(project->duration() == 1337); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( - keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_X)) == glm::u8vec4(2, 4, 6, 8)); + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_X)) == Vector4U8(2, 4, 6, 8)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( - keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Y)) == glm::u8vec4(3, 5, 7, 9)); + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Y)) == Vector4U8(3, 5, 7, 9)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Z)) == glm::u8vec4(11, 13, 15, 17)); - CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE)) == glm::u8vec4(12, 14, 16, 18)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Z)) == Vector4U8(11, 13, 15, 17)); + CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE)) == Vector4U8(12, 14, 16, 18)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( - keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_FOV)) == glm::u8vec4(24, 26, 28, 30)); + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_FOV)) == Vector4U8(24, 26, 28, 30)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_DISTANCE)) == glm::u8vec4(25, 27, 29, 31)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_DISTANCE)) == Vector4U8(25, 27, 29, 31)); CHECK_FALSE(scope.hasAnyError()); } project->handleRedoAction(); @@ -127,17 +127,17 @@ TEST_CASE("motion_update_camera_keyframe", "[emapp][motion]") CHECK(nanoemMotionCameraKeyframeGetDistance(keyframe) == Approx(-512)); CHECK(project->duration() == 1337); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( - keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_X)) == glm::u8vec4(8, 6, 4, 2)); + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_X)) == Vector4U8(8, 6, 4, 2)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( - keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Y)) == glm::u8vec4(9, 7, 5, 3)); + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Y)) == Vector4U8(9, 7, 5, 3)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Z)) == glm::u8vec4(17, 15, 13, 11)); - CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE)) == glm::u8vec4(18, 16, 14, 12)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Z)) == Vector4U8(17, 15, 13, 11)); + CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE)) == Vector4U8(18, 16, 14, 12)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( - keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_FOV)) == glm::u8vec4(30, 28, 26, 24)); + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_FOV)) == Vector4U8(30, 28, 26, 24)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_DISTANCE)) == glm::u8vec4(31, 29, 27, 25)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_DISTANCE)) == Vector4U8(31, 29, 27, 25)); CHECK_FALSE(scope.hasAnyError()); } SECTION("recover") @@ -156,17 +156,17 @@ TEST_CASE("motion_update_camera_keyframe", "[emapp][motion]") CHECK(nanoemMotionCameraKeyframeGetDistance(keyframe) == Approx(-512)); CHECK(project2->duration() == 1337); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( - keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_X)) == glm::u8vec4(8, 6, 4, 2)); + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_X)) == Vector4U8(8, 6, 4, 2)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( - keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Y)) == glm::u8vec4(9, 7, 5, 3)); + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Y)) == Vector4U8(9, 7, 5, 3)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Z)) == glm::u8vec4(17, 15, 13, 11)); - CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE)) == glm::u8vec4(18, 16, 14, 12)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_LOOKAT_Z)) == Vector4U8(17, 15, 13, 11)); + CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_ANGLE)) == Vector4U8(18, 16, 14, 12)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation( - keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_FOV)) == glm::u8vec4(30, 28, 26, 24)); + keyframe, NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_FOV)) == Vector4U8(30, 28, 26, 24)); CHECK(glm::make_vec4(nanoemMotionCameraKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_DISTANCE)) == glm::u8vec4(31, 29, 27, 25)); + NANOEM_MOTION_CAMERA_KEYFRAME_INTERPOLATION_TYPE_DISTANCE)) == Vector4U8(31, 29, 27, 25)); CHECK_FALSE(scope.hasAnyError()); } } diff --git a/emapp/test/project/project_bezier_curve_adjustment.cc b/emapp/test/project/project_bezier_curve_adjustment.cc index a5f1fd68..cb92703f 100644 --- a/emapp/test/project/project_bezier_curve_adjustment.cc +++ b/emapp/test/project/project_bezier_curve_adjustment.cc @@ -13,7 +13,7 @@ using namespace nanoem; using namespace test; struct EqualsTranslationInterpolation : Catch::Matchers::Impl::MatcherBase { - EqualsTranslationInterpolation(const glm::u8vec4 &v) + EqualsTranslationInterpolation(const Vector4U8 &v) : m_data(v) { } @@ -38,7 +38,7 @@ struct EqualsTranslationInterpolation : Catch::Matchers::Impl::MatcherBasefindBoneKeyframe(activeModel, 0); - CHECK_THAT(firstKeyframe, EqualsTranslationInterpolation(glm::u8vec4(15, 0, 27, 7))); + CHECK_THAT(firstKeyframe, EqualsTranslationInterpolation(Vector4U8(15, 0, 27, 7))); } { const nanoem_motion_bone_keyframe_t *secondKeyframe = first->findBoneKeyframe(activeModel, 334); - CHECK_THAT(secondKeyframe, EqualsTranslationInterpolation(glm::u8vec4(79, 127, 67, 55))); + CHECK_THAT(secondKeyframe, EqualsTranslationInterpolation(Vector4U8(79, 127, 67, 55))); } } SECTION("split at 75%") @@ -90,11 +90,11 @@ TEST_CASE("project_bezier_curve_adjustment_bone", "[emapp][project]") registrator.registerAddBoneKeyframesCommandBySelectedBoneSet(activeModel); { const nanoem_motion_bone_keyframe_t *firstKeyframe = first->findBoneKeyframe(activeModel, 0); - CHECK_THAT(firstKeyframe, EqualsTranslationInterpolation(glm::u8vec4(47, 0, 59, 71))); + CHECK_THAT(firstKeyframe, EqualsTranslationInterpolation(Vector4U8(47, 0, 59, 71))); } { const nanoem_motion_bone_keyframe_t *secondKeyframe = first->findBoneKeyframe(activeModel, 1002); - CHECK_THAT(secondKeyframe, EqualsTranslationInterpolation(glm::u8vec4(111, 127, 99, 119))); + CHECK_THAT(secondKeyframe, EqualsTranslationInterpolation(Vector4U8(111, 127, 99, 119))); } } } diff --git a/emapp/test/project/project_redo_remove_drawable.cc b/emapp/test/project/project_redo_remove_drawable.cc index 3ab0ab33..cf56d083 100644 --- a/emapp/test/project/project_redo_remove_drawable.cc +++ b/emapp/test/project/project_redo_remove_drawable.cc @@ -46,13 +46,13 @@ TEST_CASE("project_remove_drawable", "[emapp][project]") bone->setLocalUserTranslation(Vector3(0.1, 0.2, 0.3)); bone->setLocalUserOrientation(Quaternion(0.9f, 0.1f, 0.2f, 0.3f)); bone->setBezierControlPoints( - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X, glm::u8vec4(2, 4, 6, 8)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X, Vector4U8(2, 4, 6, 8)); bone->setBezierControlPoints( - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y, glm::u8vec4(3, 5, 7, 9)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y, Vector4U8(3, 5, 7, 9)); bone->setBezierControlPoints( - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z, glm::u8vec4(11, 13, 15, 17)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z, Vector4U8(11, 13, 15, 17)); bone->setBezierControlPoints( - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION, glm::u8vec4(12, 14, 16, 18)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION, Vector4U8(12, 14, 16, 18)); bone->setDirty(true); activeModel->performAllBonesTransform(); registrator.registerAddBoneKeyframesCommandBySelectedBoneSet(activeModel); @@ -103,13 +103,13 @@ TEST_CASE("project_remove_drawable", "[emapp][project]") CHECK( glm::make_quat(nanoemMotionBoneKeyframeGetOrientation(keyframe)) == Quaternion(0.9f, 0.1f, 0.2f, 0.3f)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X)) == glm::u8vec4(2, 4, 6, 8)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_X)) == Vector4U8(2, 4, 6, 8)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y)) == glm::u8vec4(3, 5, 7, 9)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Y)) == Vector4U8(3, 5, 7, 9)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z)) == glm::u8vec4(11, 13, 15, 17)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_TRANSLATION_Z)) == Vector4U8(11, 13, 15, 17)); CHECK(glm::make_vec4(nanoemMotionBoneKeyframeGetInterpolation(keyframe, - NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION)) == glm::u8vec4(12, 14, 16, 18)); + NANOEM_MOTION_BONE_KEYFRAME_INTERPOLATION_TYPE_ORIENTATION)) == Vector4U8(12, 14, 16, 18)); CHECK(second->motionDuration(model) == 1337); } } From cbb6a70e48c57bc48232a4dd89a01a7205d2cde5 Mon Sep 17 00:00:00 2001 From: hkrn <129939+hkrn@users.noreply.github.com> Date: Sat, 20 Mar 2021 10:37:27 +0900 Subject: [PATCH 011/488] [emapp] clang-format --- emapp/include/emapp/IModelObjectSelection.h | 2 +- .../include/emapp/internal/ModelObjectSelection.h | 2 +- emapp/src/ApplicationMenuBuilder.cc | 2 +- emapp/src/BaseApplicationClient.cc | 5 ++--- emapp/src/internal/ModelObjectSelection.cc | 14 ++++++++------ 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/emapp/include/emapp/IModelObjectSelection.h b/emapp/include/emapp/IModelObjectSelection.h index 167ca0b6..309eeb5a 100644 --- a/emapp/include/emapp/IModelObjectSelection.h +++ b/emapp/include/emapp/IModelObjectSelection.h @@ -45,7 +45,7 @@ class IModelObjectSelection { kSelectTargetModeTypeCircle, kSelectTargetModeTypeMaxEnum }; - + virtual ~IModelObjectSelection() NANOEM_DECL_NOEXCEPT { } diff --git a/emapp/include/emapp/internal/ModelObjectSelection.h b/emapp/include/emapp/internal/ModelObjectSelection.h index 6b0ef120..ed8d4c31 100644 --- a/emapp/include/emapp/internal/ModelObjectSelection.h +++ b/emapp/include/emapp/internal/ModelObjectSelection.h @@ -101,7 +101,7 @@ class ModelObjectSelection NANOEM_DECL_SEALED : public IModelObjectSelection { private: typedef tinystl::unordered_set FaceSet; typedef tinystl::unordered_set VertexIndexSet; - + Model *m_parent; model::Vertex::Set m_selectedVertexSet; model::Bone::Set m_selectedBoneSet; diff --git a/emapp/src/ApplicationMenuBuilder.cc b/emapp/src/ApplicationMenuBuilder.cc index 26dc23b8..71ac8f60 100644 --- a/emapp/src/ApplicationMenuBuilder.cc +++ b/emapp/src/ApplicationMenuBuilder.cc @@ -1803,7 +1803,7 @@ ApplicationMenuBuilder::handleSetViewportPixelRatioEvent(void *userData, nanoem_ self->setMenuItemChecked(kMenuItemTypeProjectEnableHighResolutionViewport, value > 1.0f); } -void +void ApplicationMenuBuilder::handleToggleModelEditingEnabledEvent(void *userData, bool value) { ApplicationMenuBuilder *self = static_cast(userData); diff --git a/emapp/src/BaseApplicationClient.cc b/emapp/src/BaseApplicationClient.cc index dfd4baa2..56ab1b98 100644 --- a/emapp/src/BaseApplicationClient.cc +++ b/emapp/src/BaseApplicationClient.cc @@ -2499,7 +2499,7 @@ BaseApplicationClient::addToggleActiveAccessoryVisibleEventListener( m_eventListeners[NANOEM__APPLICATION__EVENT__TYPE_TOGGLE_ACTIVE_ACCESSORY_VISIBLE].push_back(l); } -void +void BaseApplicationClient::addToggleModelEditingEnabledEventListener( pfn_handleToggleModelEditingEnabledEvent listener, void *userData, bool once) { @@ -4012,8 +4012,7 @@ BaseApplicationClient::dispatchEventMessage(const nanoem_u8_t *data, size_t size EventListenerListMap::iterator it = m_eventListeners.find(event->type_case); if (it != m_eventListeners.end()) { EventListenerList &listeners = it->second; - const Nanoem__Application__ToggleModelEditingEnabledEvent *e = - event->toggle_model_editing_enabled; + const Nanoem__Application__ToggleModelEditingEnabledEvent *e = event->toggle_model_editing_enabled; bool enabled = e->value != 0; for (EventListenerList::iterator it2 = listeners.begin(); it2 != listeners.end();) { const EventListener &listener = *it2; diff --git a/emapp/src/internal/ModelObjectSelection.cc b/emapp/src/internal/ModelObjectSelection.cc index 7d33792e..0969f259 100644 --- a/emapp/src/internal/ModelObjectSelection.cc +++ b/emapp/src/internal/ModelObjectSelection.cc @@ -83,7 +83,7 @@ ModelObjectSelection::addSoftBody(const nanoem_model_soft_body_t *value) m_selectedSoftBodySet.insert(value); } -void +void ModelObjectSelection::addFace(const Vector3UI32 &value) { m_selectedFaceSet.insert(value); @@ -214,7 +214,7 @@ ModelObjectSelection::removeSoftBody(const nanoem_model_soft_body_t *value) m_selectedSoftBodySet.erase(value); } -void +void ModelObjectSelection::removeFace(const Vector3UI32 &value) { m_selectedFaceSet.erase(value); @@ -273,7 +273,7 @@ ModelObjectSelection::removeAllSoftBodies() m_selectedSoftBodySet.clear(); } -void +void ModelObjectSelection::removeAllFaces() { m_selectedFaceSet.clear(); @@ -525,7 +525,7 @@ ModelObjectSelection::containsSoftBody(const nanoem_model_soft_body_t *value) co return m_selectedSoftBodySet.find(value) != m_selectedSoftBodySet.end(); } -bool +bool ModelObjectSelection::containsVertexIndex(nanoem_u32_t value) const NANOEM_DECL_NOEXCEPT { return m_vertexIndexSet.find(value) != m_vertexIndexSet.end(); @@ -619,8 +619,10 @@ ModelObjectSelection::setTargetMode(SelectTargetModeType value) namespace tinystl { -template<> -inline size_t hash(const nanoem::Vector3UI32 &value) { +template <> +inline size_t +hash(const nanoem::Vector3UI32 &value) +{ return std::hash()(value); } From 0775baad32bd3d8194cfffa564243ec645d49346 Mon Sep 17 00:00:00 2001 From: hkrn <129939+hkrn@users.noreply.github.com> Date: Sat, 20 Mar 2021 16:24:36 +0900 Subject: [PATCH 012/488] [emapp] no longer needs mutex in DefaultTranslator --- emapp/include/emapp/DefaultTranslator.h | 1 - emapp/src/DefaultTranslator.cc | 11 +++-------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/emapp/include/emapp/DefaultTranslator.h b/emapp/include/emapp/DefaultTranslator.h index 8d76aacf..66ead72e 100644 --- a/emapp/include/emapp/DefaultTranslator.h +++ b/emapp/include/emapp/DefaultTranslator.h @@ -35,7 +35,6 @@ class DefaultTranslator NANOEM_DECL_SEALED : public ITranslator, private NonCopy StringMap m_phrases; String m_message; LanguageType m_language; - mutable bx::Mutex m_mutex; }; } /* namespace nanoem */ diff --git a/emapp/src/DefaultTranslator.cc b/emapp/src/DefaultTranslator.cc index eb53b445..1e701eba 100644 --- a/emapp/src/DefaultTranslator.cc +++ b/emapp/src/DefaultTranslator.cc @@ -33,9 +33,7 @@ bool DefaultTranslator::loadFromMemory(const nanoem_u8_t *ptr, size_t length) { if (Nanoem__Translation__Bundle *bundle = nanoem__translation__bundle__unpack(g_protobufc_allocator, length, ptr)) { - bx::MutexScope scope(m_mutex); - BX_UNUSED_1(scope); - m_phrases.clear(); + StringMap phrases; for (size_t i = 0, numUnits = bundle->n_units; i < numUnits; i++) { const Nanoem__Translation__Unit *unit = bundle->units[i]; const bool match = @@ -44,11 +42,12 @@ DefaultTranslator::loadFromMemory(const nanoem_u8_t *ptr, size_t length) if (match) { for (size_t j = 0, numPhrases = unit->n_phrases; j < numPhrases; j++) { const Nanoem__Translation__Phrase *phrase = unit->phrases[j]; - m_phrases.insert(tinystl::make_pair(String(phrase->id), String(phrase->text))); + phrases.insert(tinystl::make_pair(String(phrase->id), String(phrase->text))); } } } nanoem__translation__bundle__free_unpacked(bundle, g_protobufc_allocator); + m_phrases = phrases; } return m_message.empty(); } @@ -56,8 +55,6 @@ DefaultTranslator::loadFromMemory(const nanoem_u8_t *ptr, size_t length) const char * DefaultTranslator::findPhrase(const char *text) const NANOEM_DECL_NOEXCEPT { - bx::MutexScope scope(m_mutex); - BX_UNUSED_1(scope); StringMap::const_iterator it = m_phrases.find(text); return it != m_phrases.end() ? it->second.c_str() : text; } @@ -77,8 +74,6 @@ DefaultTranslator::translate(const char *text) const NANOEM_DECL_NOEXCEPT bool DefaultTranslator::isTranslatable(const char *text) const NANOEM_DECL_NOEXCEPT { - bx::MutexScope scope(m_mutex); - BX_UNUSED_1(scope); return m_phrases.find(text) != m_phrases.end(); } From 16278aff097abfea682c8cc2908bd6bed8d374ac Mon Sep 17 00:00:00 2001 From: hkrn <129939+hkrn@users.noreply.github.com> Date: Sat, 20 Mar 2021 16:27:03 +0900 Subject: [PATCH 013/488] [emapp] add window rounding --- emapp/include/emapp/internal/ImGuiWindow.h | 1 + emapp/src/internal/ImGuiWindow.cc | 5 +++-- emapp/src/internal/imgui/BaseNonModalDialogWindow.cc | 3 +++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/emapp/include/emapp/internal/ImGuiWindow.h b/emapp/include/emapp/internal/ImGuiWindow.h index aef15fb5..d8aee081 100644 --- a/emapp/include/emapp/internal/ImGuiWindow.h +++ b/emapp/include/emapp/internal/ImGuiWindow.h @@ -40,6 +40,7 @@ class ImGuiWindow NANOEM_DECL_SEALED : public IUIWindow, private NonCopyable { public: static const Vector2UI16 kMinimumWindowSize; static const nanoem_f32_t kFontSize; + static const nanoem_f32_t kWindowRounding; static const nanoem_f32_t kLeftPaneWidth; static const nanoem_f32_t kTranslationStepFactor; static const nanoem_f32_t kOrientationStepFactor; diff --git a/emapp/src/internal/ImGuiWindow.cc b/emapp/src/internal/ImGuiWindow.cc index f1c4d5f1..0838c805 100644 --- a/emapp/src/internal/ImGuiWindow.cc +++ b/emapp/src/internal/ImGuiWindow.cc @@ -118,6 +118,7 @@ using namespace imgui; const Vector2UI16 ImGuiWindow::kMinimumWindowSize = Vector2UI16(1080, 700); const nanoem_f32_t ImGuiWindow::kFontSize = 16.0f; +const nanoem_f32_t ImGuiWindow::kWindowRounding = 4.0f; const nanoem_f32_t ImGuiWindow::kLeftPaneWidth = 150.0f; const nanoem_f32_t ImGuiWindow::kTranslationStepFactor = 0.1f; const nanoem_f32_t ImGuiWindow::kOrientationStepFactor = 0.1f; @@ -1685,7 +1686,6 @@ ImGuiWindow::drawMainWindow(const Vector2 &deviceScaleWindowSize, Project *proje { const nanoem_f32_t deviceScaleRatio = project->windowDevicePixelRatio(); saveDefaultStyle(deviceScaleRatio); - ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0); #if defined(IMGUI_HAS_VIEWPORT) if (EnumUtils::isEnabledT(ImGui::GetIO().ConfigFlags, ImGuiConfigFlags_ViewportsEnable)) { ImGuiViewport *viewport = ImGui::GetMainViewport(); @@ -1755,7 +1755,6 @@ ImGuiWindow::drawMainWindow(const Vector2 &deviceScaleWindowSize, Project *proje const ImVec2 &size = ImGui::GetContentRegionAvail(); drawViewport(size.y, project); } - ImGui::PopStyleVar(); ImGui::End(); restoreDefaultStyle(); } @@ -3989,6 +3988,7 @@ ImGuiWindow::layoutModalDialogWindow(IModalDialog *dialog, Project *project, con #endif ImGui::SetNextWindowPos(actualWindowPos); ImGui::SetNextWindowSize(actualWindowSize); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, kWindowRounding); if (ImGui::BeginPopupModal(dialog->title(), nullptr, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize)) { const nanoem_u64_t buttons = dialog->buttons(); dialog->draw(project); @@ -4040,6 +4040,7 @@ ImGuiWindow::layoutModalDialogWindow(IModalDialog *dialog, Project *project, con } ImGui::EndPopup(); } + ImGui::PopStyleVar(); restoreDefaultStyle(); } diff --git a/emapp/src/internal/imgui/BaseNonModalDialogWindow.cc b/emapp/src/internal/imgui/BaseNonModalDialogWindow.cc index 3dd15f9b..12fa46e3 100644 --- a/emapp/src/internal/imgui/BaseNonModalDialogWindow.cc +++ b/emapp/src/internal/imgui/BaseNonModalDialogWindow.cc @@ -94,6 +94,7 @@ BaseNonModalDialogWindow::open( char buffer[Inline::kNameStackBufferSize]; StringUtils::format(buffer, sizeof(buffer), "%s##%s", title, id); ImGui::SetNextWindowSizeConstraints(size, ImVec2(FLT_MAX, FLT_MAX)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, ImGuiWindow::kWindowRounding); return ImGui::Begin(buffer, visible, flags) && *visible; } @@ -107,6 +108,7 @@ BaseNonModalDialogWindow::open( const nanoem_f32_t textWidth = ImGui::CalcTextSize(title).x + (style.WindowPadding.x + style.WindowRounding) * 2; const nanoem_f32_t width = glm::max(textWidth, 250.0f * ImGui::GetIO().DisplayFramebufferScale.x); ImGui::SetNextWindowSizeConstraints(ImVec2(width, height), ImVec2(FLT_MAX, FLT_MAX)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, style.WindowRounding); return ImGui::Begin(buffer, visible, flags) && *visible; } @@ -114,6 +116,7 @@ void BaseNonModalDialogWindow::close() { ImGui::End(); + ImGui::PopStyleVar(); } BaseNonModalDialogWindow::ResponseType From 721139313b1ade5abd10dea1b317129889db700e Mon Sep 17 00:00:00 2001 From: hkrn <129939+hkrn@users.noreply.github.com> Date: Sat, 20 Mar 2021 23:47:30 +0900 Subject: [PATCH 014/488] [emapp] implement pivotMatrix and gizmo* properties in Model --- emapp/include/emapp/IModelObjectSelection.h | 1 + emapp/include/emapp/Model.h | 18 ++- emapp/include/emapp/internal/ImGuiWindow.h | 1 - .../emapp/internal/ModelObjectSelection.h | 3 +- emapp/src/Model.cc | 39 ++++++ emapp/src/StateController.cc | 2 + emapp/src/internal/ImGuiWindow.cc | 46 +++++-- emapp/src/internal/ModelObjectSelection.cc | 115 ++++++++++++++++++ 8 files changed, 212 insertions(+), 13 deletions(-) diff --git a/emapp/include/emapp/IModelObjectSelection.h b/emapp/include/emapp/IModelObjectSelection.h index 309eeb5a..d860e16f 100644 --- a/emapp/include/emapp/IModelObjectSelection.h +++ b/emapp/include/emapp/IModelObjectSelection.h @@ -123,6 +123,7 @@ class IModelObjectSelection { virtual bool areAllBonesMovable() const NANOEM_DECL_NOEXCEPT = 0; virtual bool areAllBonesRotateable() const NANOEM_DECL_NOEXCEPT = 0; + virtual Matrix4x4 pivotMatrix() const NANOEM_DECL_NOEXCEPT = 0; virtual bool isBoxSelectedBoneModeEnabled() const NANOEM_DECL_NOEXCEPT = 0; virtual void setBoxSelectedBoneModeEnabled(bool value) = 0; virtual EditingType editingType() const NANOEM_DECL_NOEXCEPT = 0; diff --git a/emapp/include/emapp/Model.h b/emapp/include/emapp/Model.h index 4aa74d85..ad89fdf8 100644 --- a/emapp/include/emapp/Model.h +++ b/emapp/include/emapp/Model.h @@ -54,6 +54,13 @@ class ISkinDeformer; class Model NANOEM_DECL_SEALED : public IDrawable, private NonCopyable { public: enum AxisType { kAxisTypeFirstEnum, kAxisCenter = kAxisTypeFirstEnum, kAxisX, kAxisY, kAxisZ, kAxisTypeMaxEnum }; + enum GizmoOperationType { + kGizmoOperationTypeFirstEnum, + kGizmoOperationTypeTranslate = kGizmoOperationTypeFirstEnum, + kGizmoOperationTypeRotate, + kGizmoOperationTypeScale, + kGizmoOperationTypeMaxEnum + }; enum TransformCoordinateType { kTransformCoordinateTypeFirstEnum, kTransformCoordinateTypeGlobal = kTransformCoordinateTypeFirstEnum, @@ -327,11 +334,17 @@ class Model NANOEM_DECL_SEALED : public IDrawable, private NonCopyable { void setPassiveEffect(IEffect *value) NANOEM_DECL_OVERRIDE; UserData userData() const; void setUserData(const UserData &value); - TransformCoordinateType transformCoordinateType() const NANOEM_DECL_NOEXCEPT; AxisType transformAxisType() const NANOEM_DECL_NOEXCEPT; void setTransformAxisType(AxisType value); + TransformCoordinateType gizmoTransformCoordinateType() const NANOEM_DECL_NOEXCEPT; + void setGizmoTransformCoordinateType(TransformCoordinateType value); + GizmoOperationType gizmoOperationType() const NANOEM_DECL_NOEXCEPT; + void setGizmoOperationType(GizmoOperationType value); + TransformCoordinateType transformCoordinateType() const NANOEM_DECL_NOEXCEPT; void setTransformCoordinateType(TransformCoordinateType value); void toggleTransformCoordinateType(); + Matrix4x4 pivotMatrix() const NANOEM_DECL_NOEXCEPT; + void setPivotMatrix(const Matrix4x4 &value); Vector4 edgeColor() const NANOEM_DECL_NOEXCEPT; void setEdgeColor(const Vector4 &value); nanoem_f32_t edgeSize() const NANOEM_DECL_NOEXCEPT; @@ -518,7 +531,10 @@ class Model NANOEM_DECL_SEALED : public IDrawable, private NonCopyable { StringMap m_annotations; sg_buffer m_vertexBuffers[2]; sg_buffer m_indexBuffer; + Matrix4x4 m_pivotMatrix; Vector4 m_edgeColor; + GizmoOperationType m_gizmoOperationType; + TransformCoordinateType m_gizmoTransformCoordinateType; AxisType m_transformAxisType; TransformCoordinateType m_transformCoordinateType; URI m_fileURI; diff --git a/emapp/include/emapp/internal/ImGuiWindow.h b/emapp/include/emapp/internal/ImGuiWindow.h index d8aee081..090ce97e 100644 --- a/emapp/include/emapp/internal/ImGuiWindow.h +++ b/emapp/include/emapp/internal/ImGuiWindow.h @@ -401,7 +401,6 @@ class ImGuiWindow NANOEM_DECL_SEALED : public IUIWindow, private NonCopyable { void *m_debugger; BufferMap m_buffers; PipelineMap m_pipelines; - Matrix4x4 m_pivotMatrix; Vector4 m_draggingMarkerPanelRect; sg_bindings m_bindings; sg_pipeline_desc m_basePipelineDescription; diff --git a/emapp/include/emapp/internal/ModelObjectSelection.h b/emapp/include/emapp/internal/ModelObjectSelection.h index ed8d4c31..a7c23685 100644 --- a/emapp/include/emapp/internal/ModelObjectSelection.h +++ b/emapp/include/emapp/internal/ModelObjectSelection.h @@ -90,7 +90,8 @@ class ModelObjectSelection NANOEM_DECL_SEALED : public IModelObjectSelection { bool areAllBonesMovable() const NANOEM_DECL_NOEXCEPT_OVERRIDE; bool areAllBonesRotateable() const NANOEM_DECL_NOEXCEPT_OVERRIDE; bool containsAnyBone() const NANOEM_DECL_NOEXCEPT_OVERRIDE; - + + Matrix4x4 pivotMatrix() const NANOEM_DECL_NOEXCEPT_OVERRIDE; bool isBoxSelectedBoneModeEnabled() const NANOEM_DECL_NOEXCEPT_OVERRIDE; void setBoxSelectedBoneModeEnabled(bool value) NANOEM_DECL_OVERRIDE; EditingType editingType() const NANOEM_DECL_NOEXCEPT_OVERRIDE; diff --git a/emapp/src/Model.cc b/emapp/src/Model.cc index 0992b738..d899ee5c 100644 --- a/emapp/src/Model.cc +++ b/emapp/src/Model.cc @@ -603,7 +603,10 @@ Model::Model(Project *project, nanoem_u16_t handle) , m_screenImage(nullptr) , m_sharedFallbackBone(nullptr) , m_userData(nullptr, nullptr) + , m_pivotMatrix(0) , m_edgeColor(0, 0, 0, 1) + , m_gizmoOperationType(kGizmoOperationTypeTranslate) + , m_gizmoTransformCoordinateType(kTransformCoordinateTypeLocal) , m_transformAxisType(kAxisTypeMaxEnum) , m_transformCoordinateType(kTransformCoordinateTypeLocal) , m_states(kPrivateStateInitialValue) @@ -4715,6 +4718,30 @@ Model::setTransformAxisType(AxisType value) } } +Model::TransformCoordinateType +Model::gizmoTransformCoordinateType() const NANOEM_DECL_NOEXCEPT +{ + return m_gizmoTransformCoordinateType; +} + +void +Model::setGizmoTransformCoordinateType(TransformCoordinateType value) +{ + m_gizmoTransformCoordinateType = value; +} + +Model::GizmoOperationType +Model::gizmoOperationType() const NANOEM_DECL_NOEXCEPT +{ + return m_gizmoOperationType; +} + +void +Model::setGizmoOperationType(GizmoOperationType value) +{ + m_gizmoOperationType = value; +} + Model::TransformCoordinateType Model::transformCoordinateType() const NANOEM_DECL_NOEXCEPT { @@ -4748,6 +4775,18 @@ Model::toggleTransformCoordinateType() } } +Matrix4x4 +Model::pivotMatrix() const NANOEM_DECL_NOEXCEPT +{ + return m_pivotMatrix; +} + +void +Model::setPivotMatrix(const Matrix4x4 &value) +{ + m_pivotMatrix = value; +} + Vector4 Model::edgeColor() const NANOEM_DECL_NOEXCEPT { diff --git a/emapp/src/StateController.cc b/emapp/src/StateController.cc index 817404a5..96f9d8c5 100644 --- a/emapp/src/StateController.cc +++ b/emapp/src/StateController.cc @@ -518,6 +518,7 @@ class BaseSelectionState : public BaseDraggingObjectState { updateRegion(Vector4SI32(m_lastPosition, Vector2SI32(logicalScalePosition) - m_lastPosition)); if (Model *model = project->activeModel()) { commitSelection(model, project, removeAll); + model->setPivotMatrix(model->selection()->pivotMatrix()); } m_lastPosition = Vector2(); } @@ -729,6 +730,7 @@ class DraggingMaterialSelectionState NANOEM_DECL_SEALED : public BaseSelectionSt selection->addMaterial(materialPtr); } } + model->setPivotMatrix(selection->pivotMatrix()); } }; diff --git a/emapp/src/internal/ImGuiWindow.cc b/emapp/src/internal/ImGuiWindow.cc index 0838c805..706080c3 100644 --- a/emapp/src/internal/ImGuiWindow.cc +++ b/emapp/src/internal/ImGuiWindow.cc @@ -88,6 +88,8 @@ #include "imguizmo/ImGuizmo.h" +#include "glm/gtx/matrix_query.hpp" + namespace nanoem { namespace internal { namespace { @@ -328,7 +330,6 @@ ImGuiWindow::ImGuiWindow(BaseApplicationService *application) , m_requestedScrollHereTrack(nullptr) , m_context(nullptr) , m_debugger(nullptr) - , m_pivotMatrix(Constants::kIdentity) , m_draggingMarkerPanelRect(Constants::kZeroV4) , m_elapsedTime(0) , m_currentMemoryBytes(0) @@ -2724,15 +2725,40 @@ ImGuiWindow::drawViewport(nanoem_f32_t viewportHeight, Project *project) ImGuizmo::SetDrawlist(drawList); ImGuizmo::SetRect(offset.x, offset.y, size.x, size.y); project->globalCamera()->getViewTransform(view, projection); - ImGuizmo::OPERATION op = ImGuizmo::TRANSLATE; - ImGuizmo::MODE mode = ImGuizmo::LOCAL; - ImGuizmo::DrawCubes(glm::value_ptr(view), glm::value_ptr(projection), glm::value_ptr(m_pivotMatrix), 1); - if (ImGuizmo::IsOver()) { - hovered = false; - } - if (ImGuizmo::Manipulate(glm::value_ptr(view), glm::value_ptr(projection), op, mode, - glm::value_ptr(m_pivotMatrix), glm::value_ptr(delta))) { - m_pivotMatrix *= delta; + Model *activeModel = project->activeModel(); + Matrix4x4 pivotMatrix(activeModel->pivotMatrix()); + if (!glm::isNull(pivotMatrix, Constants::kEpsilon)) { + ImGuizmo::OPERATION op; + switch (activeModel->gizmoOperationType()) { + case Model::kGizmoOperationTypeTranslate: + default: + op = ImGuizmo::TRANSLATE; + break; + case Model::kGizmoOperationTypeRotate: + op = ImGuizmo::ROTATE; + break; + case Model::kGizmoOperationTypeScale: + op = ImGuizmo::SCALE; + break; + } + ImGuizmo::MODE mode; + switch (activeModel->gizmoTransformCoordinateType()) { + case Model::kTransformCoordinateTypeGlobal: + mode = ImGuizmo::WORLD; + break; + case Model::kTransformCoordinateTypeLocal: + default: + mode = ImGuizmo::LOCAL; + break; + } + ImGuizmo::DrawCubes(glm::value_ptr(view), glm::value_ptr(projection), glm::value_ptr(pivotMatrix), 1); + if (ImGuizmo::IsOver()) { + hovered = false; + } + if (ImGuizmo::Manipulate(glm::value_ptr(view), glm::value_ptr(projection), op, mode, + glm::value_ptr(pivotMatrix), glm::value_ptr(delta))) { + activeModel->setPivotMatrix(delta * pivotMatrix); + } } } if (m_viewportOverlayPtr) { diff --git a/emapp/src/internal/ModelObjectSelection.cc b/emapp/src/internal/ModelObjectSelection.cc index 0969f259..1b472a44 100644 --- a/emapp/src/internal/ModelObjectSelection.cc +++ b/emapp/src/internal/ModelObjectSelection.cc @@ -9,6 +9,7 @@ #include "emapp/Model.h" #include "emapp/Project.h" +#include "glm/gtc/type_ptr.hpp" #include "glm/gtx/hash.hpp" namespace nanoem { @@ -578,6 +579,120 @@ ModelObjectSelection::containsAnyBone() const NANOEM_DECL_NOEXCEPT return !m_selectedBoneSet.empty(); } +Matrix4x4 +ModelObjectSelection::pivotMatrix() const NANOEM_DECL_NOEXCEPT +{ + typedef tinystl::unordered_map MaterialOffsetMap; + Matrix4x4 matrix(0); + Vector3 aabbMin(FLT_MAX), aabbMax(FLT_MIN); + switch (editingType()) { + case kEditingTypeBone: { + if (!m_selectedBoneSet.empty()) { + for (model::Bone::Set::const_iterator it = m_selectedBoneSet.begin(), end = m_selectedBoneSet.end(); it != end; ++it) { + const nanoem_model_bone_t *bonePtr = *it; + const Vector3 origin(model::Bone::origin(bonePtr)); + aabbMin = glm::min(aabbMin, origin); + aabbMax = glm::max(aabbMax, origin); + } + matrix = glm::translate(Constants::kIdentity, (aabbMax + aabbMin) * 0.5f); + } + break; + } + case kEditingTypeFace: { + if (!m_vertexIndexSet.empty()) { + nanoem_rsize_t numVertices; + nanoem_model_vertex_t *const *vertices = nanoemModelGetAllVertexObjects(m_parent->data(), &numVertices); + for (VertexIndexSet::const_iterator it = m_vertexIndexSet.begin(), end = m_vertexIndexSet.end(); it != end; ++it) { + const nanoem_u32_t vertexIndex = *it; + const Vector3 origin(glm::make_vec3(nanoemModelVertexGetOrigin(vertices[vertexIndex]))); + aabbMin = glm::min(aabbMin, origin); + aabbMax = glm::max(aabbMax, origin); + } + matrix = glm::translate(Constants::kIdentity, (aabbMax + aabbMin) * 0.5f); + } + break; + } + case kEditingTypeJoint: { + if (!m_selectedJointSet.empty()) { + for (model::Joint::Set::const_iterator it = m_selectedJointSet.begin(), end = m_selectedJointSet.end(); it != end; ++it) { + const nanoem_model_joint_t *jointPtr = *it; + const Vector3 origin(glm::make_vec3(nanoemModelJointGetOrigin(jointPtr))); + aabbMin = glm::min(aabbMin, origin); + aabbMax = glm::max(aabbMax, origin); + } + matrix = glm::translate(Constants::kIdentity, (aabbMax + aabbMin) * 0.5f); + } + break; + } + case kEditingTypeMaterial: { + if (!m_selectedMaterialSet.empty()) { + nanoem_rsize_t numMaterials, numVertices, numVertexIndices; + nanoem_model_material_t *const *materials = nanoemModelGetAllMaterialObjects(m_parent->data(), &numMaterials); + nanoem_model_vertex_t *const *vertices = nanoemModelGetAllVertexObjects(m_parent->data(), &numVertices); + const nanoem_u32_t *vertexIndices = nanoemModelGetAllVertexIndices(m_parent->data(), &numVertexIndices); + MaterialOffsetMap materialOffsets; + for (nanoem_rsize_t i = 0, offset = 0; i < numMaterials; i++) { + const nanoem_model_material_t *material = materials[i]; + materialOffsets.insert(tinystl::make_pair(material, offset)); + offset += nanoemModelMaterialGetNumVertexIndices(material); + } + for (model::Material::Set::const_iterator it = m_selectedMaterialSet.begin(), end = m_selectedMaterialSet.end(); it != end; ++it) { + const nanoem_model_material_t *materialPtr = *it; + nanoem_rsize_t offset = 0; + MaterialOffsetMap::const_iterator it2 = materialOffsets.find(materialPtr); + if (it2 != materialOffsets.end()) { + nanoem_rsize_t indices = nanoemModelMaterialGetNumVertexIndices(materialPtr); + for (nanoem_rsize_t i = 0; i < indices; i++) { + const nanoem_u32_t vertexIndex = vertexIndices[offset + i]; + const Vector3 origin(glm::make_vec3(nanoemModelVertexGetOrigin(vertices[vertexIndex]))); + aabbMin = glm::min(aabbMin, origin); + aabbMax = glm::max(aabbMax, origin); + } + } + } + matrix = glm::translate(Constants::kIdentity, (aabbMax + aabbMin) * 0.5f); + } + break; + } + case kEditingTypeRigidBody: { + if (!m_selectedRigidBodySet.empty()) { + for (model::RigidBody::Set::const_iterator it = m_selectedRigidBodySet.begin(), end = m_selectedRigidBodySet.end(); it != end; ++it) { + const nanoem_model_rigid_body_t *rigidBodyPtr = *it; + const Vector3 origin(glm::make_vec3(nanoemModelRigidBodyGetOrigin(rigidBodyPtr))); + aabbMin = glm::min(aabbMin, origin); + aabbMax = glm::max(aabbMax, origin); + } + matrix = glm::translate(Constants::kIdentity, (aabbMax + aabbMin) * 0.5f); + } + break; + } + case kEditingTypeSoftBody: { + if (!m_selectedSoftBodySet.empty()) { + for (model::SoftBody::Set::const_iterator it = m_selectedSoftBodySet.begin(), end = m_selectedSoftBodySet.end(); it != end; ++it) { + const nanoem_model_soft_body_t *softBodyPtr = *it; + nanoemModelSoftBodyGetMaterialObject(softBodyPtr); + } + } + break; + } + case kEditingTypeVertex: { + if (!m_selectedVertexSet.empty()) { + for (model::Vertex::Set::const_iterator it = m_selectedVertexSet.begin(), end = m_selectedVertexSet.end(); it != end; ++it) { + const nanoem_model_vertex_t *vertexPtr = *it; + const Vector3 origin(glm::make_vec3(nanoemModelVertexGetOrigin(vertexPtr))); + aabbMin = glm::min(aabbMin, origin); + aabbMax = glm::max(aabbMax, origin); + } + matrix = glm::translate(Constants::kIdentity, (aabbMax + aabbMin) * 0.5f); + } + break; + } + default: + break; + } + return matrix; +} + bool ModelObjectSelection::isBoxSelectedBoneModeEnabled() const NANOEM_DECL_NOEXCEPT { From 1ad550ee581c9b0f3243e23e30e6a3ea5707f81d Mon Sep 17 00:00:00 2001 From: hkrn <129939+hkrn@users.noreply.github.com> Date: Sun, 21 Mar 2021 10:41:20 +0900 Subject: [PATCH 015/488] [emapp] add index static method --- emapp/include/emapp/model/Bone.h | 13 ++++--- emapp/include/emapp/model/Joint.h | 3 +- emapp/include/emapp/model/Label.h | 3 +- emapp/include/emapp/model/Material.h | 3 +- emapp/include/emapp/model/Morph.h | 3 +- emapp/include/emapp/model/RigidBody.h | 1 + emapp/include/emapp/model/SoftBody.h | 1 + emapp/include/emapp/model/Vertex.h | 1 + emapp/src/CommandMessage.inl | 6 +-- emapp/src/Effect.cc | 2 +- emapp/src/Model.cc | 20 +++++----- emapp/src/PluginFactory.cc | 14 +++---- emapp/src/command/BaseBoneKeyframeCommand.cc | 2 +- emapp/src/command/BaseModelKeyframeCommand.cc | 2 +- emapp/src/command/BaseMorphKeyframeCommand.cc | 2 +- emapp/src/command/TransformBoneCommand.cc | 3 +- emapp/src/command/TransformMorphCommand.cc | 4 +- .../internal/imgui/ModelParameterDialog.cc | 14 +++---- emapp/src/model/BindPose.cc | 2 +- emapp/src/model/Bone.cc | 39 +++++++++++-------- emapp/src/model/Joint.cc | 13 +++++-- emapp/src/model/Label.cc | 13 +++++-- emapp/src/model/Material.cc | 13 +++++-- emapp/src/model/Morph.cc | 10 ++++- emapp/src/model/RigidBody.cc | 6 +++ emapp/src/model/SoftBody.cc | 15 ++++--- emapp/src/model/Vertex.cc | 23 +++++------ 27 files changed, 137 insertions(+), 94 deletions(-) diff --git a/emapp/include/emapp/model/Bone.h b/emapp/include/emapp/model/Bone.h index 1e00e37f..489f8974 100644 --- a/emapp/include/emapp/model/Bone.h +++ b/emapp/include/emapp/model/Bone.h @@ -63,14 +63,15 @@ class Bone NANOEM_DECL_SEALED : private NonCopyable { static void constrainOrientation( const Vector3 &upperLimit, const Vector3 &lowerLimit, Quaternion &orientation) NANOEM_DECL_NOEXCEPT; - static bool isSelectable(const nanoem_model_bone_t *bone) NANOEM_DECL_NOEXCEPT; - static bool isMovable(const nanoem_model_bone_t *bone) NANOEM_DECL_NOEXCEPT; - static bool isRotateable(const nanoem_model_bone_t *bone) NANOEM_DECL_NOEXCEPT; - static Matrix3x3 localAxes(const nanoem_model_bone_t *bone) NANOEM_DECL_NOEXCEPT; - static Vector3 origin(const nanoem_model_bone_t *bone) NANOEM_DECL_NOEXCEPT; + static bool isSelectable(const nanoem_model_bone_t *bonePtr) NANOEM_DECL_NOEXCEPT; + static bool isMovable(const nanoem_model_bone_t *bonePtr) NANOEM_DECL_NOEXCEPT; + static bool isRotateable(const nanoem_model_bone_t *bonePtr) NANOEM_DECL_NOEXCEPT; + static int index(const nanoem_model_bone_t *bonePtr) 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 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 *bone) NANOEM_DECL_NOEXCEPT; + static Bone *cast(const nanoem_model_bone_t *bonePtr) NANOEM_DECL_NOEXCEPT; static Bone *create(); const bx::float4x4_t worldTransformMatrix() const NANOEM_DECL_NOEXCEPT; diff --git a/emapp/include/emapp/model/Joint.h b/emapp/include/emapp/model/Joint.h index 68db2527..e25d8c2b 100644 --- a/emapp/include/emapp/model/Joint.h +++ b/emapp/include/emapp/model/Joint.h @@ -23,7 +23,8 @@ class Joint NANOEM_DECL_SEALED : private NonCopyable { typedef tinystl::vector MutableList; typedef tinystl::unordered_set MutableSet; - static Joint *cast(const nanoem_model_joint_t *joint) NANOEM_DECL_NOEXCEPT; + static int index(const nanoem_model_joint_t *jointPtr) NANOEM_DECL_NOEXCEPT; + static Joint *cast(const nanoem_model_joint_t *jointPtr) NANOEM_DECL_NOEXCEPT; static Joint *create(); ~Joint() NANOEM_DECL_NOEXCEPT; diff --git a/emapp/include/emapp/model/Label.h b/emapp/include/emapp/model/Label.h index c294f7c9..f2c4eaac 100644 --- a/emapp/include/emapp/model/Label.h +++ b/emapp/include/emapp/model/Label.h @@ -25,7 +25,8 @@ class Label NANOEM_DECL_SEALED : private NonCopyable { void bind(nanoem_model_label_t *label); void resetLanguage( const nanoem_model_label_t *label, nanoem_unicode_string_factory_t *factory, nanoem_language_type_t language); - static Label *cast(const nanoem_model_label_t *label) NANOEM_DECL_NOEXCEPT; + static int index(const nanoem_model_label_t *labelPtr) NANOEM_DECL_NOEXCEPT; + static Label *cast(const nanoem_model_label_t *labelPtr) NANOEM_DECL_NOEXCEPT; static Label *create(); String name() const; diff --git a/emapp/include/emapp/model/Material.h b/emapp/include/emapp/model/Material.h index 5d5b81cc..28380354 100644 --- a/emapp/include/emapp/model/Material.h +++ b/emapp/include/emapp/model/Material.h @@ -62,7 +62,8 @@ class Material NANOEM_DECL_SEALED : private NonCopyable { Color color() const NANOEM_DECL_NOEXCEPT; Edge edge() const NANOEM_DECL_NOEXCEPT; - static Material *cast(const nanoem_model_material_t *material) NANOEM_DECL_NOEXCEPT; + static int index(const nanoem_model_material_t *materialPtr) NANOEM_DECL_NOEXCEPT; + static Material *cast(const nanoem_model_material_t *materialPtr) NANOEM_DECL_NOEXCEPT; static Material *create(sg_image fallbackTexture); const IImageView *diffuseImage() const NANOEM_DECL_NOEXCEPT; diff --git a/emapp/include/emapp/model/Morph.h b/emapp/include/emapp/model/Morph.h index c45c5dd5..bc41c101 100644 --- a/emapp/include/emapp/model/Morph.h +++ b/emapp/include/emapp/model/Morph.h @@ -32,7 +32,8 @@ class Morph NANOEM_DECL_SEALED : private NonCopyable { void synchronizeMotion(const Motion *motion, const nanoem_unicode_string_t *name, nanoem_frame_index_t frameIndex, nanoem_f32_t amount); - static Morph *cast(const nanoem_model_morph_t *morph) NANOEM_DECL_NOEXCEPT; + static int index(const nanoem_model_morph_t *morphPtr) NANOEM_DECL_NOEXCEPT; + static Morph *cast(const nanoem_model_morph_t *morphPtr) NANOEM_DECL_NOEXCEPT; static Morph *create(); String name() const; diff --git a/emapp/include/emapp/model/RigidBody.h b/emapp/include/emapp/model/RigidBody.h index 28eb7ce4..674e23d3 100644 --- a/emapp/include/emapp/model/RigidBody.h +++ b/emapp/include/emapp/model/RigidBody.h @@ -40,6 +40,7 @@ class RigidBody NANOEM_DECL_SEALED : private NonCopyable { nanoem_model_rigid_body_transform_type_t transformType; }; + static int index(const nanoem_model_rigid_body_t *bodyPtr) NANOEM_DECL_NOEXCEPT; static Vector3 colorByShapeType(const nanoem_model_rigid_body_t *bodyPtr) NANOEM_DECL_NOEXCEPT; static Vector3 colorByObjectType(const nanoem_model_rigid_body_t *bodyPtr) NANOEM_DECL_NOEXCEPT; static RigidBody *cast(const nanoem_model_rigid_body_t *body) NANOEM_DECL_NOEXCEPT; diff --git a/emapp/include/emapp/model/SoftBody.h b/emapp/include/emapp/model/SoftBody.h index cc4a870f..9d8e00eb 100644 --- a/emapp/include/emapp/model/SoftBody.h +++ b/emapp/include/emapp/model/SoftBody.h @@ -25,6 +25,7 @@ class SoftBody NANOEM_DECL_SEALED : private NonCopyable { typedef tinystl::unordered_set Set; typedef tinystl::unordered_set MutableSet; + static int index(const nanoem_model_soft_body_t *softBodyPtr) NANOEM_DECL_NOEXCEPT; static SoftBody *cast(const nanoem_model_soft_body_t *softBodyPtr); static SoftBody *create(); diff --git a/emapp/include/emapp/model/Vertex.h b/emapp/include/emapp/model/Vertex.h index 1f814d7d..f2a47392 100644 --- a/emapp/include/emapp/model/Vertex.h +++ b/emapp/include/emapp/model/Vertex.h @@ -31,6 +31,7 @@ class Vertex NANOEM_DECL_SEALED : private NonCopyable { void bind(nanoem_model_vertex_t *vertexPtr); void setupBoneBinding(nanoem_model_vertex_t *vertexPtr, Model *model); + static int index(const nanoem_model_vertex_t *vertexPtr); static Vertex *cast(const nanoem_model_vertex_t *vertexPtr); static Vertex *create(); diff --git a/emapp/src/CommandMessage.inl b/emapp/src/CommandMessage.inl index 855dfb06..900d5734 100644 --- a/emapp/src/CommandMessage.inl +++ b/emapp/src/CommandMessage.inl @@ -137,7 +137,7 @@ public: op->parent_model_handle = model->handle(); if (const nanoem_model_bone_t *bonePtr = model->findBone(parent.second)) { op->has_parent_model_bone_index = 1; - op->parent_model_bone_index = nanoemModelObjectGetIndex(nanoemModelBoneGetModelObject(bonePtr)); + op->parent_model_bone_index = model::Bone::index(bonePtr); } } } @@ -147,13 +147,13 @@ public: op = nanoem_new(Nanoem__Application__OutsideParent); nanoem__application__outside_parent__init(op); op->has_bone_index = 1; - op->bone_index = nanoemModelObjectGetIndex(nanoemModelBoneGetModelObject(bonePtr)); + op->bone_index = model::Bone::index(bonePtr); if (const Model *model = project->findModelByName(parent.first)) { op->has_parent_model_handle = 1; op->parent_model_handle = model->handle(); if (const nanoem_model_bone_t *bonePtr = model->findBone(parent.second)) { op->has_parent_model_bone_index = 1; - op->parent_model_bone_index = nanoemModelObjectGetIndex(nanoemModelBoneGetModelObject(bonePtr)); + op->parent_model_bone_index = model::Bone::index(bonePtr); } } } diff --git a/emapp/src/Effect.cc b/emapp/src/Effect.cc index 954c308f..29be2372 100644 --- a/emapp/src/Effect.cc +++ b/emapp/src/Effect.cc @@ -4450,7 +4450,7 @@ Effect::internalFindTechnique( effect::Technique *foundTechnique = nullptr; if (it != m_techniqueByPassTypes.end()) { tinystl::unordered_set subset; - const int materialIndex = nanoemModelObjectGetIndex(nanoemModelMaterialGetModelObject(material)); + const int materialIndex = model::Material::index(material); const TechniqueList &techniques = it->second; for (TechniqueList::const_iterator it2 = techniques.begin(), end2 = techniques.end(); it2 != end2; ++it2) { effect::Technique *technique = *it2; diff --git a/emapp/src/Model.cc b/emapp/src/Model.cc index d899ee5c..870b3a59 100644 --- a/emapp/src/Model.cc +++ b/emapp/src/Model.cc @@ -1257,7 +1257,7 @@ Model::writeLoadCommandMessage(Error &error) Nanoem__Application__Bone *b = nanoem_new(Nanoem__Application__Bone); nanoem__application__bone__init(b); const nanoem_model_bone_t *bone = bones[i]; - b->index = nanoemModelObjectGetIndex(nanoemModelBoneGetModelObject(bone)); + b->index = model::Bone::index(bone); b->name = reinterpret_cast(nanoemUnicodeStringFactoryGetByteArrayEncoding(factory, nanoemModelBoneGetName(bone, NANOEM_LANGUAGE_TYPE_FIRST_ENUM), &length, NANOEM_CODEC_TYPE_UTF8, &status)); command.bones[i] = b; @@ -1269,7 +1269,7 @@ Model::writeLoadCommandMessage(Error &error) Nanoem__Application__Morph *m = nanoem_new(Nanoem__Application__Morph); nanoem__application__morph__init(m); const nanoem_model_morph_t *morph = morphs[i]; - m->index = nanoemModelObjectGetIndex(nanoemModelMorphGetModelObject(morph)); + m->index = model::Morph::index(morph); m->name = reinterpret_cast(nanoemUnicodeStringFactoryGetByteArrayEncoding(factory, nanoemModelMorphGetName(morph, NANOEM_LANGUAGE_TYPE_FIRST_ENUM), &length, NANOEM_CODEC_TYPE_UTF8, &status)); command.morphs[i] = m; @@ -2550,7 +2550,7 @@ Model::splitBonesPerMaterial(model::Material::BoneIndexHashMap &boneIndexHash) c const nanoem_model_vertex_t *vertex = vertices[vertexIndex]; for (nanoem_rsize_t k = 0; k < 4; k++) { const nanoem_model_bone_t *bone = nanoemModelVertexGetBoneObject(vertex, k); - int boneIndex = nanoemModelObjectGetIndex(nanoemModelBoneGetModelObject(bone)); + int boneIndex = model::Bone::index(bone); if (boneIndex >= 0) { if (indexHash.insert(tinystl::make_pair(boneIndex, uniqueBoneIndexPerMaterial)).second) { uniqueBoneIndexPerMaterial++; @@ -3632,7 +3632,7 @@ Model::drawAllVertexPoints() sg::LineVertexUnit *vertexUnits = m_drawAllPoints.m_vertices.data(); for (size_t i = 0; i < numNewVertices; i++) { const nanoem_model_vertex_t *vertexPtr = newVertices[i]; - const int index = nanoemModelObjectGetIndex(nanoemModelVertexGetModelObject(vertexPtr)); + const int index = model::Vertex::index(vertexPtr); const model::Vertex *vertex = model::Vertex::cast(vertexPtr); sg::LineVertexUnit &vertexUnit = vertexUnits[index]; bx::simd128_t *ptr = reinterpret_cast(glm::value_ptr(vertexUnit.m_position)); @@ -4718,25 +4718,25 @@ Model::setTransformAxisType(AxisType value) } } -Model::TransformCoordinateType +Model::TransformCoordinateType Model::gizmoTransformCoordinateType() const NANOEM_DECL_NOEXCEPT { return m_gizmoTransformCoordinateType; } -void +void Model::setGizmoTransformCoordinateType(TransformCoordinateType value) { m_gizmoTransformCoordinateType = value; } -Model::GizmoOperationType +Model::GizmoOperationType Model::gizmoOperationType() const NANOEM_DECL_NOEXCEPT { return m_gizmoOperationType; } -void +void Model::setGizmoOperationType(GizmoOperationType value) { m_gizmoOperationType = value; @@ -4775,13 +4775,13 @@ Model::toggleTransformCoordinateType() } } -Matrix4x4 +Matrix4x4 Model::pivotMatrix() const NANOEM_DECL_NOEXCEPT { return m_pivotMatrix; } -void +void Model::setPivotMatrix(const Matrix4x4 &value) { m_pivotMatrix = value; diff --git a/emapp/src/PluginFactory.cc b/emapp/src/PluginFactory.cc index 1d79f370..0640889a 100644 --- a/emapp/src/PluginFactory.cc +++ b/emapp/src/PluginFactory.cc @@ -354,43 +354,43 @@ PluginFactory::ModelIOPluginProxy::setupSelection(const Model *model, Error &err IntList indices; const model::Vertex::Set vertices(selection->allVertexSet()); for (model::Vertex::Set::const_iterator it = vertices.begin(), end = vertices.end(); it != end; ++it) { - indices.push_back(nanoemModelObjectGetIndex(nanoemModelVertexGetModelObject(*it))); + indices.push_back(model::Vertex::index(*it)); } m_plugin->setAllSelectedVertexObjectIndices(indices.data(), indices.size(), error); indices.clear(); const model::Material::Set materials(selection->allMaterialSet()); for (model::Material::Set::const_iterator it = materials.begin(), end = materials.end(); it != end; ++it) { - indices.push_back(nanoemModelObjectGetIndex(nanoemModelMaterialGetModelObject(*it))); + indices.push_back(model::Material::index(*it)); } m_plugin->setAllSelectedMaterialObjectIndices(indices.data(), indices.size(), error); indices.clear(); const model::Bone::Set bones(selection->allBoneSet()); for (model::Bone::Set::const_iterator it = bones.begin(), end = bones.end(); it != end; ++it) { - indices.push_back(nanoemModelObjectGetIndex(nanoemModelBoneGetModelObject(*it))); + indices.push_back(model::Bone::index(*it)); } m_plugin->setAllSelectedBoneObjectIndices(indices.data(), indices.size(), error); indices.clear(); const model::Morph::Set morphs(selection->allMorphSet()); for (model::Morph::Set::const_iterator it = morphs.begin(), end = morphs.end(); it != end; ++it) { - indices.push_back(nanoemModelObjectGetIndex(nanoemModelMorphGetModelObject(*it))); + indices.push_back(model::Morph::index(*it)); } m_plugin->setAllSelectedMorphObjectIndices(indices.data(), indices.size(), error); indices.clear(); const model::Label::Set labels(selection->allLabelSet()); for (model::Label::Set::const_iterator it = labels.begin(), end = labels.end(); it != end; ++it) { - indices.push_back(nanoemModelObjectGetIndex(nanoemModelLabelGetModelObject(*it))); + indices.push_back(model::Label::index(*it)); } m_plugin->setAllSelectedLabelObjectIndices(indices.data(), indices.size(), error); indices.clear(); const model::RigidBody::Set rigidBodies(selection->allRigidBodySet()); for (model::RigidBody::Set::const_iterator it = rigidBodies.begin(), end = rigidBodies.end(); it != end; ++it) { - indices.push_back(nanoemModelObjectGetIndex(nanoemModelRigidBodyGetModelObject(*it))); + indices.push_back(model::RigidBody::index(*it)); } m_plugin->setAllSelectedRigidBodyObjectIndices(indices.data(), indices.size(), error); indices.clear(); const model::Joint::Set joints(selection->allJointSet()); for (model::Joint::Set::const_iterator it = joints.begin(), end = joints.end(); it != end; ++it) { - indices.push_back(nanoemModelObjectGetIndex(nanoemModelJointGetModelObject(*it))); + indices.push_back(model::Joint::index(*it)); } m_plugin->setAllSelectedJointObjectIndices(indices.data(), indices.size(), error); } diff --git a/emapp/src/command/BaseBoneKeyframeCommand.cc b/emapp/src/command/BaseBoneKeyframeCommand.cc index 472970d0..4a329eea 100644 --- a/emapp/src/command/BaseBoneKeyframeCommand.cc +++ b/emapp/src/command/BaseBoneKeyframeCommand.cc @@ -205,7 +205,7 @@ BaseBoneKeyframeCommand::writeMessage(void *messagePtr, nanoem_u32_t type) Nanoem__Application__RedoBoneKeyframeCommand__Keyframe *k = nanoem_new(Nanoem__Application__RedoBoneKeyframeCommand__Keyframe); nanoem__application__redo_bone_keyframe_command__keyframe__init(k); - k->bone_index = nanoemModelObjectGetIndex(nanoemModelBoneGetModelObject(m_model->findBone(keyframe.m_name))); + k->bone_index = model::Bone::index(m_model->findBone(keyframe.m_name)); k->frame_index = keyframe.m_frameIndex; k->dirty = keyframe.wasDirty; writeStateMessage(keyframe.m_state.first, &k->current_state); diff --git a/emapp/src/command/BaseModelKeyframeCommand.cc b/emapp/src/command/BaseModelKeyframeCommand.cc index ae0e7fd2..8e8108aa 100644 --- a/emapp/src/command/BaseModelKeyframeCommand.cc +++ b/emapp/src/command/BaseModelKeyframeCommand.cc @@ -403,7 +403,7 @@ BaseModelKeyframeCommand::writeStateMessage(const ModelKeyframe::State &s, void Nanoem__Application__RedoModelKeyframeCommand__ConstraintState *cs = state->constraint_states[offset++] = nanoem_new(Nanoem__Application__RedoModelKeyframeCommand__ConstraintState); nanoem__application__redo_model_keyframe_command__constraint_state__init(cs); - cs->bone_index = nanoemModelObjectGetIndex(nanoemModelBoneGetModelObject(it->first)); + cs->bone_index = model::Bone::index(it->first); cs->enabled = it->second; } nanoem_rsize_t numOutsideParents = s.m_outsideParents.size(); diff --git a/emapp/src/command/BaseMorphKeyframeCommand.cc b/emapp/src/command/BaseMorphKeyframeCommand.cc index 85810376..a79f63ea 100644 --- a/emapp/src/command/BaseMorphKeyframeCommand.cc +++ b/emapp/src/command/BaseMorphKeyframeCommand.cc @@ -165,7 +165,7 @@ BaseMorphKeyframeCommand::writeMessage(void *messagePtr, nanoem_u32_t type) nanoem_new(Nanoem__Application__RedoMorphKeyframeCommand__Keyframe); nanoem__application__redo_morph_keyframe_command__keyframe__init(k); k->frame_index = keyframe.m_frameIndex; - k->morph_index = nanoemModelObjectGetIndex(nanoemModelMorphGetModelObject(m_model->findMorph(keyframe.m_name))); + k->morph_index = model::Morph::index(m_model->findMorph(keyframe.m_name)); writeStateMessage(keyframe.m_state.first, &k->current_state); writeStateMessage(keyframe.m_state.second, &k->last_state); keyframes[offset++] = k; diff --git a/emapp/src/command/TransformBoneCommand.cc b/emapp/src/command/TransformBoneCommand.cc index 60e58434..4c9cf017 100644 --- a/emapp/src/command/TransformBoneCommand.cc +++ b/emapp/src/command/TransformBoneCommand.cc @@ -146,8 +146,7 @@ TransformBoneCommand::write(void *messagePtr) nanoem_rsize_t numDirtyBones = 0; for (DirtyStateList::const_iterator it = m_dirtyStates.begin(), end = m_dirtyStates.end(); it != end; ++it) { if (it->second) { - command->dirty_bone_indices[numDirtyBones++] = - nanoemModelObjectGetIndex(nanoemModelBoneGetModelObject(it->first)); + command->dirty_bone_indices[numDirtyBones++] = model::Bone::index(it->first); } } command->n_dirty_bone_indices = numDirtyBones; diff --git a/emapp/src/command/TransformMorphCommand.cc b/emapp/src/command/TransformMorphCommand.cc index 99ddfdee..37641254 100644 --- a/emapp/src/command/TransformMorphCommand.cc +++ b/emapp/src/command/TransformMorphCommand.cc @@ -128,7 +128,7 @@ TransformMorphCommand::write(void *messagePtr) Nanoem__Application__RedoTransformMorphCommand__State *state = nanoem_new(Nanoem__Application__RedoTransformMorphCommand__State); nanoem__application__redo_transform_morph_command__state__init(state); - state->morph_index = nanoemModelObjectGetIndex(nanoemModelMorphGetModelObject(it->first)); + state->morph_index = model::Morph::index(it->first); state->weight = it->second.first; command->current_bind_pose[offset++] = state; } @@ -139,7 +139,7 @@ TransformMorphCommand::write(void *messagePtr) Nanoem__Application__RedoTransformMorphCommand__State *state = nanoem_new(Nanoem__Application__RedoTransformMorphCommand__State); nanoem__application__redo_transform_morph_command__state__init(state); - state->morph_index = nanoemModelObjectGetIndex(nanoemModelMorphGetModelObject(it->first)); + state->morph_index = model::Morph::index(it->first); state->weight = it->second.second; command->last_bind_pose[offset++] = state; } diff --git a/emapp/src/internal/imgui/ModelParameterDialog.cc b/emapp/src/internal/imgui/ModelParameterDialog.cc index 5758a136..9a1bd683 100644 --- a/emapp/src/internal/imgui/ModelParameterDialog.cc +++ b/emapp/src/internal/imgui/ModelParameterDialog.cc @@ -27,7 +27,7 @@ void ModelParameterDialog::formatVertexText(char *buffer, nanoem_rsize_t size, const nanoem_model_vertex_t *vertexPtr) { const nanoem_f32_t *origin = nanoemModelVertexGetOrigin(vertexPtr); - int offset = nanoemModelObjectGetIndex(nanoemModelVertexGetModelObject(vertexPtr)) + 1; + int offset = model::Vertex::index(vertexPtr) + 1; StringUtils::format(buffer, size, "%d (%.2f, %.2f, %.2f)", offset, origin[0], origin[1], origin[2]); } @@ -1113,7 +1113,7 @@ ModelParameterDialog::layoutAllBones(Project *project) const int m_offset; }; const nanoem_model_bone_t *selectedBone = numBones > 0 ? bones[m_boneIndex] : nullptr; - int selectedBoneIndex = nanoemModelObjectGetIndex(nanoemModelBoneGetModelObject(selectedBone)); + int selectedBoneIndex = model::Bone::index(selectedBone); if (ImGui::BeginMenu("Insert New")) { if (ImGui::MenuItem("at Last")) { m_parent->addLazyExecutionCommand(nanoem_new(CreateBoneCommand(numBones, -1, nullptr))); @@ -1811,7 +1811,7 @@ ModelParameterDialog::layoutAllMorphs(Project *project) const int m_offset; }; const nanoem_model_morph_t *selectedMorph = numMorphs > 0 ? morphs[m_morphIndex] : nullptr; - int selectedMorphIndex = nanoemModelObjectGetIndex(nanoemModelMorphGetModelObject(selectedMorph)); + int selectedMorphIndex = model::Morph::index(selectedMorph); if (ImGui::BeginMenu("Insert New")) { if (ImGui::BeginMenu("Bone Morph")) { const nanoem_model_morph_type_t type = NANOEM_MODEL_MORPH_TYPE_BONE; @@ -2758,7 +2758,7 @@ ModelParameterDialog::layoutAllLabels(Project *project) const nanoem_rsize_t m_numLabels; const int m_offset; }; - int selectedLabelIndex = nanoemModelObjectGetIndex(nanoemModelLabelGetModelObject(selectedLabel)); + int selectedLabelIndex = model::Label::index(selectedLabel); if (ImGui::BeginMenu("Insert New")) { if (ImGui::MenuItem("at Last")) { m_parent->addLazyExecutionCommand(nanoem_new(CreateLabelCommand(numLabels, -1, nullptr))); @@ -3098,7 +3098,7 @@ ModelParameterDialog::layoutAllRigidBodies(Project *project) }; const nanoem_model_rigid_body_t *selectedRigidBody = numRigidBodies > 0 ? rigidBodies[m_rigidBodyIndex] : nullptr; - int selectedRigidBodyIndex = nanoemModelObjectGetIndex(nanoemModelRigidBodyGetModelObject(selectedRigidBody)); + int selectedRigidBodyIndex = model::RigidBody::index(selectedRigidBody); if (ImGui::BeginMenu("Insert New")) { if (ImGui::MenuItem("at Last")) { m_parent->addLazyExecutionCommand(nanoem_new(CreateRigidBodyCommand(numRigidBodies, -1, nullptr))); @@ -3475,7 +3475,7 @@ ModelParameterDialog::layoutAllJoints(Project *project) const int m_offset; }; const nanoem_model_joint_t *selectedJoint = numJoints > 0 ? joints[m_jointIndex] : nullptr; - int selectedJointIndex = nanoemModelObjectGetIndex(nanoemModelJointGetModelObject(selectedJoint)); + int selectedJointIndex = model::Joint::index(selectedJoint); if (ImGui::BeginMenu("Insert New")) { if (ImGui::MenuItem("at Last")) { m_parent->addLazyExecutionCommand(nanoem_new(CreateJointCommand(numJoints, -1, nullptr))); @@ -3812,7 +3812,7 @@ ModelParameterDialog::layoutAllSoftBodies(Project *project) const int m_offset; }; const nanoem_model_soft_body_t *selectedSoftBody = numSoftBodys > 0 ? soft_bodys[m_softBodyIndex] : nullptr; - int selectedSoftBodyIndex = nanoemModelObjectGetIndex(nanoemModelSoftBodyGetModelObject(selectedSoftBody)); + int selectedSoftBodyIndex = model::SoftBody::index(selectedSoftBody); if (ImGui::BeginMenu("Insert New")) { if (ImGui::MenuItem("at Last")) { m_parent->addLazyExecutionCommand(nanoem_new(CreateSoftBodyCommand(numSoftBodys, -1, nullptr))); diff --git a/emapp/src/model/BindPose.cc b/emapp/src/model/BindPose.cc index a2269fe0..ca0f525f 100644 --- a/emapp/src/model/BindPose.cc +++ b/emapp/src/model/BindPose.cc @@ -453,7 +453,7 @@ BindPose::saveAllMessages(void *states, size_t &numStates) const Nanoem__Application__RedoTransformBoneCommand__State *state = nanoem_new(Nanoem__Application__RedoTransformBoneCommand__State); nanoem__application__redo_transform_bone_command__state__init(state); - state->bone_index = nanoemModelObjectGetIndex(nanoemModelBoneGetModelObject(p.m_bonePtr)); + state->bone_index = model::Bone::index(p.m_bonePtr); CommandMessageUtil::setVector(p.m_localUserTranslation, state->local_user_translation); CommandMessageUtil::setQuaternion(p.m_localUserOrientation, state->local_user_orientation); CommandMessageUtil::setVector(p.m_localMorphTranslation, state->local_morph_translation); diff --git a/emapp/src/model/Bone.cc b/emapp/src/model/Bone.cc index 4b45f789..2b62ccca 100644 --- a/emapp/src/model/Bone.cc +++ b/emapp/src/model/Bone.cc @@ -90,8 +90,7 @@ Bone::resetLanguage( StringUtils::getUtf8String( nanoemModelBoneGetName(bone, NANOEM_LANGUAGE_TYPE_FIRST_ENUM), factory, m_canonicalName); if (m_canonicalName.empty()) { - StringUtils::format( - m_canonicalName, "Bone%d", nanoemModelObjectGetIndex(nanoemModelBoneGetModelObject(bone))); + StringUtils::format(m_canonicalName, "Bone%d", index(bone)); } } if (m_name.empty()) { @@ -399,31 +398,37 @@ Bone::constrainOrientation( } bool -Bone::isSelectable(const nanoem_model_bone_t *bone) NANOEM_DECL_NOEXCEPT +Bone::isSelectable(const nanoem_model_bone_t *bonePtr) NANOEM_DECL_NOEXCEPT { - return nanoemModelBoneIsVisible(bone) && nanoemModelBoneIsUserHandleable(bone) && - (nanoemModelBoneIsMovable(bone) || nanoemModelBoneIsRotateable(bone)); + return nanoemModelBoneIsVisible(bonePtr) && nanoemModelBoneIsUserHandleable(bonePtr) && + (nanoemModelBoneIsMovable(bonePtr) || nanoemModelBoneIsRotateable(bonePtr)); } bool -Bone::isMovable(const nanoem_model_bone_t *bone) NANOEM_DECL_NOEXCEPT +Bone::isMovable(const nanoem_model_bone_t *bonePtr) NANOEM_DECL_NOEXCEPT { - return nanoemModelBoneIsUserHandleable(bone) && nanoemModelBoneIsMovable(bone); + return nanoemModelBoneIsUserHandleable(bonePtr) && nanoemModelBoneIsMovable(bonePtr); } bool -Bone::isRotateable(const nanoem_model_bone_t *bone) NANOEM_DECL_NOEXCEPT +Bone::isRotateable(const nanoem_model_bone_t *bonePtr) NANOEM_DECL_NOEXCEPT { - return nanoemModelBoneIsUserHandleable(bone) && nanoemModelBoneIsRotateable(bone); + return nanoemModelBoneIsUserHandleable(bonePtr) && nanoemModelBoneIsRotateable(bonePtr); +} + +int +Bone::index(const nanoem_model_bone_t *bonePtr) NANOEM_DECL_NOEXCEPT +{ + return nanoemModelObjectGetIndex(nanoemModelBoneGetModelObject(bonePtr)); } Matrix3x3 -Bone::localAxes(const nanoem_model_bone_t *bone) NANOEM_DECL_NOEXCEPT +Bone::localAxes(const nanoem_model_bone_t *bonePtr) NANOEM_DECL_NOEXCEPT { nanoem_parameter_assert(bone, "must not be nullptr"); - if (nanoemModelBoneHasLocalAxes(bone)) { - const Vector3 axisX(glm::make_vec3(nanoemModelBoneGetLocalXAxis(bone))); - const Vector3 axisZ(glm::make_vec3(nanoemModelBoneGetLocalZAxis(bone))); + if (nanoemModelBoneHasLocalAxes(bonePtr)) { + const Vector3 axisX(glm::make_vec3(nanoemModelBoneGetLocalXAxis(bonePtr))); + const Vector3 axisZ(glm::make_vec3(nanoemModelBoneGetLocalZAxis(bonePtr))); const Vector3 axisY(glm::cross(axisZ, axisX)); const Vector3 newAxisZ(glm::cross(axisX, axisY)); const Matrix3x3 matrix(axisX, axisY, newAxisZ); @@ -436,9 +441,9 @@ Bone::localAxes(const nanoem_model_bone_t *bone) NANOEM_DECL_NOEXCEPT } Vector3 -Bone::origin(const nanoem_model_bone_t *bone) NANOEM_DECL_NOEXCEPT +Bone::origin(const nanoem_model_bone_t *bonePtr) NANOEM_DECL_NOEXCEPT { - return glm::make_vec3(nanoemModelBoneGetOrigin(bone)) * Constants::kTranslateDirection; + return glm::make_vec3(nanoemModelBoneGetOrigin(bonePtr)) * Constants::kTranslateDirection; } Vector3 @@ -456,9 +461,9 @@ Bone::toQuaternion(const nanoem_motion_bone_keyframe_t *keyframe) NANOEM_DECL_NO } Bone * -Bone::cast(const nanoem_model_bone_t *bone) NANOEM_DECL_NOEXCEPT +Bone::cast(const nanoem_model_bone_t *bonePtr) NANOEM_DECL_NOEXCEPT { - const nanoem_model_object_t *object = nanoemModelBoneGetModelObject(bone); + const nanoem_model_object_t *object = nanoemModelBoneGetModelObject(bonePtr); const nanoem_user_data_t *userData = nanoemModelObjectGetUserData(object); return static_cast(nanoemUserDataGetOpaqueData(userData)); } diff --git a/emapp/src/model/Joint.cc b/emapp/src/model/Joint.cc index 0b4df4e4..5f39fd00 100644 --- a/emapp/src/model/Joint.cc +++ b/emapp/src/model/Joint.cc @@ -17,10 +17,16 @@ namespace nanoem { namespace model { +int +Joint::index(const nanoem_model_joint_t *jointPtr) NANOEM_DECL_NOEXCEPT +{ + return nanoemModelObjectGetIndex(nanoemModelJointGetModelObject(jointPtr)); +} + Joint * -Joint::cast(const nanoem_model_joint_t *joint) NANOEM_DECL_NOEXCEPT +Joint::cast(const nanoem_model_joint_t *jointPtr) NANOEM_DECL_NOEXCEPT { - const nanoem_model_object_t *object = nanoemModelJointGetModelObject(joint); + const nanoem_model_object_t *object = nanoemModelJointGetModelObject(jointPtr); const nanoem_user_data_t *userData = nanoemModelObjectGetUserData(object); return static_cast(nanoemUserDataGetOpaqueData(userData)); } @@ -93,8 +99,7 @@ Joint::resetLanguage( StringUtils::getUtf8String( nanoemModelJointGetName(joint, NANOEM_LANGUAGE_TYPE_FIRST_ENUM), factory, m_canonicalName); if (m_canonicalName.empty()) { - StringUtils::format( - m_canonicalName, "Joint%d", nanoemModelObjectGetIndex(nanoemModelJointGetModelObject(joint))); + StringUtils::format(m_canonicalName, "Joint%d", index(joint)); } } if (m_name.empty()) { diff --git a/emapp/src/model/Label.cc b/emapp/src/model/Label.cc index 913f07b0..c2c4c32c 100644 --- a/emapp/src/model/Label.cc +++ b/emapp/src/model/Label.cc @@ -36,8 +36,7 @@ Label::resetLanguage( StringUtils::getUtf8String( nanoemModelLabelGetName(label, NANOEM_LANGUAGE_TYPE_FIRST_ENUM), factory, m_canonicalName); if (m_canonicalName.empty()) { - StringUtils::format( - m_canonicalName, "Label%d", nanoemModelObjectGetIndex(nanoemModelLabelGetModelObject(label))); + StringUtils::format(m_canonicalName, "Label%d", index(label)); } } if (m_name.empty()) { @@ -45,10 +44,16 @@ Label::resetLanguage( } } +int +Label::index(const nanoem_model_label_t *labelPtr) NANOEM_DECL_NOEXCEPT +{ + return nanoemModelObjectGetIndex(nanoemModelLabelGetModelObject(labelPtr)); +} + Label * -Label::cast(const nanoem_model_label_t *label) NANOEM_DECL_NOEXCEPT +Label::cast(const nanoem_model_label_t *labelPtr) NANOEM_DECL_NOEXCEPT { - const nanoem_model_object_t *object = nanoemModelLabelGetModelObject(label); + const nanoem_model_object_t *object = nanoemModelLabelGetModelObject(labelPtr); const nanoem_user_data_t *userData = nanoemModelObjectGetUserData(object); return static_cast