|
@@ -151,3 +151,80 @@ Shader::~Shader() {
|
|
|
|
|
|
VisualServer::get_singleton()->free(shader);
|
|
|
}
|
|
|
+////////////
|
|
|
+
|
|
|
+RES ResourceFormatLoaderShader::load(const String &p_path, const String &p_original_path, Error *r_error) {
|
|
|
+
|
|
|
+ if (r_error)
|
|
|
+ *r_error = ERR_FILE_CANT_OPEN;
|
|
|
+
|
|
|
+ Ref<Shader> shader;
|
|
|
+ shader.instance();
|
|
|
+
|
|
|
+ Vector<uint8_t> buffer = FileAccess::get_file_as_array(p_path);
|
|
|
+
|
|
|
+ String str;
|
|
|
+ str.parse_utf8((const char *)buffer.ptr(), buffer.size());
|
|
|
+
|
|
|
+ shader->set_code(str);
|
|
|
+
|
|
|
+ if (r_error)
|
|
|
+ *r_error = OK;
|
|
|
+
|
|
|
+ return shader;
|
|
|
+}
|
|
|
+
|
|
|
+void ResourceFormatLoaderShader::get_recognized_extensions(List<String> *p_extensions) const {
|
|
|
+
|
|
|
+ p_extensions->push_back("shader");
|
|
|
+}
|
|
|
+
|
|
|
+bool ResourceFormatLoaderShader::handles_type(const String &p_type) const {
|
|
|
+
|
|
|
+ return (p_type == "Shader");
|
|
|
+}
|
|
|
+
|
|
|
+String ResourceFormatLoaderShader::get_resource_type(const String &p_path) const {
|
|
|
+
|
|
|
+ String el = p_path.get_extension().to_lower();
|
|
|
+ if (el == "shader")
|
|
|
+ return "Shader";
|
|
|
+ return "";
|
|
|
+}
|
|
|
+
|
|
|
+Error ResourceFormatSaverShader::save(const String &p_path, const RES &p_resource, uint32_t p_flags) {
|
|
|
+
|
|
|
+ Ref<Shader> shader = p_resource;
|
|
|
+ ERR_FAIL_COND_V(shader.is_null(), ERR_INVALID_PARAMETER);
|
|
|
+
|
|
|
+ String source = shader->get_code();
|
|
|
+
|
|
|
+ Error err;
|
|
|
+ FileAccess *file = FileAccess::open(p_path, FileAccess::WRITE, &err);
|
|
|
+
|
|
|
+ if (err) {
|
|
|
+
|
|
|
+ ERR_FAIL_COND_V(err, err);
|
|
|
+ }
|
|
|
+
|
|
|
+ file->store_string(source);
|
|
|
+ if (file->get_error() != OK && file->get_error() != ERR_FILE_EOF) {
|
|
|
+ memdelete(file);
|
|
|
+ return ERR_CANT_CREATE;
|
|
|
+ }
|
|
|
+ file->close();
|
|
|
+ memdelete(file);
|
|
|
+
|
|
|
+ return OK;
|
|
|
+}
|
|
|
+
|
|
|
+void ResourceFormatSaverShader::get_recognized_extensions(const RES &p_resource, List<String> *p_extensions) const {
|
|
|
+
|
|
|
+ if (Object::cast_to<Shader>(*p_resource)) {
|
|
|
+ p_extensions->push_back("shader");
|
|
|
+ }
|
|
|
+}
|
|
|
+bool ResourceFormatSaverShader::recognize(const RES &p_resource) const {
|
|
|
+
|
|
|
+ return Object::cast_to<Shader>(*p_resource) != NULL;
|
|
|
+}
|