/* ----------------------------------------------------------------------------
 * This file was automatically generated by SWIG (http://www.swig.org).
 * Version 2.0.1
 *
 * Do not make changes to this file unless you know what you are doing--modify
 * the SWIG interface file instead.
 * ----------------------------------------------------------------------------- */


using System;
using System.Runtime.InteropServices;

public class aiMatrix4x4 : IDisposable {
  private HandleRef swigCPtr;
  protected bool swigCMemOwn;

  internal aiMatrix4x4(IntPtr cPtr, bool cMemoryOwn) {
    swigCMemOwn = cMemoryOwn;
    swigCPtr = new HandleRef(this, cPtr);
  }

  internal static HandleRef getCPtr(aiMatrix4x4 obj) {
    return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr;
  }

  ~aiMatrix4x4() {
    Dispose();
  }

  public virtual void Dispose() {
    lock(this) {
      if (swigCPtr.Handle != IntPtr.Zero) {
        if (swigCMemOwn) {
          swigCMemOwn = false;
          AssimpPINVOKE.delete_aiMatrix4x4(swigCPtr);
        }
        swigCPtr = new HandleRef(null, IntPtr.Zero);
      }
      GC.SuppressFinalize(this);
    }
  }

  public aiMatrix4x4() : this(AssimpPINVOKE.new_aiMatrix4x4__SWIG_0(), true) {
  }

  public aiMatrix4x4(float _a1, float _a2, float _a3, float _a4, float _b1, float _b2, float _b3, float _b4, float _c1, float _c2, float _c3, float _c4, float _d1, float _d2, float _d3, float _d4) : this(AssimpPINVOKE.new_aiMatrix4x4__SWIG_1(_a1, _a2, _a3, _a4, _b1, _b2, _b3, _b4, _c1, _c2, _c3, _c4, _d1, _d2, _d3, _d4), true) {
  }

  public aiMatrix4x4(aiMatrix3x3 m) : this(AssimpPINVOKE.new_aiMatrix4x4__SWIG_2(aiMatrix3x3.getCPtr(m)), true) {
    if (AssimpPINVOKE.SWIGPendingException.Pending) throw AssimpPINVOKE.SWIGPendingException.Retrieve();
  }

  public aiMatrix4x4 Transpose() {
    aiMatrix4x4 ret = new aiMatrix4x4(AssimpPINVOKE.aiMatrix4x4_Transpose(swigCPtr), false);
    return ret;
  }

  public aiMatrix4x4 Inverse() {
    aiMatrix4x4 ret = new aiMatrix4x4(AssimpPINVOKE.aiMatrix4x4_Inverse(swigCPtr), false);
    return ret;
  }

  public float Determinant() {
    float ret = AssimpPINVOKE.aiMatrix4x4_Determinant(swigCPtr);
    return ret;
  }

  public bool IsIdentity() {
    bool ret = AssimpPINVOKE.aiMatrix4x4_IsIdentity(swigCPtr);
    return ret;
  }

  public void Decompose(aiVector3D scaling, aiQuaternion rotation, aiVector3D position) {
    AssimpPINVOKE.aiMatrix4x4_Decompose(swigCPtr, aiVector3D.getCPtr(scaling), aiQuaternion.getCPtr(rotation), aiVector3D.getCPtr(position));
    if (AssimpPINVOKE.SWIGPendingException.Pending) throw AssimpPINVOKE.SWIGPendingException.Retrieve();
  }

  public void DecomposeNoScaling(aiQuaternion rotation, aiVector3D position) {
    AssimpPINVOKE.aiMatrix4x4_DecomposeNoScaling(swigCPtr, aiQuaternion.getCPtr(rotation), aiVector3D.getCPtr(position));
    if (AssimpPINVOKE.SWIGPendingException.Pending) throw AssimpPINVOKE.SWIGPendingException.Retrieve();
  }

  public aiMatrix4x4 FromEulerAnglesXYZ(float x, float y, float z) {
    aiMatrix4x4 ret = new aiMatrix4x4(AssimpPINVOKE.aiMatrix4x4_FromEulerAnglesXYZ__SWIG_0(swigCPtr, x, y, z), false);
    return ret;
  }

