예제 #1
0
 private void StartBonePoseCalculation(MmdPose pose, double stepLength = 1 / 60.0f)
 {
     if (PhysicsMode != PhysicsModeEnum.Bullet || _model == null || _physicsReactor == null)
     {
         return;
     }
     _bonePosePreCalculator =
         new BonePosePreCalculator(pose, _poser, _physicsReactor, stepLength, 0.0, PhysicsCacheFrameSize, AutoPhysicsStepLength);
     _bonePosePreCalculator.Start();
 }
예제 #2
0
        private void SetPoseToPoser(MmdPose pose, Poser poser)
        {
            var nameToIndex = BuildBoneNameToIndexDictionary(poser.Model);

            foreach (var entry in pose.BonePoses)
            {
                var name     = entry.Key;
                var bonePose = entry.Value;
                int index;
                if (!nameToIndex.TryGetValue(name, out index))
                {
                    continue;
                }
                poser.SetBonePose(index, bonePose);
            }
        }
예제 #3
0
        private static bool ReadBonePose(TextReader reader, MmdPose ret)
        {
            var boneName = ReadBoneName(reader);

            if (boneName == null)
            {
                return(false);
            }
            var bonePosition   = ReadBonePosition(reader);
            var boneQuaternion = ReadBoneQuaternion(reader);

            ReadBonePoseEnd(reader);
            ret.BonePoses.Add(boneName, new BonePose {
                Translation = bonePosition, Rotation = boneQuaternion
            });
            return(true);
        }
예제 #4
0
        public static MmdPose Read(string path)
        {
            var reader = new StreamReader(path, Tools.JapaneseEncoding);
            var ret    = new MmdPose();

            ReadMagic(reader);
            ret.ModelName = ReadModelName(reader);
            ReadBoneCount(reader);
            while (true)
            {
                if (!ReadBonePose(reader, ret))
                {
                    break;
                }
            }
            return(ret);
        }
예제 #5
0
        public BonePosePreCalculator(MmdPose pose, Poser poser, BulletPyhsicsReactor physicsReactor, double stepLength, double startTimePos, int frameCacheSize, bool autoStepLength)
        {
            _poseMode            = true;
            _poser               = poser;
            _physicsReactor      = physicsReactor;
            _stepLength          = stepLength;
            _bonePoseImagesStore = new BlockingQueue <BonePoseFrame>(frameCacheSize);
            _timePos             = startTimePos;
            _autoStepLength      = autoStepLength;

            poser.ResetPosing();
            SetPoseToPoser(pose, _poser);
            _poser.PrePhysicsPosing();
            _physicsReactor.Reset();
            _poser.PostPhysicsPosing();
            var image = GetBonePoseImage(_poser);

            _bonePoseImagesStore.Enqueue(new BonePoseFrame(startTimePos, image));
        }
예제 #6
0
        public BonePosePreCalculator(BonePoseCalculatorWorker worker, MmdPose pose, Poser poser, BulletPyhsicsReactor physicsReactor, float stepLength, float startTimePos, int frameCacheSize, bool autoStepLength)
        {
            _poseMode            = true;
            _poser               = poser;
            _physicsReactor      = physicsReactor;
            _stepLength          = stepLength;
            _bonePoseImagesStore = new SynchronizedQueue <BonePoseFrame>();
            _timePos             = startTimePos;
            _autoStepLength      = autoStepLength;
            _frameCacheSize      = frameCacheSize;
            poser.ResetPosing();
            SetPoseToPoser(pose, _poser);
            _poser.PrePhysicsPosing();
            _physicsReactor.Reset();
            _poser.PostPhysicsPosing();
            var image = GetBonePoseImage(_poser);

            _bonePoseImagesStore.Enqueue(new BonePoseFrame(startTimePos, image));
            _worker = worker;
        }
예제 #7
0
 private void RestartBonePoseCalculation(MmdPose pose, double stepLength = 1 / 60.0f)
 {
     StopBonePoseCalculation();
     StartBonePoseCalculation(pose, stepLength);
 }