-- GENERATED by C->Haskell Compiler, version 0.28.1 Switcheroo, 1 April 2016 (Haskell)
-- Edit the ORIGNAL .chs file instead!


{-# LINE 1 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE AllowAmbiguousTypes, ScopedTypeVariables, GADTs #-}
{-# LANGUAGE UnboxedTuples, MagicHash #-}
{-# LANGUAGE PatternSynonyms, RecordWildCards #-}
{-# OPTIONS_GHC -Wno-name-shadowing #-}
module Godot.Gdnative.Internal.Gdnative where
import qualified Foreign.C.Types as C2HSImp
import qualified Foreign.ForeignPtr as C2HSImp
import qualified Foreign.Marshal.Utils as C2HSImp
import qualified Foreign.Ptr as C2HSImp
import qualified Foreign.Storable as C2HSImp



import Control.Exception
import Control.Monad
import Data.Bits
import Data.Coerce
import Data.IORef
import Foreign
import Foreign.C
import System.IO.Unsafe




data GodotError = GodotOk
                | GodotFailed
                | GodotErrUnavailable
                | GodotErrUnconfigured
                | GodotErrUnauthorized
                | GodotErrParameterRangeError
                | GodotErrOutOfMemory
                | GodotErrFileNotFound
                | GodotErrFileBadDrive
                | GodotErrFileBadPath
                | GodotErrFileNoPermission
                | GodotErrFileAlreadyInUse
                | GodotErrFileCantOpen
                | GodotErrFileCantWrite
                | GodotErrFileCantRead
                | GodotErrFileUnrecognized
                | GodotErrFileCorrupt
                | GodotErrFileMissingDependencies
                | GodotErrFileEof
                | GodotErrCantOpen
                | GodotErrCantCreate
                | GodotErrQueryFailed
                | GodotErrAlreadyInUse
                | GodotErrLocked
                | GodotErrTimeout
                | GodotErrCantConnect
                | GodotErrCantResolve
                | GodotErrConnectionError
                | GodotErrCantAcquireResource
                | GodotErrCantFork
                | GodotErrInvalidData
                | GodotErrInvalidParameter
                | GodotErrAlreadyExists
                | GodotErrDoesNotExist
                | GodotErrDatabaseCantRead
                | GodotErrDatabaseCantWrite
                | GodotErrCompilationFailed
                | GodotErrMethodNotFound
                | GodotErrLinkFailed
                | GodotErrScriptFailed
                | GodotErrCyclicLink
                | GodotErrInvalidDeclaration
                | GodotErrDuplicateSymbol
                | GodotErrParseError
                | GodotErrBusy
                | GodotErrSkip
                | GodotErrHelp
                | GodotErrBug
                | GodotErrPrinterOnFire
  deriving (Enum,Show,Eq,Ord,Bounded)

{-# LINE 21 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}


data GodotVariantType = GodotVariantTypeNil
                      | GodotVariantTypeBool
                      | GodotVariantTypeInt
                      | GodotVariantTypeReal
                      | GodotVariantTypeString
                      | GodotVariantTypeVector2
                      | GodotVariantTypeRect2
                      | GodotVariantTypeVector3
                      | GodotVariantTypeTransform2d
                      | GodotVariantTypePlane
                      | GodotVariantTypeQuat
                      | GodotVariantTypeAabb
                      | GodotVariantTypeBasis
                      | GodotVariantTypeTransform
                      | GodotVariantTypeColor
                      | GodotVariantTypeNodePath
                      | GodotVariantTypeRid
                      | GodotVariantTypeObject
                      | GodotVariantTypeDictionary
                      | GodotVariantTypeArray
                      | GodotVariantTypePoolByteArray
                      | GodotVariantTypePoolIntArray
                      | GodotVariantTypePoolRealArray
                      | GodotVariantTypePoolStringArray
                      | GodotVariantTypePoolVector2Array
                      | GodotVariantTypePoolVector3Array
                      | GodotVariantTypePoolColorArray
  deriving (Enum,Show,Eq,Ord,Bounded)

{-# LINE 24 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}


data GodotVariantCallErrorError = GodotCallErrorCallOk
                                | GodotCallErrorCallErrorInvalidMethod
                                | GodotCallErrorCallErrorInvalidArgument
                                | GodotCallErrorCallErrorTooManyArguments
                                | GodotCallErrorCallErrorTooFewArguments
                                | GodotCallErrorCallErrorInstanceIsNull
  deriving (Enum,Show,Eq,Ord,Bounded)

{-# LINE 27 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}


data GodotVector3Axis = GodotVector3AxisX
                      | GodotVector3AxisY
                      | GodotVector3AxisZ
  deriving (Enum,Show,Eq,Ord,Bounded)

{-# LINE 30 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}


data GodotVariantOperator = GodotVariantOpEqual
                          | GodotVariantOpNotEqual
                          | GodotVariantOpLess
                          | GodotVariantOpLessEqual
                          | GodotVariantOpGreater
                          | GodotVariantOpGreaterEqual
                          | GodotVariantOpAdd
                          | GodotVariantOpSubtract
                          | GodotVariantOpMultiply
                          | GodotVariantOpDivide
                          | GodotVariantOpNegate
                          | GodotVariantOpPositive
                          | GodotVariantOpModule
                          | GodotVariantOpStringConcat
                          | GodotVariantOpShiftLeft
                          | GodotVariantOpShiftRight
                          | GodotVariantOpBitAnd
                          | GodotVariantOpBitOr
                          | GodotVariantOpBitXor
                          | GodotVariantOpBitNegate
                          | GodotVariantOpAnd
                          | GodotVariantOpOr
                          | GodotVariantOpXor
                          | GodotVariantOpNot
                          | GodotVariantOpIn
                          | GodotVariantOpMax
  deriving (Enum,Show,Eq,Ord,Bounded)

{-# LINE 33 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}



{-# LINE 35 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

type GodotBool = (C2HSImp.CInt{-bool-})
{-# LINE 36 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}


{-# LINE 37 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

type GodotInt = (C2HSImp.CInt)
{-# LINE 38 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}


{-# LINE 39 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

type GodotReal = (C2HSImp.CFloat)
{-# LINE 40 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}


{-# LINE 41 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

type GodotCharType = (C2HSImp.CInt)
{-# LINE 42 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}


newtype GodotAabb = GodotAabb (C2HSImp.ForeignPtr (GodotAabb))
withGodotAabb :: GodotAabb -> (C2HSImp.Ptr GodotAabb -> IO b) -> IO b
withGodotAabb (GodotAabb fptr) = C2HSImp.withForeignPtr fptr
{-# LINE 44 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Eq GodotAabb

newtype GodotArray = GodotArray (C2HSImp.ForeignPtr (GodotArray))
withGodotArray :: GodotArray -> (C2HSImp.Ptr GodotArray -> IO b) -> IO b
withGodotArray (GodotArray fptr) = C2HSImp.withForeignPtr fptr
{-# LINE 47 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Eq GodotArray

newtype GodotBasis = GodotBasis (C2HSImp.ForeignPtr (GodotBasis))
withGodotBasis :: GodotBasis -> (C2HSImp.Ptr GodotBasis -> IO b) -> IO b
withGodotBasis (GodotBasis fptr) = C2HSImp.withForeignPtr fptr
{-# LINE 50 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Eq GodotBasis

newtype GodotCharString = GodotCharString (C2HSImp.ForeignPtr (GodotCharString))
withGodotCharString :: GodotCharString -> (C2HSImp.Ptr GodotCharString -> IO b) -> IO b
withGodotCharString (GodotCharString fptr) = C2HSImp.withForeignPtr fptr
{-# LINE 53 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Eq GodotCharString

newtype GodotColor = GodotColor (C2HSImp.ForeignPtr (GodotColor))
withGodotColor :: GodotColor -> (C2HSImp.Ptr GodotColor -> IO b) -> IO b
withGodotColor (GodotColor fptr) = C2HSImp.withForeignPtr fptr
{-# LINE 56 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Eq GodotColor

newtype GodotDictionary = GodotDictionary (C2HSImp.ForeignPtr (GodotDictionary))
withGodotDictionary :: GodotDictionary -> (C2HSImp.Ptr GodotDictionary -> IO b) -> IO b
withGodotDictionary (GodotDictionary fptr) = C2HSImp.withForeignPtr fptr
{-# LINE 59 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Eq GodotDictionary

newtype GodotMethodBind = GodotMethodBind (C2HSImp.ForeignPtr (GodotMethodBind))
withGodotMethodBind :: GodotMethodBind -> (C2HSImp.Ptr GodotMethodBind -> IO b) -> IO b
withGodotMethodBind (GodotMethodBind fptr) = C2HSImp.withForeignPtr fptr
{-# LINE 62 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Eq GodotMethodBind

newtype GodotNodePath = GodotNodePath (C2HSImp.ForeignPtr (GodotNodePath))
withGodotNodePath :: GodotNodePath -> (C2HSImp.Ptr GodotNodePath -> IO b) -> IO b
withGodotNodePath (GodotNodePath fptr) = C2HSImp.withForeignPtr fptr
{-# LINE 65 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Eq GodotNodePath

newtype GodotPlane = GodotPlane (C2HSImp.ForeignPtr (GodotPlane))
withGodotPlane :: GodotPlane -> (C2HSImp.Ptr GodotPlane -> IO b) -> IO b
withGodotPlane (GodotPlane fptr) = C2HSImp.withForeignPtr fptr
{-# LINE 68 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Eq GodotPlane

newtype GodotPoolArrayReadAccess = GodotPoolArrayReadAccess (C2HSImp.ForeignPtr (GodotPoolArrayReadAccess))
withGodotPoolArrayReadAccess :: GodotPoolArrayReadAccess -> (C2HSImp.Ptr GodotPoolArrayReadAccess -> IO b) -> IO b
withGodotPoolArrayReadAccess (GodotPoolArrayReadAccess fptr) = C2HSImp.withForeignPtr fptr
{-# LINE 71 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Eq GodotPoolArrayReadAccess

newtype GodotPoolArrayWriteAccess = GodotPoolArrayWriteAccess (C2HSImp.ForeignPtr (GodotPoolArrayWriteAccess))
withGodotPoolArrayWriteAccess :: GodotPoolArrayWriteAccess -> (C2HSImp.Ptr GodotPoolArrayWriteAccess -> IO b) -> IO b
withGodotPoolArrayWriteAccess (GodotPoolArrayWriteAccess fptr) = C2HSImp.withForeignPtr fptr
{-# LINE 74 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Eq GodotPoolArrayWriteAccess

newtype GodotPoolByteArray = GodotPoolByteArray (C2HSImp.ForeignPtr (GodotPoolByteArray))
withGodotPoolByteArray :: GodotPoolByteArray -> (C2HSImp.Ptr GodotPoolByteArray -> IO b) -> IO b
withGodotPoolByteArray (GodotPoolByteArray fptr) = C2HSImp.withForeignPtr fptr
{-# LINE 77 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Eq GodotPoolByteArray

newtype GodotPoolColorArray = GodotPoolColorArray (C2HSImp.ForeignPtr (GodotPoolColorArray))
withGodotPoolColorArray :: GodotPoolColorArray -> (C2HSImp.Ptr GodotPoolColorArray -> IO b) -> IO b
withGodotPoolColorArray (GodotPoolColorArray fptr) = C2HSImp.withForeignPtr fptr
{-# LINE 80 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Eq GodotPoolColorArray

newtype GodotPoolIntArray = GodotPoolIntArray (C2HSImp.ForeignPtr (GodotPoolIntArray))
withGodotPoolIntArray :: GodotPoolIntArray -> (C2HSImp.Ptr GodotPoolIntArray -> IO b) -> IO b
withGodotPoolIntArray (GodotPoolIntArray fptr) = C2HSImp.withForeignPtr fptr
{-# LINE 83 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Eq GodotPoolIntArray

newtype GodotPoolRealArray = GodotPoolRealArray (C2HSImp.ForeignPtr (GodotPoolRealArray))
withGodotPoolRealArray :: GodotPoolRealArray -> (C2HSImp.Ptr GodotPoolRealArray -> IO b) -> IO b
withGodotPoolRealArray (GodotPoolRealArray fptr) = C2HSImp.withForeignPtr fptr
{-# LINE 86 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Eq GodotPoolRealArray

newtype GodotPoolStringArray = GodotPoolStringArray (C2HSImp.ForeignPtr (GodotPoolStringArray))
withGodotPoolStringArray :: GodotPoolStringArray -> (C2HSImp.Ptr GodotPoolStringArray -> IO b) -> IO b
withGodotPoolStringArray (GodotPoolStringArray fptr) = C2HSImp.withForeignPtr fptr
{-# LINE 89 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Eq GodotPoolStringArray

newtype GodotPoolVector2Array = GodotPoolVector2Array (C2HSImp.ForeignPtr (GodotPoolVector2Array))
withGodotPoolVector2Array :: GodotPoolVector2Array -> (C2HSImp.Ptr GodotPoolVector2Array -> IO b) -> IO b
withGodotPoolVector2Array (GodotPoolVector2Array fptr) = C2HSImp.withForeignPtr fptr
{-# LINE 92 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Eq GodotPoolVector2Array

newtype GodotPoolVector3Array = GodotPoolVector3Array (C2HSImp.ForeignPtr (GodotPoolVector3Array))
withGodotPoolVector3Array :: GodotPoolVector3Array -> (C2HSImp.Ptr GodotPoolVector3Array -> IO b) -> IO b
withGodotPoolVector3Array (GodotPoolVector3Array fptr) = C2HSImp.withForeignPtr fptr
{-# LINE 95 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Eq GodotPoolVector3Array

newtype GodotQuat = GodotQuat (C2HSImp.ForeignPtr (GodotQuat))
withGodotQuat :: GodotQuat -> (C2HSImp.Ptr GodotQuat -> IO b) -> IO b
withGodotQuat (GodotQuat fptr) = C2HSImp.withForeignPtr fptr
{-# LINE 98 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Eq GodotQuat

newtype GodotRect2 = GodotRect2 (C2HSImp.ForeignPtr (GodotRect2))
withGodotRect2 :: GodotRect2 -> (C2HSImp.Ptr GodotRect2 -> IO b) -> IO b
withGodotRect2 (GodotRect2 fptr) = C2HSImp.withForeignPtr fptr
{-# LINE 101 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Eq GodotRect2

newtype GodotRid = GodotRid (C2HSImp.ForeignPtr (GodotRid))
withGodotRid :: GodotRid -> (C2HSImp.Ptr GodotRid -> IO b) -> IO b
withGodotRid (GodotRid fptr) = C2HSImp.withForeignPtr fptr
{-# LINE 104 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Eq GodotRid

newtype GodotString = GodotString (C2HSImp.ForeignPtr (GodotString))
withGodotString :: GodotString -> (C2HSImp.Ptr GodotString -> IO b) -> IO b
withGodotString (GodotString fptr) = C2HSImp.withForeignPtr fptr
{-# LINE 107 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Eq GodotString

newtype GodotStringName = GodotStringName (C2HSImp.ForeignPtr (GodotStringName))
withGodotStringName :: GodotStringName -> (C2HSImp.Ptr GodotStringName -> IO b) -> IO b
withGodotStringName (GodotStringName fptr) = C2HSImp.withForeignPtr fptr
{-# LINE 110 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Eq GodotStringName

newtype GodotTransform = GodotTransform (C2HSImp.ForeignPtr (GodotTransform))
withGodotTransform :: GodotTransform -> (C2HSImp.Ptr GodotTransform -> IO b) -> IO b
withGodotTransform (GodotTransform fptr) = C2HSImp.withForeignPtr fptr
{-# LINE 113 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Eq GodotTransform

newtype GodotTransform2d = GodotTransform2d (C2HSImp.ForeignPtr (GodotTransform2d))
withGodotTransform2d :: GodotTransform2d -> (C2HSImp.Ptr GodotTransform2d -> IO b) -> IO b
withGodotTransform2d (GodotTransform2d fptr) = C2HSImp.withForeignPtr fptr
{-# LINE 116 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Eq GodotTransform2d

newtype GodotVariant = GodotVariant (C2HSImp.ForeignPtr (GodotVariant))
withGodotVariant :: GodotVariant -> (C2HSImp.Ptr GodotVariant -> IO b) -> IO b
withGodotVariant (GodotVariant fptr) = C2HSImp.withForeignPtr fptr
{-# LINE 119 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Eq GodotVariant

newtype GodotVector2 = GodotVector2 (C2HSImp.ForeignPtr (GodotVector2))
withGodotVector2 :: GodotVector2 -> (C2HSImp.Ptr GodotVector2 -> IO b) -> IO b
withGodotVector2 (GodotVector2 fptr) = C2HSImp.withForeignPtr fptr
{-# LINE 122 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Eq GodotVector2

newtype GodotVector3 = GodotVector3 (C2HSImp.ForeignPtr (GodotVector3))
withGodotVector3 :: GodotVector3 -> (C2HSImp.Ptr GodotVector3 -> IO b) -> IO b
withGodotVector3 (GodotVector3 fptr) = C2HSImp.withForeignPtr fptr
{-# LINE 125 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Eq GodotVector3


type GodotPoolByteArrayReadAccess = GodotPoolArrayReadAccess
type GodotPoolByteArrayWriteAccess = GodotPoolArrayWriteAccess
type GodotPoolColorArrayReadAccess = GodotPoolArrayReadAccess
type GodotPoolColorArrayWriteAccess = GodotPoolArrayWriteAccess
type GodotPoolIntArrayReadAccess = GodotPoolArrayReadAccess
type GodotPoolIntArrayWriteAccess = GodotPoolArrayWriteAccess
type GodotPoolRealArrayReadAccess = GodotPoolArrayReadAccess
type GodotPoolRealArrayWriteAccess = GodotPoolArrayWriteAccess
type GodotPoolStringArrayReadAccess = GodotPoolArrayReadAccess
type GodotPoolStringArrayWriteAccess = GodotPoolArrayWriteAccess
type GodotPoolVector2ArrayReadAccess = GodotPoolArrayReadAccess
type GodotPoolVector2ArrayWriteAccess = GodotPoolArrayWriteAccess
type GodotPoolVector3ArrayReadAccess = GodotPoolArrayReadAccess
type GodotPoolVector3ArrayWriteAccess = GodotPoolArrayWriteAccess

class OpaqueStorable a where
  opaqueSizeOf :: Int
instance OpaqueStorable GodotAabb where
  opaqueSizeOf = 24
{-# LINE 147 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}



instance OpaqueStorable GodotArray where
  opaqueSizeOf = 8
{-# LINE 151 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}



instance OpaqueStorable GodotBasis where
  opaqueSizeOf = 36
{-# LINE 155 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}



instance OpaqueStorable GodotCharString where
  opaqueSizeOf = 8
{-# LINE 159 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}



instance OpaqueStorable GodotColor where
  opaqueSizeOf = 16
{-# LINE 163 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}



instance OpaqueStorable GodotDictionary where
  opaqueSizeOf = 8
{-# LINE 167 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}



instance OpaqueStorable GodotMethodBind where
  opaqueSizeOf = 4
{-# LINE 171 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}



instance OpaqueStorable GodotNodePath where
  opaqueSizeOf = 8
{-# LINE 175 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}



instance OpaqueStorable GodotPlane where
  opaqueSizeOf = 16
{-# LINE 179 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}



instance OpaqueStorable GodotPoolArrayReadAccess where
  opaqueSizeOf = 4
{-# LINE 183 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}



instance OpaqueStorable GodotPoolArrayWriteAccess where
  opaqueSizeOf = 4
{-# LINE 187 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}



instance OpaqueStorable GodotPoolByteArray where
  opaqueSizeOf = 8
{-# LINE 191 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}



instance OpaqueStorable GodotPoolColorArray where
  opaqueSizeOf = 8
{-# LINE 195 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}



instance OpaqueStorable GodotPoolIntArray where
  opaqueSizeOf = 8
{-# LINE 199 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}



instance OpaqueStorable GodotPoolRealArray where
  opaqueSizeOf = 8
{-# LINE 203 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}



instance OpaqueStorable GodotPoolStringArray where
  opaqueSizeOf = 8
{-# LINE 207 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}



instance OpaqueStorable GodotPoolVector2Array where
  opaqueSizeOf = 8
{-# LINE 211 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}



instance OpaqueStorable GodotPoolVector3Array where
  opaqueSizeOf = 8
{-# LINE 215 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}



instance OpaqueStorable GodotQuat where
  opaqueSizeOf = 16
{-# LINE 219 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}



instance OpaqueStorable GodotRect2 where
  opaqueSizeOf = 16
{-# LINE 223 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}



instance OpaqueStorable GodotRid where
  opaqueSizeOf = 8
{-# LINE 227 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}



instance OpaqueStorable GodotString where
  opaqueSizeOf = 8
{-# LINE 231 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}



instance OpaqueStorable GodotStringName where
  opaqueSizeOf = 8
{-# LINE 235 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}



instance OpaqueStorable GodotTransform where
  opaqueSizeOf = 48
{-# LINE 239 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}



instance OpaqueStorable GodotTransform2d where
  opaqueSizeOf = 24
{-# LINE 243 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}



instance OpaqueStorable GodotVariant where
  opaqueSizeOf = 24
{-# LINE 247 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}



instance OpaqueStorable GodotVector2 where
  opaqueSizeOf = 8
{-# LINE 251 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}



instance OpaqueStorable GodotVector3 where
  opaqueSizeOf = 12
{-# LINE 255 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}



data GodotVariantCallError = GodotVariantCallError
  { variantCallErrorError :: !GodotVariantCallErrorError
  , variantCallErrorArgument :: !(Maybe CInt)
  , variantCallErrorExpected :: !(Maybe GodotVariantType)
  } deriving (Show, Eq, Ord)

instance Exception GodotVariantCallError

type GodotVariantCallErrorPtr = C2HSImp.Ptr (GodotVariantCallError)
{-# LINE 266 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}


instance Storable GodotVariantCallError where
  sizeOf _ = 12
{-# LINE 269 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

  alignment _ = 4
{-# LINE 270 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

  peek ptr = do
    err <- (toEnum . fromIntegral) <$> (\ptr -> do {C2HSImp.peekByteOff ptr 0 :: IO C2HSImp.CInt}) ptr
    case err of
      GodotCallErrorCallErrorInvalidArgument ->
        GodotVariantCallError err
             <$> (Just <$> (\ptr -> do {C2HSImp.peekByteOff ptr 4 :: IO C2HSImp.CInt}) ptr)
             <*> ((Just . toEnum . fromIntegral) <$> (\ptr -> do {C2HSImp.peekByteOff ptr 8 :: IO C2HSImp.CInt}) ptr)
      _ -> return $ GodotVariantCallError err Nothing Nothing
  poke ptr a = error "can't poke GodotVariantCallError"

newtype GodotGdnativeApiStruct = GodotGdnativeApiStruct (C2HSImp.Ptr (GodotGdnativeApiStruct))
{-# LINE 281 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Eq GodotGdnativeApiStruct
deriving newtype instance Storable GodotGdnativeApiStruct

newtype GodotGdnativeCoreApiStruct = GodotGdnativeCoreApiStruct (C2HSImp.Ptr (GodotGdnativeCoreApiStruct))
{-# LINE 285 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Eq GodotGdnativeCoreApiStruct
deriving newtype instance Storable GodotGdnativeCoreApiStruct

newtype GodotGdnativeCore11ApiStruct = GodotGdnativeCore11ApiStruct (C2HSImp.Ptr (GodotGdnativeCore11ApiStruct))
{-# LINE 289 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Eq GodotGdnativeCore11ApiStruct
deriving newtype instance Storable GodotGdnativeCore11ApiStruct

newtype GodotGdnativeExtNativescriptApiStruct = GodotGdnativeExtNativescriptApiStruct (C2HSImp.Ptr (GodotGdnativeExtNativescriptApiStruct))
{-# LINE 293 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Eq GodotGdnativeExtNativescriptApiStruct
deriving newtype instance Storable GodotGdnativeExtNativescriptApiStruct

newtype GodotGdnativeExtNativescript11ApiStruct = GodotGdnativeExtNativescript11ApiStruct (C2HSImp.Ptr (GodotGdnativeExtNativescript11ApiStruct))
{-# LINE 297 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Eq GodotGdnativeExtNativescript11ApiStruct
deriving newtype instance Storable GodotGdnativeExtNativescript11ApiStruct

newtype GodotGdnativeExtPluginscriptApiStruct = GodotGdnativeExtPluginscriptApiStruct (C2HSImp.Ptr (GodotGdnativeExtPluginscriptApiStruct))
{-# LINE 301 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Eq GodotGdnativeExtPluginscriptApiStruct
deriving newtype instance Storable GodotGdnativeExtPluginscriptApiStruct

newtype GodotGdnativeExtArvrApiStruct = GodotGdnativeExtArvrApiStruct (C2HSImp.Ptr (GodotGdnativeExtArvrApiStruct))
{-# LINE 305 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Eq GodotGdnativeExtArvrApiStruct
deriving newtype instance Storable GodotGdnativeExtArvrApiStruct

type ReportVersionMismatchFunc = GodotObject -> CString -> Word64 -> Word64 -> IO ()
type ReportLoadingErrorFunc = GodotObject -> CString -> IO ()


newtype GodotObject = GodotObject (C2HSImp.Ptr (GodotObject))
{-# LINE 313 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

deriving newtype instance Show  GodotObject
deriving newtype instance Eq GodotObject
deriving newtype instance Storable GodotObject


data GodotGdnativeInitOptions = GodotGdnativeInitOptions
  { gdnativeInitOptionsInEditor :: !Bool
  , gdnativeInitOptionsCoreApiHash :: !Word64
  , gdnativeInitOptionsEditorApiHash :: !Word64
  , gdnativeInitOptionsNoApiHash :: !Word64
  , gdnativeInitOptionsReportVersionMismatch :: !ReportVersionMismatchFunc
  , gdnativeInitOptionsReportLoadingError :: !ReportLoadingErrorFunc
  , gdnativeInitOptionsGdNativeLibrary :: !GodotObject
  , gdnativeInitOptionsApiStruct :: !GodotGdnativeCoreApiStruct
  , gdnativeInitOptionsActiveLibraryPath :: !GodotString
  }

foreign import ccall "dynamic" mkReportVersionMismatchFunc :: FunPtr ReportVersionMismatchFunc -> ReportVersionMismatchFunc

foreign import ccall "dynamic" mkReportLoadingErrorFunc :: FunPtr ReportLoadingErrorFunc -> ReportLoadingErrorFunc

instance Storable GodotGdnativeInitOptions where
  sizeOf _ = 72
{-# LINE 336 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

  alignment _ = 8
{-# LINE 337 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

  peek ptr = GodotGdnativeInitOptions
             <$> (\ptr -> do {C2HSImp.toBool `fmap` (C2HSImp.peekByteOff ptr 0 :: IO C2HSImp.CInt)}) ptr
             <*> (fromIntegral <$> (\ptr -> do {C2HSImp.peekByteOff ptr 8 :: IO C2HSImp.CULong}) ptr)
             <*> (fromIntegral <$> (\ptr -> do {C2HSImp.peekByteOff ptr 16 :: IO C2HSImp.CULong}) ptr)
             <*> (fromIntegral <$> (\ptr -> do {C2HSImp.peekByteOff ptr 24 :: IO C2HSImp.CULong}) ptr)
             <*> ((mkReportVersionMismatchFunc . castFunPtrVersion) <$> (\ptr -> do {C2HSImp.peekByteOff ptr 32 :: IO (C2HSImp.FunPtr ((GodotObject) -> ((C2HSImp.Ptr C2HSImp.CChar) -> ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> (IO ()))))))}) ptr)
             <*> (mkReportLoadingErrorFunc <$> (\ptr -> do {C2HSImp.peekByteOff ptr 40 :: IO (C2HSImp.FunPtr ((GodotObject) -> ((C2HSImp.Ptr C2HSImp.CChar) -> (IO ()))))}) ptr)
             <*> (\ptr -> do {C2HSImp.peekByteOff ptr 48 :: IO (GodotObject)}) ptr
             <*> (\ptr -> do {C2HSImp.peekByteOff ptr 56 :: IO (GodotGdnativeCoreApiStruct)}) ptr
             <*> (GodotString <$> ((\ptr -> do {C2HSImp.peekByteOff ptr 64 :: IO (C2HSImp.Ptr (GodotString))}) ptr >>= newForeignPtr_))
    where
      castFunPtrVersion :: FunPtr (GodotObject -> Ptr CChar -> Ptr () -> Ptr () -> IO ()) -> FunPtr ReportVersionMismatchFunc
      castFunPtrVersion = castFunPtr
  poke _ _ = error "Poking GodotGdNativeInitOptions is unsupported"

type GodotGdnativeInitOptionsPtr = C2HSImp.Ptr (GodotGdnativeInitOptions)
{-# LINE 353 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}


data GodotGdnativeTerminateOptions = GodotGdnativeTerminateOptions
  { gdnativeTerminateOptionsInEditor :: Bool
  } deriving (Show, Eq, Ord)

instance Storable GodotGdnativeTerminateOptions where
  sizeOf _ = 4
{-# LINE 360 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

  alignment _ = 1
{-# LINE 361 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

  peek ptr = GodotGdnativeTerminateOptions
             <$> (\ptr -> do {C2HSImp.toBool `fmap` (C2HSImp.peekByteOff ptr 0 :: IO C2HSImp.CInt)}) ptr
  poke ptr a = (\ptr val -> do {C2HSImp.pokeByteOff ptr 0 (C2HSImp.fromBool val :: C2HSImp.CInt)}) ptr (gdnativeTerminateOptionsInEditor a)

type GodotGdnativeTerminateOptionsPtr = C2HSImp.Ptr (GodotGdnativeTerminateOptions)
{-# LINE 366 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}



-- ok so:
-- on both SysV x64 and Win64, structs larger than 64bits are passed by pointer
-- i.e. the following two are equivalent:
{-
godot_variant test() {
    godot_variant var;
    godot_variant_new_nil(&var);
    return var;
}

godot_variant* test2(godot_variant* ret) {
    godot_variant_new_nil(ret);
    return ret;
}
-}
-- we're abusing this. remember to return the godotvariant!!
type NativeCallCb = FunPtr (Ptr GodotVariant -> Ptr () -> GodotArray -> IO (Ptr GodotVariant))
-- funptrs
type GodotClassConstructor = FunPtr (IO GodotObject)

-- stuff that's not opaque (i.e. needs to be Storable'd) but i don't want to deal w/ rn

-- pluginscript
-- TODO: we don't support pluginscript right now
data GodotPluginscriptLanguageDesc
instance Storable GodotPluginscriptLanguageDesc where
  sizeOf _ = 360
{-# LINE 395 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

  alignment _ = 8
{-# LINE 396 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

  peek = error "GodotPluginscriptLanguageDesc peek not implemented"
  poke = error "GodotPluginscriptLanguageDesc poke not implemented"

type GodotPluginscriptLanguageDescPtr = C2HSImp.Ptr (GodotPluginscriptLanguageDesc)
{-# LINE 400 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}


-- nativescript
data GodotPropertyHint = GodotPropertyHintNone
                       | GodotPropertyHintRange
                       | GodotPropertyHintExpRange
                       | GodotPropertyHintEnum
                       | GodotPropertyHintExpEasing
                       | GodotPropertyHintLength
                       | GodotPropertyHintSpriteFrame
                       | GodotPropertyHintKeyAccel
                       | GodotPropertyHintFlags
                       | GodotPropertyHintLayers2dRender
                       | GodotPropertyHintLayers2dPhysics
                       | GodotPropertyHintLayers3dRender
                       | GodotPropertyHintLayers3dPhysics
                       | GodotPropertyHintFile
                       | GodotPropertyHintDir
                       | GodotPropertyHintGlobalFile
                       | GodotPropertyHintGlobalDir
                       | GodotPropertyHintResourceType
                       | GodotPropertyHintMultilineText
                       | GodotPropertyHintPlaceholderText
                       | GodotPropertyHintColorNoAlpha
                       | GodotPropertyHintImageCompressLossy
                       | GodotPropertyHintImageCompressLossless
                       | GodotPropertyHintObjectId
                       | GodotPropertyHintTypeString
                       | GodotPropertyHintNodePathToEditedNode
                       | GodotPropertyHintMethodOfVariantType
                       | GodotPropertyHintMethodOfBaseType
                       | GodotPropertyHintMethodOfInstance
                       | GodotPropertyHintMethodOfScript
                       | GodotPropertyHintPropertyOfVariantType
                       | GodotPropertyHintPropertyOfBaseType
                       | GodotPropertyHintPropertyOfInstance
                       | GodotPropertyHintPropertyOfScript
                       | GodotPropertyHintMax
  deriving (Enum,Show,Eq,Ord,Bounded)

{-# LINE 404 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}


data GodotMethodRpcMode = GodotMethodRpcModeDisabled
                        | GodotMethodRpcModeRemote
                        | GodotMethodRpcModeSync
                        | GodotMethodRpcModeMaster
                        | GodotMethodRpcModeSlave
                        | GodotMethodRpcModeRemotesync
                        | GodotMethodRpcModeMastersync
                        | GodotMethodRpcModeSlavesync
  deriving (Enum,Show,Eq,Ord,Bounded)

{-# LINE 407 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}


newtype GodotPropertyUsageFlags = GodotPropertyUsageFlags { unGodotPropertyUsageFlags :: CInt }
  deriving newtype (Show, Eq, Ord, Bits, Storable)

pattern GodotPropertyUsageStorage :: GodotPropertyUsageFlags
pattern GodotPropertyUsageStorage = GodotPropertyUsageFlags 1

pattern GodotPropertyUsageEditor :: GodotPropertyUsageFlags
pattern GodotPropertyUsageEditor = GodotPropertyUsageFlags 2

pattern GodotPropertyUsageNetwork :: GodotPropertyUsageFlags
pattern GodotPropertyUsageNetwork = GodotPropertyUsageFlags 4

pattern GodotPropertyUsageEditorHelper :: GodotPropertyUsageFlags
pattern GodotPropertyUsageEditorHelper = GodotPropertyUsageFlags 8

pattern GodotPropertyUsageCheckable :: GodotPropertyUsageFlags
pattern GodotPropertyUsageCheckable = GodotPropertyUsageFlags 16

pattern GodotPropertyUsageChecked :: GodotPropertyUsageFlags
pattern GodotPropertyUsageChecked = GodotPropertyUsageFlags 32

pattern GodotPropertyUsageInternationalized :: GodotPropertyUsageFlags
pattern GodotPropertyUsageInternationalized = GodotPropertyUsageFlags 64

pattern GodotPropertyUsageGroup :: GodotPropertyUsageFlags
pattern GodotPropertyUsageGroup = GodotPropertyUsageFlags 128

pattern GodotPropertyUsageCategory :: GodotPropertyUsageFlags
pattern GodotPropertyUsageCategory = GodotPropertyUsageFlags 256

pattern GodotPropertyUsageStoreIfNonzero :: GodotPropertyUsageFlags
pattern GodotPropertyUsageStoreIfNonzero = GodotPropertyUsageFlags 512

pattern GodotPropertyUsageStoreIfNonone :: GodotPropertyUsageFlags
pattern GodotPropertyUsageStoreIfNonone = GodotPropertyUsageFlags 1024

pattern GodotPropertyUsageNoInstanceState :: GodotPropertyUsageFlags
pattern GodotPropertyUsageNoInstanceState = GodotPropertyUsageFlags 2048

pattern GodotPropertyUsageRestartIfChanged :: GodotPropertyUsageFlags
pattern GodotPropertyUsageRestartIfChanged = GodotPropertyUsageFlags 4096

pattern GodotPropertyUsageScriptVariable :: GodotPropertyUsageFlags
pattern GodotPropertyUsageScriptVariable = GodotPropertyUsageFlags 8192

pattern GodotPropertyUsageStoreIfNull :: GodotPropertyUsageFlags
pattern GodotPropertyUsageStoreIfNull = GodotPropertyUsageFlags 16384

pattern GodotPropertyUsageAnimateAsTrigger :: GodotPropertyUsageFlags
pattern GodotPropertyUsageAnimateAsTrigger = GodotPropertyUsageFlags 32768

pattern GodotPropertyUsageUpdateAllIfModified :: GodotPropertyUsageFlags
pattern GodotPropertyUsageUpdateAllIfModified = GodotPropertyUsageFlags 65536

godotPropertyUsageDefault :: GodotPropertyUsageFlags
godotPropertyUsageDefault = GodotPropertyUsageStorage .|. GodotPropertyUsageEditor .|. GodotPropertyUsageNetwork

godotPropertyUsageDefaultIntl :: GodotPropertyUsageFlags
godotPropertyUsageDefaultIntl = godotPropertyUsageDefault .|. GodotPropertyUsageInternationalized

godotPropertyUsageNoeditor :: GodotPropertyUsageFlags
godotPropertyUsageNoeditor = GodotPropertyUsageStorage .|. GodotPropertyUsageNetwork

type InstanceCreateFun = GodotObject -> Ptr () -> IO (Ptr ())
type InstanceDestroyFun = GodotObject -> Ptr ()  -> Ptr () -> IO ()
type InstanceFreeFun = Ptr () -> IO ()

foreign import ccall "wrapper" mkInstanceCreateFunPtr :: InstanceCreateFun -> IO (FunPtr InstanceCreateFun)
foreign import ccall "wrapper" mkInstanceDestroyFunPtr :: InstanceDestroyFun -> IO (FunPtr InstanceDestroyFun)
foreign import ccall "wrapper" mkInstanceFreeFunPtr :: InstanceFreeFun -> IO (FunPtr InstanceFreeFun)

data GodotInstanceCreateFunc = GodotInstanceCreateFunc
  { godotInstanceCreateFunc :: !(FunPtr InstanceCreateFun)
  , godotInstanceCreateMethodData :: !(Ptr ())
  , godotInstanceCreateFreeFunc :: !(FunPtr InstanceFreeFun)
  } deriving (Show, Eq)
instance Storable GodotInstanceCreateFunc where
  sizeOf _ = 24
{-# LINE 486 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

  alignment _ = 8
{-# LINE 487 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

  peek ptr = GodotInstanceCreateFunc
             <$> (\ptr -> do {C2HSImp.peekByteOff ptr 0 :: IO (C2HSImp.FunPtr ((GodotObject) -> ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ())))))}) ptr
             <*> (\ptr -> do {C2HSImp.peekByteOff ptr 8 :: IO (C2HSImp.Ptr ())}) ptr
             <*> (\ptr -> do {C2HSImp.peekByteOff ptr 16 :: IO (C2HSImp.FunPtr ((C2HSImp.Ptr ()) -> (IO ())))}) ptr
  poke ptr GodotInstanceCreateFunc{..} = do
    (\ptr val -> do {C2HSImp.pokeByteOff ptr 0 (val :: (C2HSImp.FunPtr ((GodotObject) -> ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ()))))))}) ptr godotInstanceCreateFunc
    (\ptr val -> do {C2HSImp.pokeByteOff ptr 8 (val :: (C2HSImp.Ptr ()))}) ptr godotInstanceCreateMethodData
    (\ptr val -> do {C2HSImp.pokeByteOff ptr 16 (val :: (C2HSImp.FunPtr ((C2HSImp.Ptr ()) -> (IO ()))))}) ptr godotInstanceCreateFreeFunc

type GodotInstanceCreateFuncPtr = C2HSImp.Ptr (GodotInstanceCreateFunc)
{-# LINE 497 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}


data GodotInstanceDestroyFunc = GodotInstanceDestroyFunc
  { godotInstanceDestroyFunc :: !(FunPtr InstanceDestroyFun)
  , godotInstanceDestroyMethodData :: !(Ptr ())
  , godotInstanceDestroyFreeFunc :: !(FunPtr InstanceFreeFun)
  } deriving (Show, Eq)
instance Storable GodotInstanceDestroyFunc where
  sizeOf _ = 24
{-# LINE 505 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

  alignment _ = 8
{-# LINE 506 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

  peek ptr = GodotInstanceDestroyFunc
             <$> (\ptr -> do {C2HSImp.peekByteOff ptr 0 :: IO (C2HSImp.FunPtr ((GodotObject) -> ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> (IO ())))))}) ptr
             <*> (\ptr -> do {C2HSImp.peekByteOff ptr 8 :: IO (C2HSImp.Ptr ())}) ptr
             <*> (\ptr -> do {C2HSImp.peekByteOff ptr 16 :: IO (C2HSImp.FunPtr ((C2HSImp.Ptr ()) -> (IO ())))}) ptr
  poke ptr GodotInstanceDestroyFunc{..} = do
    (\ptr val -> do {C2HSImp.pokeByteOff ptr 0 (val :: (C2HSImp.FunPtr ((GodotObject) -> ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> (IO ()))))))}) ptr godotInstanceDestroyFunc
    (\ptr val -> do {C2HSImp.pokeByteOff ptr 8 (val :: (C2HSImp.Ptr ()))}) ptr godotInstanceDestroyMethodData
    (\ptr val -> do {C2HSImp.pokeByteOff ptr 16 (val :: (C2HSImp.FunPtr ((C2HSImp.Ptr ()) -> (IO ()))))}) ptr godotInstanceDestroyFreeFunc

type GodotInstanceDestroyFuncPtr = C2HSImp.Ptr (GodotInstanceDestroyFunc)
{-# LINE 516 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}


type InstanceMethodFun = Ptr GodotVariant -> GodotObject -> Ptr () -> Ptr () -> CInt
                      -> Ptr (Ptr GodotVariant) -> IO (Ptr GodotVariant)

foreign import ccall "wrapper" mkInstanceMethodFunPtr :: InstanceMethodFun -> IO (FunPtr InstanceMethodFun)

data GodotInstanceMethod = GodotInstanceMethod
  { godotInstanceMethod :: !(FunPtr InstanceMethodFun)
  , godotInstanceMethodData :: !(Ptr ())
  , godotInstanceMethodFreeFunc :: !(FunPtr InstanceFreeFun)
  } deriving (Show, Eq)
instance Storable GodotInstanceMethod where
    sizeOf _ = 24
{-# LINE 529 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

    alignment _ = 8
{-# LINE 530 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

    peek ptr = GodotInstanceMethod
               <$> (castFunPtr <$> (\ptr -> do {C2HSImp.peekByteOff ptr 0 :: IO (C2HSImp.FunPtr ((GodotObject) -> ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> (C2HSImp.CInt -> ((C2HSImp.Ptr (C2HSImp.Ptr (GodotVariant))) -> (IO (C2HSImp.Ptr ()))))))))}) ptr)
               <*> (\ptr -> do {C2HSImp.peekByteOff ptr 8 :: IO (C2HSImp.Ptr ())}) ptr
               <*> (\ptr -> do {C2HSImp.peekByteOff ptr 16 :: IO (C2HSImp.FunPtr ((C2HSImp.Ptr ()) -> (IO ())))}) ptr
    poke ptr GodotInstanceMethod{..} = do
      (\ptr val -> do {C2HSImp.pokeByteOff ptr 0 (val :: (C2HSImp.FunPtr ((GodotObject) -> ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> (C2HSImp.CInt -> ((C2HSImp.Ptr (C2HSImp.Ptr (GodotVariant))) -> (IO (C2HSImp.Ptr ())))))))))}) ptr (castFunPtr godotInstanceMethod)
      (\ptr val -> do {C2HSImp.pokeByteOff ptr 8 (val :: (C2HSImp.Ptr ()))}) ptr godotInstanceMethodData
      (\ptr val -> do {C2HSImp.pokeByteOff ptr 16 (val :: (C2HSImp.FunPtr ((C2HSImp.Ptr ()) -> (IO ()))))}) ptr godotInstanceMethodFreeFunc

type GodotInstanceMethodPtr = C2HSImp.Ptr (GodotInstanceMethod)
{-# LINE 540 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}


newtype GodotMethodAttributes = GodotMethodAttributes GodotMethodRpcMode
  deriving newtype (Show, Eq)

instance Storable GodotMethodAttributes where
  sizeOf _ = 4
{-# LINE 546 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

  alignment _ = 4
{-# LINE 547 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

  peek ptr = (GodotMethodAttributes . toEnum . fromIntegral) <$> (\ptr -> do {C2HSImp.peekByteOff ptr 0 :: IO C2HSImp.CInt}) ptr
  poke ptr (GodotMethodAttributes rpcType) = (\ptr val -> do {C2HSImp.pokeByteOff ptr 0 (val :: C2HSImp.CInt)}) ptr (fromIntegral $ fromEnum rpcType)

type GodotMethodAttributesPtr = C2HSImp.Ptr (GodotMethodAttributes)
{-# LINE 551 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}


type PropertyGetFun = Ptr GodotVariant -> GodotObject -> Ptr () -> Ptr () -> IO (Ptr GodotVariant)

foreign import ccall "wrapper" mkPropertyGetFunPtr :: PropertyGetFun -> IO (FunPtr PropertyGetFun)

data GodotPropertyGetFunc = GodotPropertyGetFunc
  { godotPropertyGetFunc :: !(FunPtr PropertyGetFun)
  , godotPropertyGetMethodData :: !(Ptr ())
  , godotPropertyGetFreeFunc :: !(FunPtr InstanceFreeFun)
  } deriving (Show, Eq)

instance Storable GodotPropertyGetFunc where
  sizeOf _ = 24
{-# LINE 564 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

  alignment _ = 8
{-# LINE 565 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

  peek ptr = GodotPropertyGetFunc
             <$> (castFunPtr <$> (\ptr -> do {C2HSImp.peekByteOff ptr 0 :: IO (C2HSImp.FunPtr ((GodotObject) -> ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ()))))))}) ptr)
             <*> (\ptr -> do {C2HSImp.peekByteOff ptr 8 :: IO (C2HSImp.Ptr ())}) ptr
             <*> (\ptr -> do {C2HSImp.peekByteOff ptr 16 :: IO (C2HSImp.FunPtr ((C2HSImp.Ptr ()) -> (IO ())))}) ptr
  poke ptr GodotPropertyGetFunc{..} = do
    (\ptr val -> do {C2HSImp.pokeByteOff ptr 0 (val :: (C2HSImp.FunPtr ((GodotObject) -> ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ())))))))}) ptr (castFunPtr godotPropertyGetFunc)
    (\ptr val -> do {C2HSImp.pokeByteOff ptr 8 (val :: (C2HSImp.Ptr ()))}) ptr godotPropertyGetMethodData
    (\ptr val -> do {C2HSImp.pokeByteOff ptr 16 (val :: (C2HSImp.FunPtr ((C2HSImp.Ptr ()) -> (IO ()))))}) ptr godotPropertyGetFreeFunc

type GodotPropertyGetFuncPtr = C2HSImp.Ptr (GodotPropertyGetFunc)
{-# LINE 575 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}


type PropertySetFun = GodotObject -> Ptr () -> Ptr () -> Ptr GodotVariant -> IO ()

foreign import ccall "wrapper" mkPropertySetFunPtr :: PropertySetFun -> IO (FunPtr PropertySetFun)

data GodotPropertySetFunc = GodotPropertySetFunc
  { godotPropertySetFunc :: !(FunPtr PropertySetFun)
  , godotPropertySetMethodData :: !(Ptr ())
  , godotPropertySetFreeFunc :: !(FunPtr InstanceFreeFun)
  } deriving (Show, Eq)

instance Storable GodotPropertySetFunc where
    sizeOf _ = 24
{-# LINE 588 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

    alignment _ = 8
{-# LINE 589 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

    peek ptr = GodotPropertySetFunc
               <$> (\ptr -> do {C2HSImp.peekByteOff ptr 0 :: IO (C2HSImp.FunPtr ((GodotObject) -> ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr (GodotVariant)) -> (IO ()))))))}) ptr
               <*> (\ptr -> do {C2HSImp.peekByteOff ptr 8 :: IO (C2HSImp.Ptr ())}) ptr
               <*> (\ptr -> do {C2HSImp.peekByteOff ptr 16 :: IO (C2HSImp.FunPtr ((C2HSImp.Ptr ()) -> (IO ())))}) ptr
    poke ptr GodotPropertySetFunc{..} = do
      (\ptr val -> do {C2HSImp.pokeByteOff ptr 0 (val :: (C2HSImp.FunPtr ((GodotObject) -> ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr (GodotVariant)) -> (IO ())))))))}) ptr godotPropertySetFunc
      (\ptr val -> do {C2HSImp.pokeByteOff ptr 8 (val :: (C2HSImp.Ptr ()))}) ptr godotPropertySetMethodData
      (\ptr val -> do {C2HSImp.pokeByteOff ptr 16 (val :: (C2HSImp.FunPtr ((C2HSImp.Ptr ()) -> (IO ()))))}) ptr godotPropertySetFreeFunc

type GodotPropertySetFuncPtr = C2HSImp.Ptr (GodotPropertySetFunc)
{-# LINE 599 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}


getOpaqueFromStruct :: forall a b. OpaqueStorable a => (ForeignPtr a -> a) -> Ptr b -> Int -> IO a
getOpaqueFromStruct con structPtr offset = do
  let start = structPtr `plusPtr` offset
  let size = opaqueSizeOf @a
  (fptr :: ForeignPtr a) <- mallocForeignPtrBytes size
  withForeignPtr fptr $ \ptr -> copyBytes ptr start size
  return $ con fptr

setOpaqueFromStruct :: forall a b. (Coercible a (ForeignPtr a), OpaqueStorable a) => Ptr b -> a -> Int -> IO ()
setOpaqueFromStruct structPtr fptr offset = do
    let start = structPtr `plusPtr` offset
    let size = opaqueSizeOf @a
    withForeignPtr (coerce fptr :: ForeignPtr a) $ \ptr -> copyBytes start ptr size

data GodotPropertyAttributes = GodotPropertyAttributes
  { godotPropertyAttributesRsetType :: !GodotMethodRpcMode
  , godotPropertyAttributesType :: !GodotInt
  , godotPropertyAttributesHint :: !GodotPropertyHint
  , godotPropertyAttributesHintString :: !GodotString
  , godotPropertyAttributesUsage :: !GodotPropertyUsageFlags
  , godotPropertyAttributesDefaultValue :: !GodotVariant
  }
instance Storable GodotPropertyAttributes where
  sizeOf _ = 48
{-# LINE 624 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

  alignment _ = 4
{-# LINE 625 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

  peek ptr = do
    godotPropertyAttributesRsetType <- (toEnum . fromIntegral) <$> (\ptr -> do {C2HSImp.peekByteOff ptr 0 :: IO C2HSImp.CInt}) ptr
    godotPropertyAttributesType <- (\ptr -> do {C2HSImp.peekByteOff ptr 4 :: IO C2HSImp.CInt}) ptr
    godotPropertyAttributesHint <- (toEnum . fromIntegral) <$> (\ptr -> do {C2HSImp.peekByteOff ptr 8 :: IO C2HSImp.CInt}) ptr
    godotPropertyAttributesHintString <- getOpaqueFromStruct GodotString ptr (12)
{-# LINE 630 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

    godotPropertyAttributesUsage <- GodotPropertyUsageFlags <$> (\ptr -> do {C2HSImp.peekByteOff ptr 20 :: IO C2HSImp.CInt}) ptr
    godotPropertyAttributesDefaultValue <- getOpaqueFromStruct GodotVariant ptr (24)
{-# LINE 632 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

    return GodotPropertyAttributes{..}
  poke ptr GodotPropertyAttributes{..} = do
    (\ptr val -> do {C2HSImp.pokeByteOff ptr 0 (val :: C2HSImp.CInt)}) ptr (fromIntegral . fromEnum $ godotPropertyAttributesRsetType)
    (\ptr val -> do {C2HSImp.pokeByteOff ptr 4 (val :: C2HSImp.CInt)}) ptr godotPropertyAttributesType
    (\ptr val -> do {C2HSImp.pokeByteOff ptr 8 (val :: C2HSImp.CInt)}) ptr (fromIntegral . fromEnum $ godotPropertyAttributesHint)
    setOpaqueFromStruct ptr godotPropertyAttributesHintString (12)
{-# LINE 638 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

    (\ptr val -> do {C2HSImp.pokeByteOff ptr 20 (val :: C2HSImp.CInt)}) ptr (unGodotPropertyUsageFlags godotPropertyAttributesUsage)
    setOpaqueFromStruct ptr godotPropertyAttributesDefaultValue (24)
{-# LINE 640 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}


type GodotPropertyAttributesPtr = C2HSImp.Ptr (GodotPropertyAttributes)
{-# LINE 642 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}



data GodotSignalArgument = GodotSignalArgument
  { godotSignalArgumentName :: !GodotString
  , godotSignalArgumentType :: !GodotInt
  , godotSignalArgumentHint :: !GodotPropertyHint
  , godotSignalArgumentHintString :: !GodotString
  , godotSignalArgumentUsage :: !GodotPropertyUsageFlags
  , godotSignalArgumentDefaultValue :: !GodotVariant
  }
instance Storable GodotSignalArgument where
  sizeOf _ = 52
{-# LINE 654 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

  alignment _ = 4
{-# LINE 655 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

  peek ptr = do
    godotSignalArgumentName <- getOpaqueFromStruct GodotString ptr (0)
    godotSignalArgumentType <- (\ptr -> do {C2HSImp.peekByteOff ptr 8 :: IO C2HSImp.CInt}) ptr
    godotSignalArgumentHint <- (toEnum . fromIntegral) <$> (\ptr -> do {C2HSImp.peekByteOff ptr 12 :: IO C2HSImp.CInt}) ptr
    godotSignalArgumentHintString <- getOpaqueFromStruct GodotString ptr (16)
{-# LINE 660 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

    godotSignalArgumentUsage <- GodotPropertyUsageFlags <$> (\ptr -> do {C2HSImp.peekByteOff ptr 24 :: IO C2HSImp.CInt}) ptr
    godotSignalArgumentDefaultValue <- getOpaqueFromStruct GodotVariant ptr (28)
{-# LINE 662 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

    return GodotSignalArgument{..}
  poke ptr GodotSignalArgument{..} = do
    setOpaqueFromStruct ptr godotSignalArgumentName (0)
{-# LINE 665 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

    (\ptr val -> do {C2HSImp.pokeByteOff ptr 8 (val :: C2HSImp.CInt)}) ptr godotSignalArgumentType
    (\ptr val -> do {C2HSImp.pokeByteOff ptr 12 (val :: C2HSImp.CInt)}) ptr (fromIntegral . fromEnum $ godotSignalArgumentHint)
    setOpaqueFromStruct ptr godotSignalArgumentHintString (16)
{-# LINE 668 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

    (\ptr val -> do {C2HSImp.pokeByteOff ptr 24 (val :: C2HSImp.CInt)}) ptr (unGodotPropertyUsageFlags godotSignalArgumentUsage)
    setOpaqueFromStruct ptr godotSignalArgumentDefaultValue (28)
{-# LINE 670 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

type GodotSignalArgumentPtr = C2HSImp.Ptr (GodotSignalArgument)
{-# LINE 671 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}


data GodotSignal = GodotSignal
  { godotSignalName :: !GodotString
  , godotSignalNumArgs :: !CInt
  , godotSignalArgs :: !(Ptr GodotSignalArgument)
  , godotSignalNumDefaultArgs :: !CInt
  , godotSignalDefaultArgs :: !(Ptr GodotVariant)
  }
instance Storable GodotSignal where
  sizeOf _ = 40
{-# LINE 681 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

  alignment _ = 8
{-# LINE 682 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

  peek ptr = do
    godotSignalName <- getOpaqueFromStruct GodotString ptr (0)
    godotSignalNumArgs <- (\ptr -> do {C2HSImp.peekByteOff ptr 8 :: IO C2HSImp.CInt}) ptr
    godotSignalArgs <- (\ptr -> do {C2HSImp.peekByteOff ptr 16 :: IO (GodotSignalArgumentPtr)}) ptr
    godotSignalNumDefaultArgs <- (\ptr -> do {C2HSImp.peekByteOff ptr 24 :: IO C2HSImp.CInt}) ptr
    godotSignalDefaultArgs <- (\ptr -> do {C2HSImp.peekByteOff ptr 32 :: IO (C2HSImp.Ptr (GodotVariant))}) ptr
    return GodotSignal{..}
  poke ptr GodotSignal{..} = do
    setOpaqueFromStruct ptr godotSignalName (0)
{-# LINE 691 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

    (\ptr val -> do {C2HSImp.pokeByteOff ptr 8 (val :: C2HSImp.CInt)}) ptr godotSignalNumArgs
    (\ptr val -> do {C2HSImp.pokeByteOff ptr 16 (val :: (GodotSignalArgumentPtr))}) ptr godotSignalArgs
    (\ptr val -> do {C2HSImp.pokeByteOff ptr 24 (val :: C2HSImp.CInt)}) ptr godotSignalNumDefaultArgs
    (\ptr val -> do {C2HSImp.pokeByteOff ptr 32 (val :: (C2HSImp.Ptr (GodotVariant)))}) ptr godotSignalDefaultArgs

type GodotSignalPtr = C2HSImp.Ptr (GodotSignal)
{-# LINE 697 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}




data GodotInstanceBindingFunctions
instance Storable GodotInstanceBindingFunctions where
  sizeOf _ = 48
{-# LINE 703 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

  alignment _ = 48
{-# LINE 704 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

  peek = error "GodotInstanceBindingFunctions peek not implemented"
  poke = error "GodotInstanceBindingFunctions poke not implemented"
type GodotInstanceBindingFunctionsPtr = C2HSImp.Ptr (GodotInstanceBindingFunctions)
{-# LINE 707 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}



data GodotMethodArg
instance Storable GodotMethodArg where
  sizeOf _ = 24
{-# LINE 712 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

  alignment _ = 24
{-# LINE 713 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

  peek = error "GodotMethodArg peek not implemented"
  poke = error "GodotMethodArg poke not implemented"
type GodotMethodArgPtr = C2HSImp.Ptr (GodotMethodArg)
{-# LINE 716 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}



--arvr

data GodotArvrInterfaceGdnative
instance Storable GodotArvrInterfaceGdnative where
  sizeOf _ = 128
{-# LINE 723 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

  alignment _ = 128
{-# LINE 724 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}

  peek = error "GodotArvrInterfaceGdnative peek not implemented"
  poke = error "GodotArvrInterfaceGdnative poke not implemented"
type GodotArvrInterfaceGdnativePtr = C2HSImp.Ptr (GodotArvrInterfaceGdnative)
{-# LINE 727 "src/Godot/Gdnative/Internal/Gdnative.chs" #-}





godotGdnativeCoreApiStructRef :: IORef GodotGdnativeCoreApiStruct
godotGdnativeCoreApiStructRef = unsafePerformIO $ newIORef $
  error "attempted to get godotGdnativeCoreApiStructRef too early"
{-# NOINLINE godotGdnativeCoreApiStructRef #-}

godotGdnativeCore11ApiStructRef :: IORef GodotGdnativeCore11ApiStruct
godotGdnativeCore11ApiStructRef = unsafePerformIO $ newIORef $
  error "attempted to get godotGdnativeCore11ApiStructRef too early"
{-# NOINLINE godotGdnativeCore11ApiStructRef #-}

godotGdnativeExtNativescriptApiStructRef :: IORef GodotGdnativeExtNativescriptApiStruct
godotGdnativeExtNativescriptApiStructRef = unsafePerformIO $ newIORef $
  error "attempted to get godotGdnativeExtNativescriptApiStructRef too early"
{-# NOINLINE godotGdnativeExtNativescriptApiStructRef #-}

godotGdnativeExtNativescript11ApiStructRef :: IORef GodotGdnativeExtNativescript11ApiStruct
godotGdnativeExtNativescript11ApiStructRef = unsafePerformIO $ newIORef $
  error "attempted to get godotGdnativeExtNativescript11ApiStructRef too early"
{-# NOINLINE godotGdnativeExtNativescript11ApiStructRef #-}

godotGdnativeExtPluginscriptApiStructRef :: IORef GodotGdnativeExtPluginscriptApiStruct
godotGdnativeExtPluginscriptApiStructRef = unsafePerformIO $ newIORef $
  error "attempted to get godotGdnativeExtPluginscriptApiStructRef too early"
{-# NOINLINE godotGdnativeExtPluginscriptApiStructRef #-}

godotGdnativeExtArvrApiStructRef :: IORef GodotGdnativeExtArvrApiStruct
godotGdnativeExtArvrApiStructRef = unsafePerformIO $ newIORef $
  error "attempted to get godotGdnativeExtArvrApiStructRef too early"
{-# NOINLINE godotGdnativeExtArvrApiStructRef #-}

initApiStructs :: GodotGdnativeInitOptions -> IO ()
initApiStructs opts = do
  let coreApi = gdnativeInitOptionsApiStruct opts
  writeIORef godotGdnativeCoreApiStructRef coreApi
  findCoreExt (coerce coreApi)

  numExt <- (\(GodotGdnativeCoreApiStruct ptr) -> do {C2HSImp.peekByteOff ptr 24 :: IO C2HSImp.CUInt}) coreApi
  extsPtr <- (\(GodotGdnativeCoreApiStruct ptr) -> do {C2HSImp.peekByteOff ptr 32 :: IO (C2HSImp.Ptr (GodotGdnativeApiStruct))}) coreApi
  exts <- peekArray (fromIntegral numExt) (castPtr extsPtr :: Ptr GodotGdnativeApiStruct)
  forM_ exts $ \ext -> do
    ty <- (\(GodotGdnativeApiStruct ptr) -> do {C2HSImp.peekByteOff ptr 0 :: IO C2HSImp.CUInt}) ext
    -- HACK
    case ty of
      1 -> do -- nativescript
        writeIORef godotGdnativeExtNativescriptApiStructRef (coerce ext)
        findNativescriptExt ext
      2 -> do -- pluginscript
        writeIORef godotGdnativeExtPluginscriptApiStructRef (coerce ext)
      3 -> return () -- android
      4 -> do -- arvr
        writeIORef godotGdnativeExtArvrApiStructRef (coerce ext)
      _ -> error $ "Unknown API struct type " ++ show ty
  where
    findCoreExt = findExt GodotGdnativeCore11ApiStruct godotGdnativeCore11ApiStructRef
    findNativescriptExt = findExt GodotGdnativeExtNativescript11ApiStruct godotGdnativeExtNativescript11ApiStructRef
    findExt con ref ext = do
      next <- (\(GodotGdnativeApiStruct ptr) -> do {C2HSImp.peekByteOff ptr 16 :: IO (GodotGdnativeApiStruct)}) ext
      when (next /= coerce nullPtr) $ do

        major <- (\(GodotGdnativeApiStruct ptr) -> do {C2HSImp.peekByteOff ptr 4 :: IO C2HSImp.CUInt}) next
        minor <- (\(GodotGdnativeApiStruct ptr) -> do {C2HSImp.peekByteOff ptr 8 :: IO C2HSImp.CUInt}) next
        if major == 1 && minor == 1 then writeIORef ref (con $ coerce next)
        else findExt con ref next