Browse Source

Skeletal animation up and running

BearishSun 9 years ago
parent
commit
c8f410651d

+ 9 - 4
Source/BansheeCore/Source/BsAnimation.cpp

@@ -91,6 +91,9 @@ namespace BansheeEngine
 		// All the memory is part of the same buffer, so we only need to free the first element
 		bs_free(layers);
 		layers = nullptr;
+		genericCurveOutputs = nullptr;
+
+		numLayers = 0;
 	}
 
 	void AnimationProxy::rebuild(const SPtr<Skeleton>& skeleton, Vector<AnimationClipInfo>& clipInfos)
@@ -162,7 +165,7 @@ namespace BansheeEngine
 				return x.index < y.index;
 			});
 
-			UINT32 numLayers = (UINT32)tempLayers.size();
+			numLayers = (UINT32)tempLayers.size();
 			UINT32 numClips = (UINT32)clipInfos.size();
 			UINT32 numBones;
 			
@@ -246,8 +249,10 @@ namespace BansheeEngine
 			UINT32 curLayerIdx = 0;
 			UINT32 curStateIdx = 0;
 
-			for(auto& layer : tempLayers)
+			for(UINT32 i = 0; i < numLayers; i++)
 			{
+				AnimationStateLayer& layer = layers[i];
+
 				layer.states = &states[curStateIdx];
 				layer.numStates = 0;
 
@@ -514,11 +519,11 @@ namespace BansheeEngine
 			else
 			{
 				start = mid + 1;
-				searchLength -= half - 1;
+				searchLength -= (half + 1);
 			}
 		}
 
-		leftKey = start - 1;
+		leftKey = std::max(0, start - 1);
 		rightKey = std::min(start, (INT32)info.numClips - 1);
 
 		float interpLength = info.clips[rightKey].position - info.clips[leftKey].position;

+ 2 - 2
Source/BansheeCore/Source/BsAnimationCurve.cpp

@@ -383,11 +383,11 @@ namespace BansheeEngine
 			else
 			{
 				start = mid + 1;
-				searchLength -= half - 1;
+				searchLength -= (half + 1);
 			}
 		}
 
-		leftKey = start - 1;
+		leftKey = std::max(0, start - 1);
 		rightKey = std::min(start, (INT32)mKeyframes.size() - 1);
 	}
 

+ 2 - 2
Source/BansheeUtility/Include/BsMath.h

@@ -660,7 +660,7 @@ namespace BansheeEngine
 			coefficients[0] = 2 * diff + tangentA + tangentB;
 			coefficients[1] = -3 * diff - 2 * tangentA - tangentB;
 			coefficients[2] = tangentA;
-			coefficients[4] = pointA;
+			coefficients[3] = pointA;
 		}
 
 		/**
@@ -690,7 +690,7 @@ namespace BansheeEngine
 			coefficients[0] = (2 * diff + scaledTangentA + scaledTangentB) * invLength3;
 			coefficients[1] = (-3 * diff - 2 * scaledTangentA - scaledTangentB) * invLength2;
 			coefficients[2] = tangentA;
-			coefficients[4] = pointA;
+			coefficients[3] = pointA;
 		}
 
         static const float POS_INFINITY;

+ 17 - 7
Source/RenderBeast/Source/BsRenderBeast.cpp

@@ -825,7 +825,7 @@ namespace BansheeEngine
 	{
 		THROW_IF_NOT_CORE_THREAD;
 
-		RenderAPICore& rs = RenderAPICore::instance();
+		RenderAPICore& rapi = RenderAPICore::instance();
 
 		struct StageData
 		{
@@ -864,15 +864,15 @@ namespace BansheeEngine
 					samplerState = params->getSamplerState(iter->second.slot);
 
 				if (samplerState == nullptr)
-					rs.setSamplerState(stage.type, iter->second.slot, SamplerStateCore::getDefault());
+					rapi.setSamplerState(stage.type, iter->second.slot, SamplerStateCore::getDefault());
 				else
-					rs.setSamplerState(stage.type, iter->second.slot, samplerState);
+					rapi.setSamplerState(stage.type, iter->second.slot, samplerState);
 			}
 
 			for (auto iter = paramDesc.textures.begin(); iter != paramDesc.textures.end(); ++iter)
 			{
 				SPtr<TextureCore> texture = params->getTexture(iter->second.slot);
-				rs.setTexture(stage.type, iter->second.slot, texture);
+				rapi.setTexture(stage.type, iter->second.slot, texture);
 			}
 
 			for (auto iter = paramDesc.loadStoreTextures.begin(); iter != paramDesc.loadStoreTextures.end(); ++iter)
@@ -881,9 +881,19 @@ namespace BansheeEngine
 				const TextureSurface& surface = params->getLoadStoreSurface(iter->second.slot);
 
 				if (texture == nullptr)
-					rs.setLoadStoreTexture(stage.type, iter->second.slot, false, nullptr, surface);
+					rapi.setLoadStoreTexture(stage.type, iter->second.slot, false, nullptr, surface);
 				else
-					rs.setLoadStoreTexture(stage.type, iter->second.slot, true, texture, surface);
+					rapi.setLoadStoreTexture(stage.type, iter->second.slot, true, texture, surface);
+			}
+
+			for (auto iter = paramDesc.buffers.begin(); iter != paramDesc.buffers.end(); ++iter)
+			{
+				SPtr<GpuBufferCore> buffer = params->getBuffer(iter->second.slot);
+
+				bool isLoadStore = iter->second.type != GPOT_BYTE_BUFFER &&
+					iter->second.type != GPOT_STRUCTURED_BUFFER;
+
+				rapi.setBuffer(stage.type, iter->second.slot, buffer, isLoadStore);
 			}
 
 			for (auto iter = paramDesc.paramBlocks.begin(); iter != paramDesc.paramBlocks.end(); ++iter)
@@ -891,7 +901,7 @@ namespace BansheeEngine
 				SPtr<GpuParamBlockBufferCore> blockBuffer = params->getParamBlockBuffer(iter->second.slot);
 				blockBuffer->flushToGPU();
 
-				rs.setParamBuffer(stage.type, iter->second.slot, blockBuffer, paramDesc);
+				rapi.setParamBuffer(stage.type, iter->second.slot, blockBuffer, paramDesc);
 			}
 		}
 	}