This document is about: QUANTUM 1
SWITCH TO

An Example of How to Use Frame.User.cs

Article was written against Quantum version 1.2.3RC3

InitUser() and FreeUser() allows you to save your own custom data into the frame.

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Quantum {
  unsafe partial class Frame {

    BehaviourTreeFrameData _behaviourTreeFrameData;

    public FrameUserContext FrameUserContext {
      get {
        return Context as FrameUserContext;
      }
    }

    public BehaviourTreeFrameData BehaviourTreeFrameData {
      get {
        return _behaviourTreeFrameData;
      }
    }

    partial void InitUser() {

      var allEntities = GetAllEntitiesUnsafe();
      for (Int32 i = 0; i < allEntities.Length; ++i) {
        var e = allEntities[i];
        var bt = Entity.GetBehaviourTree(e.Entity);
        if (bt != null) {
          // Reserve memory for any blackboard
          bt->BlackboardDataOffsets = _behaviourTreeFrameData.Sizes;
          _behaviourTreeFrameData.Sizes.Add(BTBlackboard.MaxDataSize);

          // Reserve memory for any tree and it's node that save data on the state
          bt->NodeDataOffsets = _behaviourTreeFrameData.Sizes;
          _behaviourTreeFrameData.Sizes.Add(BTRoot.MaxDataSize);
        }
      }

      if (_behaviourTreeFrameData.Sizes.GenericData > 0)
        _behaviourTreeFrameData.Data = (Byte*)Native.Alloc(_behaviourTreeFrameData.Sizes.GenericData);

      if (_behaviourTreeFrameData.Sizes.Bytes > 0)
        _behaviourTreeFrameData.Bytes = (Byte*)Native.Alloc(_behaviourTreeFrameData.Sizes.Bytes);
    }

    partial void FreeUser() {
      if (_behaviourTreeFrameData.Bytes != null)
        Native.Free(new IntPtr(_behaviourTreeFrameData.Bytes));
      if (_behaviourTreeFrameData.Data != null)
        Native.Free(new IntPtr(_behaviourTreeFrameData.Data));
    }

    partial void AllocUser() {
      _behaviourTreeFrameData = new BehaviourTreeFrameData();
    }

    partial void CopyFromUser(Frame frame) {
      _behaviourTreeFrameData.Sizes = frame._behaviourTreeFrameData.Sizes;
      if (frame._behaviourTreeFrameData.Bytes != null)
        Native.Copy(_behaviourTreeFrameData.Bytes, frame._behaviourTreeFrameData.Bytes, (ulong)frame._behaviourTreeFrameData.Sizes.Bytes);
      if (frame._behaviourTreeFrameData.Data != null)
        Native.Copy(_behaviourTreeFrameData.Data, frame._behaviourTreeFrameData.Data, (ulong)frame._behaviourTreeFrameData.Sizes.GenericData);
    }
  }
}
Back to top