| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
- //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
- using System;
- using BansheeEngine;
- namespace BansheeEditor
- {
- /** @addtogroup AnimationEditor
- * @{
- */
- internal enum GUITickStepType
- {
- Time,
- Generic
- }
- // TODO DOC
- internal class GUITicks
- {
- private int pixelRange = 100;
- private float valueRangeStart = 0.0f;
- private float valueRangeEnd = 1.0f;
- private int minTickSpacingPx = 5;
- private int maxTickSpacingPx = 30;
- private float[] validSteps = new [] { 1.0f };
- private float[] levelStrengths = new[] { 1.0f };
- private int numLevels = 1;
- private int maxLevel = 0;
- public int NumLevels { get { return numLevels; } }
- internal GUITicks(GUITickStepType stepType = GUITickStepType.Generic)
- {
- if(stepType == GUITickStepType.Generic)
- SetGenericSteps();
- else
- SetTimeSteps();
- Rebuild();
- }
- internal void SetRange(float valueRangeStart, float valueRangeEnd, int pixelRange)
- {
- this.valueRangeStart = valueRangeStart;
- this.valueRangeEnd = valueRangeEnd;
- this.pixelRange = pixelRange;
- Rebuild();
- }
- internal void SetTickSpacing(int minPx, int maxPx)
- {
- minTickSpacingPx = minPx;
- maxTickSpacingPx = maxPx;
- Rebuild();
- }
- internal float GetLevelStrength(int level)
- {
- if (level < 0 || level >= numLevels)
- return 0.0f;
- return levelStrengths[maxLevel + level];
- }
- internal float[] GetTicks(int level)
- {
- if (level < 0 || level >= numLevels)
- return new float[0];
- float step = validSteps[maxLevel + level];
- // Round up and down so we get one extra tick on either side (outside of value range)
- int startTick = MathEx.FloorToInt(valueRangeStart / step);
- int endTick = MathEx.CeilToInt(valueRangeEnd / step);
- int numTicks = endTick - startTick + 1;
- float[] ticks = new float[numTicks];
- for (int i = startTick; i <= endTick; i++)
- ticks[i - startTick] = i*step;
- return ticks;
- }
- private void Rebuild()
- {
- levelStrengths = new float[validSteps.Length];
- maxLevel = 0;
- float valueRange = valueRangeEnd - valueRangeStart;
- int tickSpacing = maxTickSpacingPx - minTickSpacingPx;
- int i = 0;
- for (; i < validSteps.Length; i++)
- {
- float tickSpacingPx = (validSteps[i]/valueRange) * pixelRange;
- levelStrengths[i] = (tickSpacingPx - minTickSpacingPx)/tickSpacing;
- if (levelStrengths[i] > 1.0f)
- maxLevel = i;
- else if (levelStrengths[i] < 0.0f)
- break;
- }
- if (i > 0)
- numLevels = i - maxLevel;
- else
- numLevels = 0;
- }
- private void SetTimeSteps()
- {
- validSteps = new float[]
- {
- 3600.0f, 1800.0f, 600.0f, 300.0f,
- 60.0f, 30.0f, 10.0f, 5.0f,
- 1.0f, 0.5f, 0.25f, 0.1f, 0.05f, 0.01f
- };
- }
- private void SetGenericSteps()
- {
- float minStep = 0.0000001f;
- int numSteps = 15;
- validSteps = new float[15 * 2];
- for (int i = numSteps - 1; i >= 0; i--)
- {
- validSteps[i * 2 + 1] = minStep;
- validSteps[i * 2 + 0] = minStep * 5;
- minStep *= 10.0f;
- }
- }
- }
- /** @} */
- }
|