  public aiMatrix4x4 FromEulerAnglesXYZ(aiVector3D blubb) {
    aiMatrix4x4 ret = new aiMatrix4x4(AssimpPINVOKE.aiMatrix4x4_FromEulerAnglesXYZ__SWIG_1(swigCPtr, aiVector3D.getCPtr(blubb)), false);
    if (AssimpPINVOKE.SWIGPendingException.Pending) throw AssimpPINVOKE.SWIGPendingException.Retrieve();
    return ret;
  }

  public static aiMatrix4x4 RotationX(float a, aiMatrix4x4 arg1) {
    aiMatrix4x4 ret = new aiMatrix4x4(AssimpPINVOKE.aiMatrix4x4_RotationX(a, aiMatrix4x4.getCPtr(arg1)), false);
    if (AssimpPINVOKE.SWIGPendingException.Pending) throw AssimpPINVOKE.SWIGPendingException.Retrieve();
    return ret;
  }

  public static aiMatrix4x4 RotationY(float a, aiMatrix4x4 arg1) {
    aiMatrix4x4 ret = new aiMatrix4x4(AssimpPINVOKE.aiMatrix4x4_RotationY(a, aiMatrix4x4.getCPtr(arg1)), false);
    if (AssimpPINVOKE.SWIGPendingException.Pending) throw AssimpPINVOKE.SWIGPendingException.Retrieve();
    return ret;
  }

  public static aiMatrix4x4 RotationZ(float a, aiMatrix4x4 arg1) {
    aiMatrix4x4 ret = new aiMatrix4x4(AssimpPINVOKE.aiMatrix4x4_RotationZ(a, aiMatrix4x4.getCPtr(arg1)), false);
    if (AssimpPINVOKE.SWIGPendingException.Pending) throw AssimpPINVOKE.SWIGPendingException.Retrieve();
    return ret;
  }

  public static aiMatrix4x4 Rotation(float a, aiVector3D axis, aiMatrix4x4 arg2) {
    aiMatrix4x4 ret = new aiMatrix4x4(AssimpPINVOKE.aiMatrix4x4_Rotation(a, aiVector3D.getCPtr(axis), aiMatrix4x4.getCPtr(arg2)), false);
    if (AssimpPINVOKE.SWIGPendingException.Pending) throw AssimpPINVOKE.SWIGPendingException.Retrieve();
    return ret;
  }

  public static aiMatrix4x4 Translation(aiVector3D v, aiMatrix4x4 arg1) {
    aiMatrix4x4 ret = new aiMatrix4x4(AssimpPINVOKE.aiMatrix4x4_Translation(aiVector3D.getCPtr(v), aiMatrix4x4.getCPtr(arg1)), false);
    if (AssimpPINVOKE.SWIGPendingException.Pending) throw AssimpPINVOKE.SWIGPendingException.Retrieve();
    return ret;
  }

  public static aiMatrix4x4 Scaling(aiVector3D v, aiMatrix4x4 arg1) {
    aiMatrix4x4 ret = new aiMatrix4x4(AssimpPINVOKE.aiMatrix4x4_Scaling(aiVector3D.getCPtr(v), aiMatrix4x4.getCPtr(arg1)), false);
    if (AssimpPINVOKE.SWIGPendingException.Pending) throw AssimpPINVOKE.SWIGPendingException.Retrieve();
    return ret;
  }

  public static aiMatrix4x4 FromToMatrix(aiVector3D from, aiVector3D to, aiMatrix4x4 arg2) {
    aiMatrix4x4 ret = new aiMatrix4x4(AssimpPINVOKE.aiMatrix4x4_FromToMatrix(aiVector3D.getCPtr(from), aiVector3D.getCPtr(to), aiMatrix4x4.getCPtr(arg2)), false);
    if (AssimpPINVOKE.SWIGPendingException.Pending) throw AssimpPINVOKE.SWIGPendingException.Retrieve();
    return ret;
  }

  public float a1 {
    set {
      AssimpPINVOKE.aiMatrix4x4_a1_set(swigCPtr, value);
    } 
    get {
      float ret = AssimpPINVOKE.aiMatrix4x4_a1_get(swigCPtr);
      return ret;
    } 
  }

