Better split between runtime library and editor.
parent
9168dec9f9
commit
411aa5ef20
|
@ -43,23 +43,11 @@ set(ThirdPartyIncludeDeps
|
|||
|
||||
# Shared code by main executable and tests
|
||||
add_library(AnimTestbedCode OBJECT
|
||||
src/Camera.c
|
||||
src/SkinnedMesh.cc
|
||||
src/SkinnedMesh.h
|
||||
src/SkinnedMeshResource.cc
|
||||
src/SkinnedMeshResource.h
|
||||
src/SyncTrack.cc
|
||||
src/SyncTrack.h
|
||||
src/ozzutils.cc
|
||||
3rdparty/imgui/imgui.cpp
|
||||
3rdparty/imgui/imgui_draw.cpp
|
||||
3rdparty/imgui/imgui_widgets.cpp
|
||||
3rdparty/imgui/misc/cpp/imgui_stdlib.cpp
|
||||
3rdparty/imnodes/imnodes.cpp
|
||||
src/AnimGraph/AnimGraphResource.cc
|
||||
src/AnimGraph/AnimGraphResource.h
|
||||
src/AnimGraph/AnimGraphEditor.cc
|
||||
src/AnimGraph/AnimGraphEditor.h
|
||||
src/AnimGraph/AnimGraph.cc
|
||||
src/AnimGraph/AnimGraph.h
|
||||
src/AnimGraph/AnimGraphNodes.cc
|
||||
|
@ -87,7 +75,19 @@ target_include_directories(
|
|||
target_sources(AnimTestbed PRIVATE
|
||||
src/main.cc
|
||||
src/SkinnedMeshRenderer.cc
|
||||
src/AnimGraph/AnimGraphEditor.cc
|
||||
src/AnimGraph/AnimGraphEditor.h
|
||||
src/Camera.c
|
||||
src/SkinnedMesh.cc
|
||||
src/SkinnedMesh.h
|
||||
src/SkinnedMeshResource.cc
|
||||
src/SkinnedMeshResource.h
|
||||
3rdparty/glfw/deps/glad_gl.c
|
||||
3rdparty/imgui/imgui.cpp
|
||||
3rdparty/imgui/imgui_draw.cpp
|
||||
3rdparty/imgui/imgui_widgets.cpp
|
||||
3rdparty/imgui/misc/cpp/imgui_stdlib.cpp
|
||||
3rdparty/imnodes/imnodes.cpp
|
||||
3rdparty/imgui/imgui_demo.cpp
|
||||
3rdparty/imgui/backends/imgui_impl_glfw.cpp
|
||||
3rdparty/imgui/backends/imgui_impl_opengl3.cpp
|
||||
|
|
|
@ -4,7 +4,10 @@
|
|||
|
||||
#include "AnimGraphEditor.h"
|
||||
|
||||
#include <sstream>
|
||||
|
||||
#include "AnimGraphResource.h"
|
||||
#include "SkinnedMesh.h"
|
||||
#include "imgui.h"
|
||||
#include "imnodes.h"
|
||||
#include "misc/cpp/imgui_stdlib.h"
|
||||
|
@ -63,6 +66,83 @@ void RemoveConnectionsForSocket(
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
void SyncTrackEditor(SyncTrack* sync_track) {
|
||||
ImGui::SliderFloat("duration", &sync_track->m_duration, 0.001f, 10.f);
|
||||
|
||||
ImGui::Text("Marker");
|
||||
ImGui::SameLine();
|
||||
ImGui::Text("%d", sync_track->m_num_intervals);
|
||||
ImGui::SameLine();
|
||||
if (ImGui::Button("+")) {
|
||||
if (sync_track->m_num_intervals < cSyncTrackMaxIntervals) {
|
||||
sync_track->m_num_intervals ++;
|
||||
}
|
||||
}
|
||||
ImGui::SameLine();
|
||||
if (ImGui::Button("-")) {
|
||||
if (sync_track->m_num_intervals > 0) {
|
||||
sync_track->m_num_intervals --;
|
||||
}
|
||||
}
|
||||
|
||||
ImGui::Text("Marker:");
|
||||
for (int i = 0; i < sync_track->m_num_intervals; i++) {
|
||||
ImGui::Text("%2d:", i);
|
||||
ImGui::SameLine();
|
||||
std::ostringstream marker_stream;
|
||||
marker_stream << i;
|
||||
ImGui::SliderFloat(
|
||||
marker_stream.str().c_str(),
|
||||
&sync_track->m_sync_markers[i],
|
||||
0.f,
|
||||
1.f);
|
||||
}
|
||||
|
||||
if (ImGui::Button ("Update Intervals")) {
|
||||
sync_track->CalcIntervals();
|
||||
}
|
||||
}
|
||||
|
||||
void SkinnedMeshWidget(SkinnedMesh* skinned_mesh) {
|
||||
if (ImGui::TreeNode("Bones")) {
|
||||
for (int i = 0; i < skinned_mesh->m_skeleton.num_joints(); i++) {
|
||||
ImGui::Text("%s", skinned_mesh->m_skeleton.joint_names()[i]);
|
||||
}
|
||||
ImGui::TreePop();
|
||||
}
|
||||
|
||||
ImGui::Text("Animations");
|
||||
|
||||
const char* items[255] = {0};
|
||||
static int selected = -1;
|
||||
for (int i = 0; i < skinned_mesh->m_animations.size(); i++) {
|
||||
items[i] = skinned_mesh->m_animation_names[i].c_str();
|
||||
}
|
||||
|
||||
ImGui::Combo("Animation", &selected, items, skinned_mesh->m_animations.size());
|
||||
|
||||
ImGui::Text("Sync Track");
|
||||
if (selected >= 0 && selected < skinned_mesh->m_animations.size()) {
|
||||
SyncTrackEditor(&skinned_mesh->m_animation_sync_track[selected]);
|
||||
skinned_mesh->m_override_anim = selected;
|
||||
|
||||
ImGui::Checkbox("Override Animation", &skinned_mesh->m_sync_track_override);
|
||||
if (skinned_mesh->m_sync_track_override) {
|
||||
ImGui::SliderFloat("Ratio", &skinned_mesh->m_override_ratio, 0.f, 1.f);
|
||||
|
||||
ozz::animation::SamplingJob sampling_job;
|
||||
sampling_job.animation = skinned_mesh->m_animations[selected];
|
||||
sampling_job.context = &skinned_mesh->m_sampling_context;
|
||||
sampling_job.ratio = skinned_mesh->m_override_ratio;
|
||||
sampling_job.output = make_span(skinned_mesh->m_local_matrices);
|
||||
if (!sampling_job.Run()) {
|
||||
ozz::log::Err() << "Error sampling animation." << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void AnimGraphEditorRenderSidebar(
|
||||
AnimGraphResource& graph_resource,
|
||||
AnimNodeResource& node_resource) {
|
||||
|
|
|
@ -7,6 +7,8 @@
|
|||
|
||||
#include "AnimGraph.h"
|
||||
|
||||
struct SkinnedMesh;
|
||||
|
||||
inline int GenerateInputAttributeId(int node_id, int input_index) {
|
||||
return ((input_index + 1) << 14) + node_id;
|
||||
}
|
||||
|
@ -27,6 +29,10 @@ SplitOutputAttributeId(int attribute_id, int* node_id, int* output_index) {
|
|||
*output_index = (attribute_id >> 23) - 1;
|
||||
}
|
||||
|
||||
void SyncTrackEditor(SyncTrack* sync_track);
|
||||
|
||||
void SkinnedMeshWidget(SkinnedMesh* skinned_mesh);
|
||||
|
||||
void AnimGraphEditorUpdate();
|
||||
|
||||
void AnimGraphEditorGetRuntimeGraph(AnimGraph& anim_graph);
|
||||
|
|
|
@ -99,41 +99,3 @@ void SkinnedMesh::CalcModelMatrices() {
|
|||
|
||||
void SkinnedMesh::DrawSkeleton() {}
|
||||
|
||||
void SkinnedMesh::DrawDebugUi() {
|
||||
if (ImGui::TreeNode("Bones")) {
|
||||
for (int i = 0; i < m_skeleton.num_joints(); i++) {
|
||||
ImGui::Text("%s", m_skeleton.joint_names()[i]);
|
||||
}
|
||||
ImGui::TreePop();
|
||||
}
|
||||
|
||||
ImGui::Text("Animations");
|
||||
|
||||
const char* items[255] = {0};
|
||||
static int selected = -1;
|
||||
for (int i = 0; i < m_animations.size(); i++) {
|
||||
items[i] = m_animation_names[i].c_str();
|
||||
}
|
||||
|
||||
ImGui::Combo("Animation", &selected, items, m_animations.size());
|
||||
|
||||
ImGui::Text("Sync Track");
|
||||
if (selected >= 0 && selected < m_animations.size()) {
|
||||
m_animation_sync_track[selected].DrawDebugUi();
|
||||
m_override_anim = selected;
|
||||
|
||||
ImGui::Checkbox("Override Animation", &m_sync_track_override);
|
||||
if (m_sync_track_override) {
|
||||
ImGui::SliderFloat("Ratio", &m_override_ratio, 0.f, 1.f);
|
||||
|
||||
ozz::animation::SamplingJob sampling_job;
|
||||
sampling_job.animation = m_animations[selected];
|
||||
sampling_job.context = &m_sampling_context;
|
||||
sampling_job.ratio = m_override_ratio;
|
||||
sampling_job.output = make_span(m_local_matrices);
|
||||
if (!sampling_job.Run()) {
|
||||
ozz::log::Err() << "Error sampling animation." << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -40,7 +40,6 @@ struct SkinnedMesh {
|
|||
void DrawSkeleton();
|
||||
void DrawJoint(int joint_index, int parent_joint_index);
|
||||
|
||||
void DrawDebugUi();
|
||||
// void DrawSkinnedMesh();
|
||||
|
||||
ozz::vector<ozz::animation::Animation*> m_animations;
|
||||
|
|
|
@ -7,40 +7,3 @@
|
|||
#include <imgui.h>
|
||||
|
||||
#include <sstream>
|
||||
|
||||
void SyncTrack::DrawDebugUi() {
|
||||
ImGui::SliderFloat("duration", &m_duration, 0.001f, 10.f);
|
||||
|
||||
ImGui::Text("Marker");
|
||||
ImGui::SameLine();
|
||||
ImGui::Text("%d", m_num_intervals);
|
||||
ImGui::SameLine();
|
||||
if (ImGui::Button("+")) {
|
||||
if (m_num_intervals < cSyncTrackMaxIntervals) {
|
||||
m_num_intervals ++;
|
||||
}
|
||||
}
|
||||
ImGui::SameLine();
|
||||
if (ImGui::Button("-")) {
|
||||
if (m_num_intervals > 0) {
|
||||
m_num_intervals --;
|
||||
}
|
||||
}
|
||||
|
||||
ImGui::Text("Marker:");
|
||||
for (int i = 0; i < m_num_intervals; i++) {
|
||||
ImGui::Text("%2d:", i);
|
||||
ImGui::SameLine();
|
||||
std::ostringstream marker_stream;
|
||||
marker_stream << i;
|
||||
ImGui::SliderFloat(
|
||||
marker_stream.str().c_str(),
|
||||
&m_sync_markers[i],
|
||||
0.f,
|
||||
1.f);
|
||||
}
|
||||
|
||||
if (ImGui::Button ("Update Intervals")) {
|
||||
CalcIntervals();
|
||||
}
|
||||
}
|
|
@ -150,8 +150,6 @@ struct SyncTrack {
|
|||
|
||||
return result;
|
||||
}
|
||||
|
||||
void DrawDebugUi();
|
||||
};
|
||||
|
||||
#endif //ANIMTESTBED_SYNCTRACK_H
|
||||
|
|
|
@ -669,9 +669,9 @@ int main() {
|
|||
ImVec2 skinned_mesh_widget_size = ImGui::GetWindowSize();
|
||||
gApplicationConfig.skinned_mesh_widget.size[0] = skinned_mesh_widget_size.x;
|
||||
gApplicationConfig.skinned_mesh_widget.size[1] = skinned_mesh_widget_size.y;
|
||||
|
||||
skinned_mesh.DrawDebugUi();
|
||||
|
||||
|
||||
SkinnedMeshWidget(&skinned_mesh);
|
||||
|
||||
ImGui::End();
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue