#ifndef FLUTTER_PLUGIN_POLYVOX_FILAMENT_PLUGIN_H_ #define FLUTTER_PLUGIN_POLYVOX_FILAMENT_PLUGIN_H_ #include #include #include #include #include #include #include #include #include "GL/GL.h" #include "GL/GLu.h" #include #include #include #include "PolyvoxFilamentApi.h" namespace polyvox_filament { static constexpr EGLint kEGLConfigurationAttributes[] = { EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, EGL_ALPHA_SIZE, 8, EGL_DEPTH_SIZE, 8, EGL_STENCIL_SIZE, 8, EGL_NONE, }; static constexpr EGLint kEGLContextAttributes[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE, }; static constexpr EGLint kD3D11DisplayAttributes[] = { EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE, EGL_TRUE, EGL_NONE, }; static constexpr EGLint kD3D11_9_3DisplayAttributes[] = { EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE, 9, EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE, 3, EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE, EGL_TRUE, EGL_NONE, }; static constexpr EGLint kD3D9DisplayAttributes[] = { EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE, EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE, EGL_NONE, }; static constexpr EGLint kWrapDisplayAttributes[] = { EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE, EGL_TRUE, EGL_NONE, }; class PolyvoxFilamentPlugin : public flutter::Plugin { public: static void RegisterWithRegistrar(flutter::PluginRegistrarWindows *registrar); PolyvoxFilamentPlugin(flutter::TextureRegistrar *textureRegistrar, flutter::PluginRegistrarWindows *registrar); virtual ~PolyvoxFilamentPlugin(); // Disallow copy and assign. PolyvoxFilamentPlugin(const PolyvoxFilamentPlugin &) = delete; PolyvoxFilamentPlugin &operator=(const PolyvoxFilamentPlugin &) = delete; // Called when a method is called on this plugin's channel from Dart. void HandleMethodCall( const flutter::MethodCall &method_call, std::unique_ptr> result); flutter::PluginRegistrarWindows *_pluginRegistrar; flutter::TextureRegistrar *_textureRegistrar; std::unique_ptr _texture = nullptr; // std::unique_ptr _pixelBuffer = nullptr; // std::unique_ptr _pixelData = nullptr; std::unique_ptr _textureDescriptor = nullptr; int32_t _frameIntervalInMilliseconds = 1000 / 60; bool _rendering = false; int64_t _flutterTextureId; // OpenGL // Texture handle GLuint _glTextureId = 0; // Shared context HGLRC _context = NULL; // D3D // Device ID3D11Device* _D3D11Device = nullptr; ID3D11DeviceContext* _D3D11DeviceContext = nullptr; // Texture objects/shared handles Microsoft::WRL::ComPtr _externalD3DTexture2D; Microsoft::WRL::ComPtr _internalD3DTexture2D; HANDLE _externalD3DTextureHandle = nullptr; HANDLE _internalD3DTextureHandle = nullptr; void *_viewer = nullptr; std::map _resources; void CreateFilamentViewer( const flutter::MethodCall &methodCall, std::unique_ptr> result); void CreateTexture( const flutter::MethodCall &methodCall, std::unique_ptr> result); void Render( const flutter::MethodCall &methodCall, std::unique_ptr> result); void SetRendering( const flutter::MethodCall &methodCall, std::unique_ptr> result); void SetBackgroundImage( const flutter::MethodCall &methodCall, std::unique_ptr> result); void SetBackgroundColor( const flutter::MethodCall &methodCall, std::unique_ptr> result); void UpdateViewportAndCameraProjection( const flutter::MethodCall &methodCall, std::unique_ptr> result); void GetAssetManager( const flutter::MethodCall &methodCall, std::unique_ptr> result); void LoadSkybox( const flutter::MethodCall &methodCall, std::unique_ptr> result); void LoadIbl( const flutter::MethodCall &methodCall, std::unique_ptr> result); void RemoveSkybox( const flutter::MethodCall &methodCall, std::unique_ptr> result); void RemoveIbl( const flutter::MethodCall &methodCall, std::unique_ptr> result); void AddLight( const flutter::MethodCall &methodCall, std::unique_ptr> result); void LoadGlb( const flutter::MethodCall &methodCall, std::unique_ptr> result); void RotateStart( const flutter::MethodCall &methodCall, std::unique_ptr> result); void RotateEnd( const flutter::MethodCall &methodCall, std::unique_ptr> result); void RotateUpdate( const flutter::MethodCall &methodCall, std::unique_ptr> result); void PanStart( const flutter::MethodCall &methodCall, std::unique_ptr> result); void PanUpdate( const flutter::MethodCall &methodCall, std::unique_ptr> result); void PanEnd( const flutter::MethodCall &methodCall, std::unique_ptr> result); void SetPosition( const flutter::MethodCall &methodCall, std::unique_ptr> result); void SetRotation( const flutter::MethodCall &methodCall, std::unique_ptr> result); void GetAnimationNames( const flutter::MethodCall &methodCall, std::unique_ptr> result); void RemoveAsset( const flutter::MethodCall &methodCall, std::unique_ptr> result); void TransformToUnitCube( const flutter::MethodCall &methodCall, std::unique_ptr> result); void GrabBegin(const flutter::MethodCall &methodCall, std::unique_ptr> result); void GrabEnd(const flutter::MethodCall &methodCall, std::unique_ptr> result); void GrabUpdate(const flutter::MethodCall &methodCall, std::unique_ptr> result); void ScrollBegin(const flutter::MethodCall &methodCall, std::unique_ptr> result); void ScrollEnd(const flutter::MethodCall &methodCall, std::unique_ptr> result); void ScrollUpdate(const flutter::MethodCall &methodCall, std::unique_ptr> result); ResourceBuffer loadResource(const char *path); void freeResource(ResourceBuffer rbuf); }; } // namespace polyvox_filament #endif // FLUTTER_PLUGIN_POLYVOX_FILAMENT_PLUGIN_H_