  public float a2 {
    set {
      AssimpPINVOKE.aiMatrix4x4_a2_set(swigCPtr, value);
    } 
    get {
      float ret = AssimpPINVOKE.aiMatrix4x4_a2_get(swigCPtr);
      return ret;
    } 
  }

  public float a3 {
    set {
      AssimpPINVOKE.aiMatrix4x4_a3_set(swigCPtr, value);
    } 
    get {
      float ret = AssimpPINVOKE.aiMatrix4x4_a3_get(swigCPtr);
      return ret;
    } 
  }

  public float a4 {
    set {
      AssimpPINVOKE.aiMatrix4x4_a4_set(swigCPtr, value);
    } 
    get {
      float ret = AssimpPINVOKE.aiMatrix4x4_a4_get(swigCPtr);
      return ret;
    } 
  }

  public float b1 {
    set {
      AssimpPINVOKE.aiMatrix4x4_b1_set(swigCPtr, value);
    } 
    get {
      float ret = AssimpPINVOKE.aiMatrix4x4_b1_get(swigCPtr);
      return ret;
    } 
  }

  public float b2 {
    set {
      AssimpPINVOKE.aiMatrix4x4_b2_set(swigCPtr, value);
    } 
    get {
      float ret = AssimpPINVOKE.aiMatrix4x4_b2_get(swigCPtr);
      return ret;
    } 
  }

  public float b3 {
    set {
      AssimpPINVOKE.aiMatrix4x4_b3_set(swigCPtr, value);
    } 
    get {
      float ret = AssimpPINVOKE.aiMatrix4x4_b3_get(swigCPtr);
      return ret;
    } 
  }

  public float b4 {
    set {
      AssimpPINVOKE.aiMatrix4x4_b4_set(swigCPtr, value);
    } 
    get {
      float ret = AssimpPINVOKE.aiMatrix4x4_b4_get(swigCPtr);
      return ret;
    } 
  }

  public float c1 {
    set {
      AssimpPINVOKE.aiMatrix4x4_c1_set(swigCPtr, value);
    } 
    get {
      float ret = AssimpPINVOKE.aiMatrix4x4_c1_get(swigCPtr);
      return ret;
    } 
  }

  public float c2 {
    set {
      AssimpPINVOKE.aiMatrix4x4_c2_set(swigCPtr, value);
    } 
    get {
      float ret = AssimpPINVOKE.aiMatrix4x4_c2_get(swigCPtr);
      return ret;
    } 
  }

  public float c3 {
    set {
      AssimpPINVOKE.aiMatrix4x4_c3_set(swigCPtr, value);
    } 
    get {
      float ret = AssimpPINVOKE.aiMatrix4x4_c3_get(swigCPtr);
      return ret;
    } 
  }

  public float c4 {
    set {
      AssimpPINVOKE.aiMatrix4x4_c4_set(swigCPtr, value);
    } 
    get {
      float ret = AssimpPINVOKE.aiMatrix4x4_c4_get(swigCPtr);
      return ret;
    } 
  }

  public float d1 {
    set {
      AssimpPINVOKE.aiMatrix4x4_d1_set(swigCPtr, value);
    } 
    get {
      float ret = AssimpPINVOKE.aiMatrix4x4_d1_get(swigCPtr);
      return ret;
    } 
  }

  public float d2 {
    set {
      AssimpPINVOKE.aiMatrix4x4_d2_set(swigCPtr, value);
    } 
    get {
      float ret = AssimpPINVOKE.aiMatrix4x4_d2_get(swigCPtr);
      return ret;
    } 
  }

  public float d3 {
    set {
      AssimpPINVOKE.aiMatrix4x4_d3_set(swigCPtr, value);
    } 
    get {
      float ret = AssimpPINVOKE.aiMatrix4x4_d3_get(swigCPtr);
      return ret;
    } 
  }

  public float d4 {
    set {
      AssimpPINVOKE.aiMatrix4x4_d4_set(swigCPtr, value);
    } 
    get {
      float ret = AssimpPINVOKE.aiMatrix4x4_d4_get(swigCPtr);
      return ret;
    } 
  }

}
