Quellcode durchsuchen

Foundation for Skeleton

BearishSun vor 9 Jahren
Ursprung
Commit
f0a1cdd41d
2 geänderte Dateien mit 109 neuen und 0 gelöschten Zeilen
  1. 67 0
      Source/BansheeCore/Include/BsSkeleton.h
  2. 42 0
      Source/BansheeCore/Source/BsSkeleton.cpp

+ 67 - 0
Source/BansheeCore/Include/BsSkeleton.h

@@ -1 +1,68 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
 #pragma once
+
+#include "BsCorePrerequisites.h"
+#include "BsMatrix4.h"
+
+namespace BansheeEngine
+{
+	/** @addtogroup Animation-Internal
+	 *  @{
+	 */
+
+	struct BONE_DESC
+	{
+		String name;
+		UINT32 parent;
+
+		Matrix4 invBindPose;
+	};
+
+	struct ANIMATION_STATE_DESC
+	{
+		const AnimationClip* clip;
+		float weight;
+		float speed;
+		bool loop;
+		UINT8 layer;
+	};
+
+	struct SkeletonPose
+	{
+		SkeletonPose(UINT32 numBones)
+			:numBones(numBones), bonePoses(bs_newN<Matrix4>(numBones))
+		{}
+
+		~SkeletonPose()
+		{
+			bs_deleteN(bonePoses, numBones);
+		}
+
+		Matrix4* bonePoses;
+		UINT32 numBones;
+	};
+
+	class Skeleton
+	{
+	public:
+		Skeleton(BONE_DESC* bones, UINT32 numBones);
+		~Skeleton();
+
+		void getPose(SkeletonPose& pose, const AnimationClip& clip, float time, bool loop = true);
+		void getPose(SkeletonPose& pose, const ANIMATION_STATE_DESC* states, UINT32 numStates, float time);
+
+	private:
+		struct BoneInfo
+		{
+			String name;
+			UINT32 parent;
+		};
+
+		UINT32 mNumBones;
+		Matrix4* mBindPoses;
+		BoneInfo* mBoneInfo;
+	};
+
+	/** @} */
+}

+ 42 - 0
Source/BansheeCore/Source/BsSkeleton.cpp

@@ -0,0 +1,42 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#include "BsSkeleton.h"
+
+namespace BansheeEngine
+{
+	Skeleton::Skeleton(BONE_DESC* bones, UINT32 numBones)
+		:mBindPoses(bs_newN<Matrix4>(numBones)), mBoneInfo(bs_newN<BoneInfo>(numBones)), mNumBones(numBones)
+	{
+		for(UINT32 i = 0; i < numBones; i++)
+		{
+			mBindPoses[i] = bones[i].invBindPose;
+			mBoneInfo[i].name = bones[i].name;
+			mBoneInfo[i].parent = bones[i].parent;
+		}
+	}
+
+	Skeleton::~Skeleton()
+	{
+		bs_deleteN(mBindPoses, mNumBones);
+		bs_deleteN(mBoneInfo, mNumBones);
+	}
+
+	void Skeleton::getPose(SkeletonPose& pose, const AnimationClip& clip, float time, bool loop)
+	{
+		ANIMATION_STATE_DESC state;
+		state.clip = &clip;
+		state.layer = 0;
+		state.loop = loop;
+		state.speed = 1.0f;
+		state.weight = 1.0f;
+
+		getPose(pose, &state, 1, time);
+	}
+
+	void Skeleton::getPose(SkeletonPose& pose, const ANIMATION_STATE_DESC* states, UINT32 numStates, float time)
+	{
+		// TODO -Blend locally, normalize all weights to 1, layers for additive animations
+
+		// TODO
+	}
+}