// AUTOGENERATED COPYRIGHT HEADER START
// Copyright (C) 2019-2023 Michael Fabian 'Xaymar' Dirks <info@xaymar.com>
// AUTOGENERATED COPYRIGHT HEADER END

//--------------------------------------------------------------------------------//
// THIS FEATURE IS DEPRECATED. SUBMITTED PATCHES WILL BE REJECTED.
//--------------------------------------------------------------------------------//

#pragma once
#include "common.hpp"
#include "obs/gs/gs-effect.hpp"
#include "obs/obs-source-factory.hpp"

namespace streamfx::filter::displacement {
	class displacement_instance : public obs::source_instance {
		streamfx::obs::gs::effect _effect;

		// Displacement Map
		std::shared_ptr<streamfx::obs::gs::texture> _texture;
		std::string                                 _texture_file;
		float_t                                     _scale[2];
		float_t                                     _scale_type;

		// Cache
		uint32_t _width;
		uint32_t _height;

		public:
		displacement_instance(obs_data_t*, obs_source_t*);
		virtual ~displacement_instance();

		virtual void load(obs_data_t* settings) override;
		virtual void migrate(obs_data_t* data, uint64_t version) override;
		virtual void update(obs_data_t* settings) override;

		virtual void video_tick(float_t) override;
		virtual void video_render(gs_effect_t*) override;

		std::string get_file();
	};

	class displacement_factory : public obs::source_factory<filter::displacement::displacement_factory,
															filter::displacement::displacement_instance> {
		public:
		displacement_factory();
		virtual ~displacement_factory();

		virtual const char* get_name() override;

		virtual void get_defaults2(obs_data_t* data) override;

		virtual obs_properties_t* get_properties2(filter::displacement::displacement_instance* data) override;

		public: // Singleton
		static void initialize();

		static void finalize();

		static std::shared_ptr<displacement_factory> get();
	};
} // namespace streamfx::filter::displacement
