Path: blob/master/scene/resources/compressed_texture.h
9903 views
/**************************************************************************/1/* compressed_texture.h */2/**************************************************************************/3/* This file is part of: */4/* GODOT ENGINE */5/* https://godotengine.org */6/**************************************************************************/7/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */8/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */9/* */10/* Permission is hereby granted, free of charge, to any person obtaining */11/* a copy of this software and associated documentation files (the */12/* "Software"), to deal in the Software without restriction, including */13/* without limitation the rights to use, copy, modify, merge, publish, */14/* distribute, sublicense, and/or sell copies of the Software, and to */15/* permit persons to whom the Software is furnished to do so, subject to */16/* the following conditions: */17/* */18/* The above copyright notice and this permission notice shall be */19/* included in all copies or substantial portions of the Software. */20/* */21/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */22/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */23/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */24/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */25/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */26/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */27/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */28/**************************************************************************/2930#pragma once3132#include "core/io/resource_loader.h"33#include "scene/resources/texture.h"3435class BitMap;3637class CompressedTexture2D : public Texture2D {38GDCLASS(CompressedTexture2D, Texture2D);3940public:41enum DataFormat {42DATA_FORMAT_IMAGE,43DATA_FORMAT_PNG,44DATA_FORMAT_WEBP,45DATA_FORMAT_BASIS_UNIVERSAL,46};4748enum {49FORMAT_VERSION = 150};5152enum FormatBits {53FORMAT_BIT_STREAM = 1 << 22,54FORMAT_BIT_HAS_MIPMAPS = 1 << 23,55FORMAT_BIT_DETECT_3D = 1 << 24,56//FORMAT_BIT_DETECT_SRGB = 1 << 25,57FORMAT_BIT_DETECT_NORMAL = 1 << 26,58FORMAT_BIT_DETECT_ROUGNESS = 1 << 27,59};6061private:62String path_to_file;63mutable RID texture;64Image::Format format = Image::FORMAT_L8;65int w = 0;66int h = 0;67mutable Ref<BitMap> alpha_cache;6869Error _load_data(const String &p_path, int &r_width, int &r_height, Ref<Image> &image, bool &r_request_3d, bool &r_request_normal, bool &r_request_roughness, int &mipmap_limit, int p_size_limit = 0);70virtual void reload_from_file() override;7172static void _requested_3d(void *p_ud);73static void _requested_roughness(void *p_ud, const String &p_normal_path, RS::TextureDetectRoughnessChannel p_roughness_channel);74static void _requested_normal(void *p_ud);7576protected:77static void _bind_methods();7879public:80static Ref<Image> load_image_from_file(Ref<FileAccess> p_file, int p_size_limit);8182typedef void (*TextureFormatRequestCallback)(const Ref<CompressedTexture2D> &);83typedef void (*TextureFormatRoughnessRequestCallback)(const Ref<CompressedTexture2D> &, const String &p_normal_path, RS::TextureDetectRoughnessChannel p_roughness_channel);8485static TextureFormatRequestCallback request_3d_callback;86static TextureFormatRoughnessRequestCallback request_roughness_callback;87static TextureFormatRequestCallback request_normal_callback;8889Image::Format get_format() const;90Error load(const String &p_path);91String get_load_path() const;9293int get_width() const override;94int get_height() const override;95virtual RID get_rid() const override;9697virtual void set_path(const String &p_path, bool p_take_over) override;9899virtual void draw(RID p_canvas_item, const Point2 &p_pos, const Color &p_modulate = Color(1, 1, 1), bool p_transpose = false) const override;100virtual void draw_rect(RID p_canvas_item, const Rect2 &p_rect, bool p_tile = false, const Color &p_modulate = Color(1, 1, 1), bool p_transpose = false) const override;101virtual void draw_rect_region(RID p_canvas_item, const Rect2 &p_rect, const Rect2 &p_src_rect, const Color &p_modulate = Color(1, 1, 1), bool p_transpose = false, bool p_clip_uv = true) const override;102103virtual bool has_alpha() const override;104bool is_pixel_opaque(int p_x, int p_y) const override;105106virtual Ref<Image> get_image() const override;107108~CompressedTexture2D();109};110111class ResourceFormatLoaderCompressedTexture2D : public ResourceFormatLoader {112public:113virtual Ref<Resource> load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr, CacheMode p_cache_mode = CACHE_MODE_REUSE) override;114virtual void get_recognized_extensions(List<String> *p_extensions) const override;115virtual bool handles_type(const String &p_type) const override;116virtual String get_resource_type(const String &p_path) const override;117};118119class CompressedTextureLayered : public TextureLayered {120GDCLASS(CompressedTextureLayered, TextureLayered);121122public:123enum DataFormat {124DATA_FORMAT_IMAGE,125DATA_FORMAT_PNG,126DATA_FORMAT_WEBP,127DATA_FORMAT_BASIS_UNIVERSAL,128};129130enum {131FORMAT_VERSION = 1132};133134enum FormatBits {135FORMAT_BIT_STREAM = 1 << 22,136FORMAT_BIT_HAS_MIPMAPS = 1 << 23,137};138139private:140Error _load_data(const String &p_path, Vector<Ref<Image>> &images, int &mipmap_limit, int p_size_limit = 0);141String path_to_file;142mutable RID texture;143Image::Format format = Image::FORMAT_L8;144int w = 0;145int h = 0;146int layers = 0;147bool mipmaps = false;148LayeredType layered_type = LayeredType::LAYERED_TYPE_2D_ARRAY;149150virtual void reload_from_file() override;151152protected:153static void _bind_methods();154155public:156Image::Format get_format() const override;157Error load(const String &p_path);158String get_load_path() const;159virtual LayeredType get_layered_type() const override;160161int get_width() const override;162int get_height() const override;163int get_layers() const override;164virtual bool has_mipmaps() const override;165virtual RID get_rid() const override;166167virtual void set_path(const String &p_path, bool p_take_over) override;168169virtual Ref<Image> get_layer_data(int p_layer) const override;170171CompressedTextureLayered(LayeredType p_layered_type);172~CompressedTextureLayered();173};174175class ResourceFormatLoaderCompressedTextureLayered : public ResourceFormatLoader {176public:177virtual Ref<Resource> load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr, CacheMode p_cache_mode = CACHE_MODE_REUSE) override;178virtual void get_recognized_extensions(List<String> *p_extensions) const override;179virtual bool handles_type(const String &p_type) const override;180virtual String get_resource_type(const String &p_path) const override;181};182183class CompressedTexture2DArray : public CompressedTextureLayered {184GDCLASS(CompressedTexture2DArray, CompressedTextureLayered)185public:186CompressedTexture2DArray() :187CompressedTextureLayered(LAYERED_TYPE_2D_ARRAY) {}188};189190class CompressedCubemap : public CompressedTextureLayered {191GDCLASS(CompressedCubemap, CompressedTextureLayered);192193public:194CompressedCubemap() :195CompressedTextureLayered(LAYERED_TYPE_CUBEMAP) {}196};197198class CompressedCubemapArray : public CompressedTextureLayered {199GDCLASS(CompressedCubemapArray, CompressedTextureLayered);200201public:202CompressedCubemapArray() :203CompressedTextureLayered(LAYERED_TYPE_CUBEMAP_ARRAY) {}204};205206class CompressedTexture3D : public Texture3D {207GDCLASS(CompressedTexture3D, Texture3D);208209public:210enum DataFormat {211DATA_FORMAT_IMAGE,212DATA_FORMAT_PNG,213DATA_FORMAT_WEBP,214DATA_FORMAT_BASIS_UNIVERSAL,215};216217enum {218FORMAT_VERSION = 1219};220221enum FormatBits {222FORMAT_BIT_STREAM = 1 << 22,223FORMAT_BIT_HAS_MIPMAPS = 1 << 23,224};225226private:227Error _load_data(const String &p_path, Vector<Ref<Image>> &r_data, Image::Format &r_format, int &r_width, int &r_height, int &r_depth, bool &r_mipmaps);228String path_to_file;229mutable RID texture;230Image::Format format = Image::FORMAT_L8;231int w = 0;232int h = 0;233int d = 0;234bool mipmaps = false;235236virtual void reload_from_file() override;237238protected:239static void _bind_methods();240241public:242Image::Format get_format() const override;243Error load(const String &p_path);244String get_load_path() const;245246int get_width() const override;247int get_height() const override;248int get_depth() const override;249virtual bool has_mipmaps() const override;250virtual RID get_rid() const override;251252virtual void set_path(const String &p_path, bool p_take_over) override;253254virtual Vector<Ref<Image>> get_data() const override;255256~CompressedTexture3D();257};258259class ResourceFormatLoaderCompressedTexture3D : public ResourceFormatLoader {260public:261virtual Ref<Resource> load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr, CacheMode p_cache_mode = CACHE_MODE_REUSE) override;262virtual void get_recognized_extensions(List<String> *p_extensions) const override;263virtual bool handles_type(const String &p_type) const override;264virtual String get_resource_type(const String &p_path) const override;265};266267268