소스 검색

* implemented loadFromFunc and saveToFunc

master
Bergmann89 11 년 전
부모
커밋
a2da0168ad
8개의 변경된 파일과 918개의 추가작업 그리고 87개의 파일을 삭제
  1. +18
    -3
      header/examples/c++/example.cpp
  2. +2
    -2
      header/examples/c/example.c
  3. +22
    -3
      header/examples/delphi/example.dpr
  4. +21
    -2
      header/examples/fpc/example.lpr
  5. +83
    -3
      header/libShaderFile.h
  6. +348
    -27
      header/libShaderFile.hpp
  7. +197
    -9
      header/ulibShaderFile.pas
  8. +227
    -38
      libShaderFile.lpr

+ 18
- 3
header/examples/c++/example.cpp 파일 보기

@@ -1,10 +1,11 @@
#include <fstream>
#include <iostream> #include <iostream>
#include "../../libShaderFile.hpp" #include "../../libShaderFile.hpp"


#if _WIN64 #if _WIN64
static const char* LibName = "..\..\..\libShaderFile-x86_64-win64.dll";
static const char* LibName = "..\\..\\..\\libShaderFile-x86_64-win64.dll";
#elif _WIN32 #elif _WIN32
static const char* LibName = "..\..\..\libShaderFile-i386-win32.dll";
static const char* LibName = "..\\..\\..\\libShaderFile-i386-win32.dll";
#elif __linux__ && (__amd64 || __x86_64 || _M_AMD64 || __ppc64__) #elif __linux__ && (__amd64 || __x86_64 || _M_AMD64 || __ppc64__)
static const char* LibName = "../../../libShaderFile-x86_64-linux.so"; static const char* LibName = "../../../libShaderFile-x86_64-linux.so";
#elif __linux__ && (__i386 || _X86_) #elif __linux__ && (__i386 || _X86_)
@@ -13,6 +14,19 @@ static const char* LibName = "../../../libShaderFile-i386-linux.so";
# error 'unknown operation system' # error 'unknown operation system'
#endif #endif


class FileReader : public lsf::IFileReader
{
public:
virtual bool loadStream(const std::string& filename, std::ostream& os)
{
std::ifstream fs(filename.c_str());
if (!fs)
return false;
os << fs.rdbuf();
return true;
}
};

int main(int argc, char **argv) int main(int argc, char **argv)
{ {
try try
@@ -28,7 +42,8 @@ int main(int argc, char **argv)
// create and load shader file // create and load shader file
lsf::ShaderFile shaderFile(lib); lsf::ShaderFile shaderFile(lib);
shaderFile.loadFromFile(argv[1]);
FileReader reader;
shaderFile.loadFromFunc(argv[1], reader);
const lsf::Library& l = shaderFile.getLibrary(); const lsf::Library& l = shaderFile.getLibrary();


+ 2
- 2
header/examples/c/example.c 파일 보기

@@ -2,9 +2,9 @@
#include "../../libShaderFile.h" #include "../../libShaderFile.h"


#if _WIN64 #if _WIN64
# define LIB_NAME "..\..\..\libShaderFile-x86_64-win64.dll"
# define LIB_NAME "..\\..\\..\\libShaderFile-x86_64-win64.dll"
#elif _WIN32 #elif _WIN32
# define LIB_NAME "..\..\..\libShaderFile-i386-win32.dll"
# define LIB_NAME "..\\..\\..\\libShaderFile-i386-win32.dll"
#elif __linux__ && (__amd64 || __x86_64 || _M_AMD64 || __ppc64__) #elif __linux__ && (__amd64 || __x86_64 || _M_AMD64 || __ppc64__)
# define LIB_NAME "../../../libShaderFile-x86_64-linux.so" # define LIB_NAME "../../../libShaderFile-x86_64-linux.so"
#elif __linux__ && (__i386 || _X86_) #elif __linux__ && (__i386 || _X86_)


+ 22
- 3
header/examples/delphi/example.dpr 파일 보기

@@ -3,15 +3,34 @@ program example;
{$APPTYPE CONSOLE} {$APPTYPE CONSOLE}


uses uses
SysUtils,
SysUtils, Classes,
ulibShaderFile; ulibShaderFile;


type
TFileReader = class(TInterfacedObject, IlsfFileReader)
public
function LoadStream(const aFilename: String; const aStream: TStream): Boolean;
end;

var var
i: Integer; i: Integer;
s: String; s: String;
ShaderFile: TlsfShaderFile; ShaderFile: TlsfShaderFile;
Generator: TlsfGenerator; Generator: TlsfGenerator;


function TFileReader.LoadStream(const aFilename: String; const aStream: TStream): Boolean;
var
fs: TFileStream;
begin
fs := TFileStream.Create(aFilename, fmOpenRead);
try
aStream.CopyFrom(fs, fs.Size - fs.Position);
result := true;
finally
FreeAndNil(fs);
end;
end;

begin begin
lsf_init(ExtractFilePath(ParamStr(0)) + '..\..\..\libShaderFile-i386-win32.dll'); lsf_init(ExtractFilePath(ParamStr(0)) + '..\..\..\libShaderFile-i386-win32.dll');
try try
@@ -22,8 +41,8 @@ begin
end; end;
ShaderFile := TlsfShaderFile.Create; ShaderFile := TlsfShaderFile.Create;
try try
ShaderFile.LoadFromFile(ParamStr(1));
Generator := TlsfGenerator.Create(ShaderFile, ParamStr(2));
ShaderFile.LoadFromFunc(ParamStr(1), TFileReader.Create);
Generator := TlsfGenerator.Create(ShaderFile, Trim(ParamStr(2)));
try try
i := 3; i := 3;
while (i < ParamCount) do begin while (i < ParamCount) do begin


+ 21
- 2
header/examples/fpc/example.lpr 파일 보기

@@ -1,7 +1,7 @@
program example; program example;


uses uses
sysutils, variants,
sysutils, variants, Classes,
ulibShaderFile; ulibShaderFile;


const const
@@ -17,12 +17,31 @@ const
{$ERROR 'unknown operation system'} {$ERROR 'unknown operation system'}
{$IFEND} {$IFEND}


type
TFileReader = class(TInterfacedObject, IlsfFileReader)
public
function LoadStream(const aFilename: String; const aStream: TStream): Boolean;
end;

var var
i: Integer; i: Integer;
s: String; s: String;
ShaderFile: TlsfShaderFile; ShaderFile: TlsfShaderFile;
Generator: TlsfGenerator; Generator: TlsfGenerator;


function TFileReader.LoadStream(const aFilename: String; const aStream: TStream): Boolean;
var
fs: TFileStream;
begin
fs := TFileStream.Create(aFilename, fmOpenRead);
try
aStream.CopyFrom(fs, fs.Size - fs.Position);
result := true;
finally
FreeAndNil(fs);
end;
end;

begin begin
lsf_init(ExtractFilePath(ParamStr(0)) + LibName); lsf_init(ExtractFilePath(ParamStr(0)) + LibName);
try try
@@ -33,7 +52,7 @@ begin
end; end;
ShaderFile := TlsfShaderFile.Create; ShaderFile := TlsfShaderFile.Create;
try try
ShaderFile.LoadFromFile(ParamStr(1));
ShaderFile.LoadFromFunc(ParamStr(1), TFileReader.Create);
Generator := TlsfGenerator.Create(ShaderFile, ParamStr(2)); Generator := TlsfGenerator.Create(ShaderFile, ParamStr(2));
try try
i := 3; i := 3;


+ 83
- 3
header/libShaderFile.h 파일 보기

@@ -2,6 +2,7 @@
#define LIB_SHADER_FILE_H #define LIB_SHADER_FILE_H


#include <stdint.h> #include <stdint.h>
#include <stdbool.h>


/**********************************************************************************************************************************/ /**********************************************************************************************************************************/
/* public interface */ /* public interface */
@@ -15,6 +16,7 @@
#define LSF_ERR_NOT_INIT 0x00000001 #define LSF_ERR_NOT_INIT 0x00000001
#define LSF_ERR_INVALID_HANDLE_SHADER_FILE 0x00000010 #define LSF_ERR_INVALID_HANDLE_SHADER_FILE 0x00000010
#define LSF_ERR_INVALID_HANDLE_SHADER_GENERATOR 0x00000011 #define LSF_ERR_INVALID_HANDLE_SHADER_GENERATOR 0x00000011
#define LSF_ERR_INVALID_HANDLE_STREAM 0x00000012
#define LSF_ERR_INVALID_GENERATOR_NAME 0x00000020 #define LSF_ERR_INVALID_GENERATOR_NAME 0x00000020
#define LSF_ERR_INVALID_PROPERTY_INDEX 0x00000021 #define LSF_ERR_INVALID_PROPERTY_INDEX 0x00000021
#define LSF_ERR_INVALID_PROPERTY_NAME 0x00000022 #define LSF_ERR_INVALID_PROPERTY_NAME 0x00000022
@@ -36,6 +38,10 @@
#define LSF_ERR_INVALID_METHOD_NAME 0x00002002 #define LSF_ERR_INVALID_METHOD_NAME 0x00002002
#define LSF_ERR_UNKNOWN 0xFFFFFFFF #define LSF_ERR_UNKNOWN 0xFFFFFFFF


#define LSF_SEEK_BEG 0
#define LSF_SEEK_CUR 1
#define LSF_SEEK_END 2

#if __MINGW32__ #if __MINGW32__
# define WINAPI __stdcall # define WINAPI __stdcall
#else #else
@@ -44,10 +50,30 @@


typedef uint32_t lsf_error_code_t; typedef uint32_t lsf_error_code_t;
typedef uint32_t lsf_log_level_t; typedef uint32_t lsf_log_level_t;
typedef uint32_t lsf_seek_origin_t;

typedef void* lsf_shader_file_handle_t; typedef void* lsf_shader_file_handle_t;
typedef void* lsf_shader_generator_handle_t; typedef void* lsf_shader_generator_handle_t;
typedef void* lsf_stream_handle_t;

/** function pointer to write log messages
* @param loglevel log level of current message (see LSF_LOGLEVEL_*)
* @param msg message to log
* @param userargs user defined arguments */
typedef void (WINAPI *lsf_shader_file_log_callback_t)(const lsf_log_level_t loglevel, const char* msg, const void* userargs);

/** function pointer to save shader code
* @param filename filename to save shader code to
* @param handle handle to stream data (use lsf_stream_* methods to read/write data)
* @param userargs user defined arguments */
typedef void (WINAPI *lsf_save_data_callback_t)(const char* filename, const lsf_stream_handle_t handle, const void* userargs);

/** function pointer to load shader code
* @param filename filename to load shader code from
* @param handle handle to stream data (use lsf_stream_* methods to read/write data)
* @param userargs user defined arguments */
typedef bool (WINAPI *lsf_load_data_callback_t)(const char* filename, const lsf_stream_handle_t handle, const void* userargs);


typedef void (*lsf_shader_file_log_callback_t)(const lsf_log_level_t loglevel, const char* msg, const void* userargs);


/** create a new shader file handle /** create a new shader file handle
* @returns shader file handle or NULL (check lsf_get_last_error_* for more details) */ * @returns shader file handle or NULL (check lsf_get_last_error_* for more details) */
@@ -66,12 +92,28 @@ lsf_error_code_t (WINAPI *lsf_shader_file_set_log_callback) (const lsf_shader_fi
* @returns error code (see LSF_ERR_*) */ * @returns error code (see LSF_ERR_*) */
lsf_error_code_t (WINAPI *lsf_shader_file_load_from_file) (const lsf_shader_file_handle_t handle, const char* filename); lsf_error_code_t (WINAPI *lsf_shader_file_load_from_file) (const lsf_shader_file_handle_t handle, const char* filename);


/** load shader code from function
* @param handle handle of shader file to load
* @param filename name of the file to load code from (will be passed to callback; can be used as key to identify data to load)
* @param callback function to call to request data
* @param userargs user defined arguments (will be passed to callback)
* @returns error code (see LSF_ERR_) */
lsf_error_code_t (WINAPI *lsf_shader_file_load_from_func) (const lsf_shader_file_handle_t handle, const char* filename, const lsf_load_data_callback_t callback, const void* userargs);

/** save shader file code to a given file /** save shader file code to a given file
* @param handle handle of shader file to save to file * @param handle handle of shader file to save to file
* @param filename file to save shader code to * @param filename file to save shader code to
* @returns error code (see LSF_ERR_*) */ * @returns error code (see LSF_ERR_*) */
lsf_error_code_t (WINAPI *lsf_shader_file_save_to_file) (const lsf_shader_file_handle_t handle, const char* filename); lsf_error_code_t (WINAPI *lsf_shader_file_save_to_file) (const lsf_shader_file_handle_t handle, const char* filename);


/** save shader code to function
* @param handle handle of shader file to load
* @param filename name of the file to save code to (will be passed to callback; can be used as key to identify data to save)
* @param callback function to call to save data
* @param userargs user defined arguments (will be passed to callback)
* @returns error code (see LSF_ERR_) */
lsf_error_code_t (WINAPI *lsf_shader_file_save_to_func) (const lsf_shader_file_handle_t handle, const char* filename, const lsf_load_data_callback_t callback, const void* userargs);

/** generate a list of all code generators in a shader file /** generate a list of all code generators in a shader file
* @param handle shader file handle to generate list for * @param handle shader file handle to generate list for
* @returns list of code generators (seperated by linebreak) or NULL (check lsf_get_last_error_* for more details) */ * @returns list of code generators (seperated by linebreak) or NULL (check lsf_get_last_error_* for more details) */
@@ -111,14 +153,14 @@ const char* (WINAPI *lsf_generator_get_property_by_name) (const lsf_shader_gener
* @param handle generator handle * @param handle generator handle
* @param index index of the property (see lsf_generator_get_property_names to calculate property index) * @param index index of the property (see lsf_generator_get_property_names to calculate property index)
* @param value new value of the property * @param value new value of the property
* @return property value or NULL (check lsf_get_last_error_* for more details) */
* @return error code (see LSF_ERR_*) */
lsf_error_code_t (WINAPI *lsf_generator_set_property) (const lsf_shader_generator_handle_t handle, const int index, const char* value); lsf_error_code_t (WINAPI *lsf_generator_set_property) (const lsf_shader_generator_handle_t handle, const int index, const char* value);


/** set a property value by its name /** set a property value by its name
* @param handle generator handle * @param handle generator handle
* @param name name of the property * @param name name of the property
* @param value new value of the property * @param value new value of the property
* @return property value or NULL (check lsf_get_last_error_* for more details) */
* @return error code (see LSF_ERR_*) */
lsf_error_code_t (WINAPI *lsf_generator_set_property_by_name) (const lsf_shader_generator_handle_t handle, const char* name, const char* value); lsf_error_code_t (WINAPI *lsf_generator_set_property_by_name) (const lsf_shader_generator_handle_t handle, const char* name, const char* value);


/** generate shader code /** generate shader code
@@ -132,6 +174,38 @@ const char* (WINAPI *lsf_generator_generate_code) (const lsf_shader_generator_ha
lsf_error_code_t (WINAPI *lsf_generator_destroy) (const lsf_shader_generator_handle_t handle); lsf_error_code_t (WINAPI *lsf_generator_destroy) (const lsf_shader_generator_handle_t handle);




/** get size of stream
* @param handle stream handle to get size from
* @returns stream size on success, -1 otherwise (check lsf_get_last_error_* for more details) */
int (WINAPI *lsf_stream_get_size) (const lsf_stream_handle_t handle);

/** set size of stream
* @param handle stream handle to set size from
* @returns error code (see LSF_ERR_*) */
lsf_error_code_t (WINAPI *lsf_stream_set_size) (const lsf_stream_handle_t handle, const int size);

/** seek stream
* @param handle stream handle to seek
* @param offset number of bytes to use as offset
* @param origin seek origin
* @returns new position on success, -1 otherwise (check lsf_get_last_error_* for more details) */
int (WINAPI *lsf_stream_seek) (const lsf_stream_handle_t handle, const int offset, const lsf_seek_origin_t origin);

/** read data from stream
* @param handle stream handle to read data from
* @param buffer buffer to copy data into
* @param size number of bytes to read
* @returns number of read bytes on success, -1 otherwise (check lsf_get_last_error_* for more details) */
int (WINAPI *lsf_stream_read) (const lsf_stream_handle_t handle, const void *buffer, const int size);

/** write data to stream
* @param handle stream handle to write data to
* @param buffer buffer to copy data from
* @param size number of bytes to write
* @returns number of written bytes on success, -1 otherwise (check lsf_get_last_error_* for more details) */
int (WINAPI *lsf_stream_write) (const lsf_stream_handle_t handle, const void *buffer, const int size);


/** get last error code /** get last error code
* @return error code of last failed operation */ * @return error code of last failed operation */
lsf_error_code_t (WINAPI *lsf_get_last_error_code) (); lsf_error_code_t (WINAPI *lsf_get_last_error_code) ();
@@ -242,6 +316,12 @@ int lsf_init(const char* libname)
LoadProc(lsf_generator_generate_code, "lsf_Generator_generateCode"); LoadProc(lsf_generator_generate_code, "lsf_Generator_generateCode");
LoadProc(lsf_generator_destroy, "lsf_Generator_destroy"); LoadProc(lsf_generator_destroy, "lsf_Generator_destroy");
LoadProc(lsf_stream_get_size, "lsf_Stream_getSize");
LoadProc(lsf_stream_set_size, "lsf_Stream_setSize");
LoadProc(lsf_stream_seek, "lsf_Stream_seek");
LoadProc(lsf_stream_read, "lsf_Stream_read");
LoadProc(lsf_stream_write, "lsf_Stream_write");
LoadProc(lsf_init_intern, "lsf_init"); LoadProc(lsf_init_intern, "lsf_init");
LoadProc(lsf_get_last_error_code, "lsf_getLastErrorCode"); LoadProc(lsf_get_last_error_code, "lsf_getLastErrorCode");
LoadProc(lsf_get_last_error_msg, "lsf_getLastErrorMsg"); LoadProc(lsf_get_last_error_msg, "lsf_getLastErrorMsg");


+ 348
- 27
header/libShaderFile.hpp 파일 보기

@@ -3,6 +3,7 @@


#include <string> #include <string>
#include <sstream> #include <sstream>
#include <cstring>
#include <vector> #include <vector>
#include <stdint.h> #include <stdint.h>


@@ -35,6 +36,7 @@ namespace lsf
enum ErrorCode enum ErrorCode
{ {
errUnknown = -1,
errNone = 0x00000000, errNone = 0x00000000,
errNotInit = 0x00000001, errNotInit = 0x00000001,
errInvalidHandleShaderFile = 0x00000010, errInvalidHandleShaderFile = 0x00000010,
@@ -58,7 +60,32 @@ namespace lsf
errInvalidLibraryName = 0x00002000, errInvalidLibraryName = 0x00002000,
errInvalidLibraryHandle = 0x00002001, errInvalidLibraryHandle = 0x00002001,
errInvalidMethodName = 0x00002002, errInvalidMethodName = 0x00002002,
errUnknown = 0xffffffff,
};
enum SeekOrigin
{
soBeg = 0,
soCur = 1,
soEnd = 2,
};
class IFileReader
{
public:
/** request to load shader code
* @param filename filename/name to identify data to be load
* @param is input stream to write loaded data into
* @returns TRUE on success, FALSE otherwise */
virtual bool loadStream(const std::string& filename, std::ostream& os) = 0;
};
class IFileWriter
{
public:
/** request to store shader code
* @param filename filename/name to identify data to be saved
* @param os output stream to read saved data from */
virtual void saveStream(const std::string& filename, std::istream& is) = 0;
}; };
/** class to load and manage shared library */ /** class to load and manage shared library */
@@ -135,10 +162,20 @@ namespace lsf
* @param filename file to load shader code from */ * @param filename file to load shader code from */
void loadFromFile(std::string filename); void loadFromFile(std::string filename);
/** load shader file from function
* @param filename file to load shader code from
* @param reader file reader to use for loading */
void loadFromFunc(std::string filename, IFileReader& reader);
/** save shader file to a given file /** save shader file to a given file
* @param filename file to save shader code to */ * @param filename file to save shader code to */
void saveToFile(std::string filename) const; void saveToFile(std::string filename) const;
/** save shader file to function
* @param filename file to save shader code to
* @param writer file writer to use for saving */
void saveToFunc(std::string filename, IFileWriter& writer);
/** constructor /** constructor
* @param library library this shader file is attached to */ * @param library library this shader file is attached to */
ShaderFile(const Library& library); ShaderFile(const Library& library);
@@ -186,7 +223,7 @@ namespace lsf
const ShaderFile& getShaderFile() const; const ShaderFile& getShaderFile() const;
/** get a vector of all known properties /** get a vector of all known properties
* @return vecotr with all known properties */
* @return vector with all known properties */
const StringVec& getPropertyNames() const; const StringVec& getPropertyNames() const;
/** get the value of a single property by its name /** get the value of a single property by its name
@@ -255,7 +292,6 @@ namespace lsf







/**********************************************************************************************************************************/ /**********************************************************************************************************************************/
/* private implementation */ /* private implementation */
/**********************************************************************************************************************************/ /**********************************************************************************************************************************/
@@ -288,35 +324,244 @@ int libClose(lsf::Library::Handle handle)
/* Library::Impl ******************************************************************************************************************/ /* Library::Impl ******************************************************************************************************************/
struct lsf::Library::Impl struct lsf::Library::Impl
{ {
typedef ShaderFile::Handle (WINAPI *lsf_shader_file_create_t) ();
typedef void (WINAPI *lsf_shader_file_log_callback_t) (const LogLevel loglevel, const char* msg, void* userargs);
typedef ErrorCode (WINAPI *lsf_shader_file_set_log_callback_t) (const ShaderFile::Handle handle, const lsf_shader_file_log_callback_t callback, void* userargs);
typedef ErrorCode (WINAPI *lsf_shader_file_load_from_file_t) (const ShaderFile::Handle handle, const char* filename);
typedef ErrorCode (WINAPI *lsf_shader_file_save_to_file_t) (const ShaderFile::Handle handle, const char* filename);
typedef const char* (WINAPI *lsf_shader_file_get_generator_names_t) (const ShaderFile::Handle handle);
typedef ErrorCode (WINAPI *lsf_shader_file_destroy_t) (const ShaderFile::Handle handle);
typedef Generator::Handle (WINAPI *lsf_generator_create_t) (const ShaderFile::Handle handle, const char* name);
typedef const char* (WINAPI *lsf_generator_get_property_names_t) (const Generator::Handle handle);
typedef const char* (WINAPI *lsf_generator_get_property_t) (const Generator::Handle handle, const int index);
typedef const char* (WINAPI *lsf_generator_get_property_by_name_t) (const Generator::Handle handle, const char* name);
typedef ErrorCode (WINAPI *lsf_generator_set_property_t) (const Generator::Handle handle, const int index, const char* value);
typedef ErrorCode (WINAPI *lsf_generator_set_property_by_name_t) (const Generator::Handle handle, const char* name, const char* value);
typedef const char* (WINAPI *lsf_generator_generate_code_t) (const Generator::Handle handle);
typedef ErrorCode (WINAPI *lsf_generator_destroy_t) (const Generator::Handle handle);

typedef ErrorCode (WINAPI *lsf_init_t) ();
typedef ErrorCode (WINAPI *lsf_get_last_error_code_t) ();
typedef const char* (WINAPI *lsf_get_last_error_msg_t) ();
typedef const char* (WINAPI *lsf_get_last_error_trace_t) ();
typedef ErrorCode (WINAPI *lsf_finish_t) ();
public:
typedef void* StreamHandle;
/* pure callbacks */
typedef void (WINAPI *lsf_shader_file_log_callback_t) (const LogLevel loglevel, const char* msg, void* userargs);
typedef void (WINAPI *lsf_save_data_callback_t) (const char* filename, const StreamHandle handle, const void* userargs);
typedef bool (WINAPI *lsf_load_data_callback_t) (const char* filename, const StreamHandle handle, const void* userargs);
/* ShaderFile */
typedef ShaderFile::Handle (WINAPI *lsf_shader_file_create_t) ();
typedef ErrorCode (WINAPI *lsf_shader_file_set_log_callback_t) (const ShaderFile::Handle handle, const lsf_shader_file_log_callback_t callback, void* userargs);
typedef ErrorCode (WINAPI *lsf_shader_file_load_from_file_t) (const ShaderFile::Handle handle, const char* filename);
typedef ErrorCode (WINAPI *lsf_shader_file_load_from_func_t) (const ShaderFile::Handle handle, const char* filename, const lsf_load_data_callback_t callback, const void* userargs);
typedef ErrorCode (WINAPI *lsf_shader_file_save_to_file_t) (const ShaderFile::Handle handle, const char* filename);
typedef ErrorCode (WINAPI *lsf_shader_file_save_to_func_t) (const ShaderFile::Handle handle, const char* filename, const lsf_save_data_callback_t callback, const void* userargs);
typedef const char* (WINAPI *lsf_shader_file_get_generator_names_t) (const ShaderFile::Handle handle);
typedef ErrorCode (WINAPI *lsf_shader_file_destroy_t) (const ShaderFile::Handle handle);
/* Generator */
typedef Generator::Handle (WINAPI *lsf_generator_create_t) (const ShaderFile::Handle handle, const char* name);
typedef const char* (WINAPI *lsf_generator_get_property_names_t) (const Generator::Handle handle);
typedef const char* (WINAPI *lsf_generator_get_property_t) (const Generator::Handle handle, const int index);
typedef const char* (WINAPI *lsf_generator_get_property_by_name_t) (const Generator::Handle handle, const char* name);
typedef ErrorCode (WINAPI *lsf_generator_set_property_t) (const Generator::Handle handle, const int index, const char* value);
typedef ErrorCode (WINAPI *lsf_generator_set_property_by_name_t) (const Generator::Handle handle, const char* name, const char* value);
typedef const char* (WINAPI *lsf_generator_generate_code_t) (const Generator::Handle handle);
typedef ErrorCode (WINAPI *lsf_generator_destroy_t) (const Generator::Handle handle);
/* Stream */
typedef int (WINAPI *lsf_stream_get_size_t) (const StreamHandle handle);
typedef ErrorCode (WINAPI *lsf_stream_set_size_t) (const StreamHandle handle, const int size);
typedef int (WINAPI *lsf_stream_seek_t) (const StreamHandle handle, const int offset, const SeekOrigin origin);
typedef int (WINAPI *lsf_stream_read_t) (const StreamHandle handle, void *buffer, const int size);
typedef int (WINAPI *lsf_stream_write_t) (const StreamHandle handle, const void *buffer, const int size);
/* Library */
typedef ErrorCode (WINAPI *lsf_init_t) ();
typedef ErrorCode (WINAPI *lsf_get_last_error_code_t) ();
typedef const char* (WINAPI *lsf_get_last_error_msg_t) ();
typedef const char* (WINAPI *lsf_get_last_error_trace_t) ();
typedef ErrorCode (WINAPI *lsf_finish_t) ();

public:
class InStreamBuf : public std::streambuf
{
private:
const Library::Impl& _impl;
StreamHandle _handle;
const std::streamsize _bufferSize;
const std::streamsize _putBack;
std::vector<char> _buffer;
void resetBuffer()
{
char* end = &_buffer.front() + _buffer.size();
setg(end, end, end);
}
protected:
virtual int_type underflow()
{
if (gptr() < egptr())
return traits_type::to_int_type(*gptr());
char *base = &_buffer.front();
char *start = base;
if (eback() == base)
{
std::memmove(base, egptr() - _putBack, _putBack);
start += _putBack;
}
int n = _impl.lsf_stream_read(_handle, start, _buffer.size() - (start - base));
if (n < 0)
throw Exception(_impl.lsf_get_last_error_msg(), _impl.lsf_get_last_error_code());
if (n == 0)
return traits_type::eof();
setg(base, start, start + n);
return traits_type::to_int_type(*gptr());
}
virtual std::streamsize xsgetn(char* buffer, std::streamsize count)
{
std::streamsize ret = 0;
char* b = buffer;
std::streamsize s = std::min(static_cast<std::streamsize>(egptr() - gptr()), count);
if (s > 0)
{
memmove(b, gptr(), s);
gbump(s);
b += s;
ret += s;
count -= s;
resetBuffer();
}
if (count > 0)
{
int n = _impl.lsf_stream_read(_handle, b, count);
if (n < 0)
throw Exception(_impl.lsf_get_last_error_msg(), _impl.lsf_get_last_error_code());
ret += n;
}
return ret;
}
virtual pos_type seekoff(off_type offset, std::ios_base::seekdir dir, std::ios_base::openmode mode)
{
if (mode & std::ios_base::out)
return (std::streampos(-1));
int pos = 0;
switch(dir)
{
case std::ios::beg:
pos = _impl.lsf_stream_seek(_handle, offset, soBeg);
break;
case std::ios::cur:
pos = _impl.lsf_stream_seek(_handle, offset, soCur);
break;
case std::ios::end:
pos = _impl.lsf_stream_seek(_handle, offset, soEnd);
break;
}
if (pos < 0)
throw Exception(_impl.lsf_get_last_error_msg(), _impl.lsf_get_last_error_code());
resetBuffer();
return pos;
}

virtual pos_type seekpos(pos_type offset, std::ios_base::openmode mode)
{
return seekoff(offset, std::ios::beg, mode);
}
public:
InStreamBuf(const Impl& impl, StreamHandle handle, std::streamsize bufferSize = 1024, std::streamsize putBack = 32) :
_impl (impl),
_handle (handle),
_bufferSize (bufferSize),
_putBack (putBack),
_buffer (bufferSize)
{
resetBuffer();
};
};


class OutStreamBuf : public std::streambuf
{
private:
const Library::Impl& _impl;
StreamHandle _handle;
const std::streamsize _bufferSize;
std::vector<char> _buffer;
inline int doWrite(const char* buffer, int size)
{
int ret = _impl.lsf_stream_write(_handle, buffer, size);
if (ret < 0)
throw Exception(_impl.lsf_get_last_error_msg(), _impl.lsf_get_last_error_code());
}
bool doFlush()
{
int n = pptr() - pbase();
pbump(-n);
int ret = doWrite(pbase(), n);
return (ret == n);
}
protected:
virtual int_type overflow(int_type ch)
{
if (ch != traits_type::eof())
{
if (pptr() > epptr())
throw Exception("internal error in OutStreamBuf", errUnknown);
*pptr() = ch;
pbump(1);
if (doFlush())
return ch;
}
return traits_type::eof();
}

virtual int sync()
{
return (doFlush() ? 0 : -1);
}

virtual std::streamsize xsputn(const char *buffer, std::streamsize count)
{
if (!doFlush())
return 0;
return doWrite(buffer, count);
}
virtual pos_type seekoff(off_type offset, std::ios_base::seekdir dir, std::ios_base::openmode mode)
{
if (mode & std::ios_base::in)
return (std::streampos(-1));
int pos = 0;
switch(dir)
{
case std::ios::beg:
pos = _impl.lsf_stream_seek(_handle, offset, soBeg);
break;
case std::ios::cur:
pos = _impl.lsf_stream_seek(_handle, offset, soCur);
break;
case std::ios::end:
pos = _impl.lsf_stream_seek(_handle, offset, soEnd);
break;
}
if (pos < 0)
throw Exception(_impl.lsf_get_last_error_msg(), _impl.lsf_get_last_error_code());
return pos;
}

virtual pos_type seekpos(pos_type offset, std::ios_base::openmode mode)
{
return seekoff(offset, std::ios::beg, mode);
}
public:
OutStreamBuf(const Impl& impl, StreamHandle handle, std::streamsize bufferSize = 1024) :
_impl (impl),
_handle (handle),
_bufferSize (bufferSize),
_buffer (bufferSize)
{
char *base = &_buffer.front();
setp(base, base + _buffer.size() - 1);
};
};
public:
const Library& library; const Library& library;


lsf_shader_file_create_t lsf_shader_file_create; lsf_shader_file_create_t lsf_shader_file_create;
lsf_shader_file_set_log_callback_t lsf_shader_file_set_log_callback; lsf_shader_file_set_log_callback_t lsf_shader_file_set_log_callback;
lsf_shader_file_load_from_file_t lsf_shader_file_load_from_file; lsf_shader_file_load_from_file_t lsf_shader_file_load_from_file;
lsf_shader_file_load_from_func_t lsf_shader_file_load_from_func;
lsf_shader_file_save_to_file_t lsf_shader_file_save_to_file; lsf_shader_file_save_to_file_t lsf_shader_file_save_to_file;
lsf_shader_file_save_to_func_t lsf_shader_file_save_to_func;
lsf_shader_file_get_generator_names_t lsf_shader_file_get_generator_names; lsf_shader_file_get_generator_names_t lsf_shader_file_get_generator_names;
lsf_shader_file_destroy_t lsf_shader_file_destroy; lsf_shader_file_destroy_t lsf_shader_file_destroy;


@@ -329,6 +574,12 @@ struct lsf::Library::Impl
lsf_generator_generate_code_t lsf_generator_generate_code; lsf_generator_generate_code_t lsf_generator_generate_code;
lsf_generator_destroy_t lsf_generator_destroy; lsf_generator_destroy_t lsf_generator_destroy;


lsf_stream_get_size_t lsf_stream_get_size;
lsf_stream_set_size_t lsf_stream_set_size;
lsf_stream_seek_t lsf_stream_seek;
lsf_stream_read_t lsf_stream_read;
lsf_stream_write_t lsf_stream_write;

lsf_init_t lsf_init; lsf_init_t lsf_init;
lsf_get_last_error_code_t lsf_get_last_error_code; lsf_get_last_error_code_t lsf_get_last_error_code;
lsf_get_last_error_msg_t lsf_get_last_error_msg; lsf_get_last_error_msg_t lsf_get_last_error_msg;
@@ -341,7 +592,9 @@ struct lsf::Library::Impl
lsf_shader_file_create (NULL), lsf_shader_file_create (NULL),
lsf_shader_file_set_log_callback (NULL), lsf_shader_file_set_log_callback (NULL),
lsf_shader_file_load_from_file (NULL), lsf_shader_file_load_from_file (NULL),
lsf_shader_file_load_from_func (NULL),
lsf_shader_file_save_to_file (NULL), lsf_shader_file_save_to_file (NULL),
lsf_shader_file_save_to_func (NULL),
lsf_shader_file_get_generator_names (NULL), lsf_shader_file_get_generator_names (NULL),
lsf_shader_file_destroy (NULL), lsf_shader_file_destroy (NULL),
@@ -354,12 +607,51 @@ struct lsf::Library::Impl
lsf_generator_generate_code (NULL), lsf_generator_generate_code (NULL),
lsf_generator_destroy (NULL), lsf_generator_destroy (NULL),
lsf_stream_get_size (NULL),
lsf_stream_set_size (NULL),
lsf_stream_seek (NULL),
lsf_stream_read (NULL),
lsf_stream_write (NULL),
lsf_init (NULL), lsf_init (NULL),
lsf_get_last_error_code (NULL), lsf_get_last_error_code (NULL),
lsf_get_last_error_msg (NULL), lsf_get_last_error_msg (NULL),
lsf_get_last_error_trace (NULL), lsf_get_last_error_trace (NULL),
lsf_finish (NULL) lsf_finish (NULL)
{ }; { };

public:
struct DataCallbackArgs
{
const Impl* impl;
IFileReader* reader;
IFileWriter* writer;
};
/** callback method to save data
* @param filename filename to save data to
* @param handle stream handle with data to save
* @param userargs user defined arguments */
static void WINAPI saveDataCallback(const char* filename, const StreamHandle handle, const void* userargs)
{
const DataCallbackArgs *args = static_cast<const DataCallbackArgs*>(userargs);
InStreamBuf buf(*args->impl, handle);
std::istream is(&buf);
args->writer->saveStream(filename, is);
}
/** callback method to load data
* @param filename filename to load data from
* @param handle stream handle to write loaded data to
* @param userargs user defined arguments
* @returns TRUE on success, FALSE otherwise */
static bool WINAPI loadDataCallback(const char* filename, const StreamHandle handle, const void* userargs)
{
const DataCallbackArgs *args = static_cast<const DataCallbackArgs*>(userargs);
OutStreamBuf buf(*args->impl, handle);
std::ostream os(&buf);
return args->reader->loadStream(filename, os);
}
}; };


/* Library ************************************************************************************************************************/ /* Library ************************************************************************************************************************/
@@ -390,7 +682,9 @@ lsf::Library::Library(std::string libName) :
loadProc(_handle, _impl->lsf_shader_file_create, "lsf_ShaderFile_create"); loadProc(_handle, _impl->lsf_shader_file_create, "lsf_ShaderFile_create");
loadProc(_handle, _impl->lsf_shader_file_set_log_callback, "lsf_ShaderFile_setLogCallback"); loadProc(_handle, _impl->lsf_shader_file_set_log_callback, "lsf_ShaderFile_setLogCallback");
loadProc(_handle, _impl->lsf_shader_file_load_from_file, "lsf_ShaderFile_loadFromFile"); loadProc(_handle, _impl->lsf_shader_file_load_from_file, "lsf_ShaderFile_loadFromFile");
loadProc(_handle, _impl->lsf_shader_file_load_from_func, "lsf_ShaderFile_loadFromFunc");
loadProc(_handle, _impl->lsf_shader_file_save_to_file, "lsf_ShaderFile_saveToFile"); loadProc(_handle, _impl->lsf_shader_file_save_to_file, "lsf_ShaderFile_saveToFile");
loadProc(_handle, _impl->lsf_shader_file_save_to_func, "lsf_ShaderFile_saveToFunc");
loadProc(_handle, _impl->lsf_shader_file_get_generator_names, "lsf_ShaderFile_getGeneratorNames"); loadProc(_handle, _impl->lsf_shader_file_get_generator_names, "lsf_ShaderFile_getGeneratorNames");
loadProc(_handle, _impl->lsf_shader_file_destroy, "lsf_ShaderFile_destroy"); loadProc(_handle, _impl->lsf_shader_file_destroy, "lsf_ShaderFile_destroy");
@@ -403,6 +697,12 @@ lsf::Library::Library(std::string libName) :
loadProc(_handle, _impl->lsf_generator_generate_code, "lsf_Generator_generateCode"); loadProc(_handle, _impl->lsf_generator_generate_code, "lsf_Generator_generateCode");
loadProc(_handle, _impl->lsf_generator_destroy, "lsf_Generator_destroy"); loadProc(_handle, _impl->lsf_generator_destroy, "lsf_Generator_destroy");
loadProc(_handle, _impl->lsf_stream_get_size, "lsf_Stream_getSize");
loadProc(_handle, _impl->lsf_stream_set_size, "lsf_Stream_setSize");
loadProc(_handle, _impl->lsf_stream_seek, "lsf_Stream_seek");
loadProc(_handle, _impl->lsf_stream_read, "lsf_Stream_read");
loadProc(_handle, _impl->lsf_stream_write, "lsf_Stream_write");
loadProc(_handle, _impl->lsf_init, "lsf_init"); loadProc(_handle, _impl->lsf_init, "lsf_init");
loadProc(_handle, _impl->lsf_get_last_error_code, "lsf_getLastErrorCode"); loadProc(_handle, _impl->lsf_get_last_error_code, "lsf_getLastErrorCode");
loadProc(_handle, _impl->lsf_get_last_error_msg, "lsf_getLastErrorMsg"); loadProc(_handle, _impl->lsf_get_last_error_msg, "lsf_getLastErrorMsg");
@@ -443,14 +743,34 @@ void lsf::ShaderFile::loadFromFile(std::string filename)
{ {
ErrorCode err = _impl.lsf_shader_file_load_from_file(_handle, filename.c_str()); ErrorCode err = _impl.lsf_shader_file_load_from_file(_handle, filename.c_str());
if (err != errNone) if (err != errNone)
throw Exception("unable to load file", err);
throw Exception(_impl.lsf_get_last_error_msg(), err);
}

void lsf::ShaderFile::loadFromFunc(std::string filename, IFileReader& reader)
{
lsf::Library::Impl::DataCallbackArgs args;
args.impl = &_impl;
args.reader = &reader;
ErrorCode err = _impl.lsf_shader_file_load_from_func(_handle, filename.c_str(), &Library::Impl::loadDataCallback, &args);
if (err != errNone)
throw Exception(_impl.lsf_get_last_error_msg(), err);
} }


void lsf::ShaderFile::saveToFile(std::string filename) const void lsf::ShaderFile::saveToFile(std::string filename) const
{ {
ErrorCode err = _impl.lsf_shader_file_load_from_file(_handle, filename.c_str()); ErrorCode err = _impl.lsf_shader_file_load_from_file(_handle, filename.c_str());
if (err != errNone) if (err != errNone)
throw Exception("unable to load file", err);
throw Exception(_impl.lsf_get_last_error_msg(), err);
}

void lsf::ShaderFile::saveToFunc(std::string filename, IFileWriter& writer)
{
lsf::Library::Impl::DataCallbackArgs args;
args.impl = &_impl;
args.writer = &writer;
ErrorCode err = _impl.lsf_shader_file_save_to_func(_handle, filename.c_str(), &Library::Impl::saveDataCallback, &args);
if (err != errNone)
throw Exception(_impl.lsf_get_last_error_msg(), err);
} }


lsf::ShaderFile::ShaderFile(const Library& library) : lsf::ShaderFile::ShaderFile(const Library& library) :
@@ -572,3 +892,4 @@ lsf::Exception::~Exception() throw()








+ 197
- 9
header/ulibShaderFile.pas 파일 보기

@@ -26,6 +26,7 @@ type
errNotInit = $00000001, errNotInit = $00000001,
errInvalidHandleShaderFile = $00000010, errInvalidHandleShaderFile = $00000010,
errInvalidHandleShaderGenerator = $00000011, errInvalidHandleShaderGenerator = $00000011,
errInvalidHandleStream = $00000012,
errInvalidGeneratorName = $00000020, errInvalidGeneratorName = $00000020,
errInvalidPropertyIndex = $00000021, errInvalidPropertyIndex = $00000021,
errInvalidPropertyName = $00000022, errInvalidPropertyName = $00000022,
@@ -47,16 +48,28 @@ type
errInvalidMethodName = $00002002 errInvalidMethodName = $00002002
); );


{$Z4}
TlsfSeekOrigin = (
soBeg = 0,
soCur = 1,
soEnd = 2
);

TlsfShaderFileHandle = Pointer; TlsfShaderFileHandle = Pointer;
TlsfGeneratorHandle = Pointer; TlsfGeneratorHandle = Pointer;
TlsfStreamHandle = Pointer;


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
TlsfShaderFileLogEvent = procedure(const aLogLevel: TlsfLogLevel; const aMsg: PAnsiChar; const aUserArgs: Pointer); stdcall; TlsfShaderFileLogEvent = procedure(const aLogLevel: TlsfLogLevel; const aMsg: PAnsiChar; const aUserArgs: Pointer); stdcall;
TlsfSaveDataCallback = procedure(const aFilename: PAnsiChar; const aHandle: TlsfStreamHandle; const aUserArgs: Pointer); stdcall;
TlsfLoadDataCallback = function(const aFilename: PAnsiChar; const aHandle: TlsfStreamHandle; const aUserArgs: Pointer): Boolean; stdcall;


Tlsf_ShaderFile_create = function: TlsfShaderFileHandle; stdcall; Tlsf_ShaderFile_create = function: TlsfShaderFileHandle; stdcall;
Tlsf_ShaderFile_setLogCallback = function(const aHandle: TlsfShaderFileHandle; const aCallback: TlsfShaderFileLogEvent; const aUserArgs: Pointer): TlsfErrorCode; stdcall; Tlsf_ShaderFile_setLogCallback = function(const aHandle: TlsfShaderFileHandle; const aCallback: TlsfShaderFileLogEvent; const aUserArgs: Pointer): TlsfErrorCode; stdcall;
Tlsf_ShaderFile_loadFromFile = function(const aHandle: TlsfShaderFileHandle; const aFilename: PAnsiChar): TlsfErrorCode; stdcall; Tlsf_ShaderFile_loadFromFile = function(const aHandle: TlsfShaderFileHandle; const aFilename: PAnsiChar): TlsfErrorCode; stdcall;
Tlsf_ShaderFile_loadFromFunc = function(const aHandle: TlsfShaderFileHandle; const aFilename: PAnsiChar; const aCallback: TlsfLoadDataCallback; const aUserArgs: Pointer): TlsfErrorCode; stdcall;
Tlsf_ShaderFile_saveToFile = function(const aHandle: TlsfShaderFileHandle; const aFilename: PAnsiChar): TlsfErrorCode; stdcall; Tlsf_ShaderFile_saveToFile = function(const aHandle: TlsfShaderFileHandle; const aFilename: PAnsiChar): TlsfErrorCode; stdcall;
Tlsf_ShaderFile_saveToFunc = function(const aHandle: TlsfShaderFileHandle; const aFilename: PAnsiChar; const aCallback: TlsfSaveDataCallback; const aUserArgs: Pointer): TlsfErrorCode; stdcall;
Tlsf_ShaderFile_getGeneratorNames = function(const aHandle: TlsfShaderFileHandle): PAnsiChar; stdcall; Tlsf_ShaderFile_getGeneratorNames = function(const aHandle: TlsfShaderFileHandle): PAnsiChar; stdcall;
Tlsf_ShaderFile_destroy = function(const aHandle: TlsfShaderFileHandle): TlsfErrorCode; stdcall; Tlsf_ShaderFile_destroy = function(const aHandle: TlsfShaderFileHandle): TlsfErrorCode; stdcall;


@@ -69,12 +82,29 @@ type
Tlsf_Generator_generateCode = function(const aHandle: TlsfGeneratorHandle): PAnsiChar; stdcall; Tlsf_Generator_generateCode = function(const aHandle: TlsfGeneratorHandle): PAnsiChar; stdcall;
Tlsf_Generator_destroy = function(const aHandle: TlsfGeneratorHandle): TlsfErrorCode; stdcall; Tlsf_Generator_destroy = function(const aHandle: TlsfGeneratorHandle): TlsfErrorCode; stdcall;


Tlsf_Stream_getSize = function(const aHandle: TlsfStreamHandle): Integer; stdcall;
Tlsf_Stream_setSize = function(const aHandle: TlsfStreamHandle; const aSize: Integer): TlsfErrorCode; stdcall;
Tlsf_Stream_seek = function(const aHandle: TlsfStreamHandle; const aOffset: Integer; const aOrigin: TlsfSeekOrigin): Integer; stdcall;
Tlsf_Stream_read = function(const aHandle: TlsfStreamHandle; const aBuffer: Pointer; const aSize: Integer): Integer; stdcall;
Tlsf_Stream_write = function(const aHandle: TlsfStreamHandle; const aBuffer: Pointer; const aSize: Integer): Integer; stdcall;

Tlsf_init = function: TlsfErrorCode; stdcall; Tlsf_init = function: TlsfErrorCode; stdcall;
Tlsf_getLastErrorCode = function: TlsfErrorCode; stdcall; Tlsf_getLastErrorCode = function: TlsfErrorCode; stdcall;
Tlsf_getLastErrorMsg = function: PAnsiChar; stdcall; Tlsf_getLastErrorMsg = function: PAnsiChar; stdcall;
Tlsf_getLastErrorTrace = function: PAnsiChar; stdcall; Tlsf_getLastErrorTrace = function: PAnsiChar; stdcall;
Tlsf_finish = function: TlsfErrorCode; stdcall; Tlsf_finish = function: TlsfErrorCode; stdcall;


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
IlsfFileReader = interface
['{1820220E-0043-491A-B841-19A4B11C6090}']
function LoadStream(const aFilename: String; const aStream: TStream): Boolean;
end;

IlsfFileWriter = interface
['{FEF0760E-402B-4627-9171-273AE215FADB}']
procedure SaveStream(const aFilename: String; const aStream: TStream);
end;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
TlsfShaderFile = class(TObject) TlsfShaderFile = class(TObject)
private private
@@ -85,7 +115,9 @@ type
property Handle: TlsfShaderFileHandle read fHandle; property Handle: TlsfShaderFileHandle read fHandle;


procedure LoadFromFile(const aFilename: String); procedure LoadFromFile(const aFilename: String);
procedure LoadFromFunc(const aFilename: String; const aFileReader: IlsfFileReader);
procedure SaveToFile(const aFilename: String); procedure SaveToFile(const aFilename: String);
procedure SaveToFunc(const aFilename: String; const aFileWriter: IlsfFileWriter);


constructor Create; constructor Create;
destructor Destroy; override; destructor Destroy; override;
@@ -130,7 +162,9 @@ var
lsf_ShaderFile_create: Tlsf_ShaderFile_create; lsf_ShaderFile_create: Tlsf_ShaderFile_create;
lsf_ShaderFile_setLogCallback: Tlsf_ShaderFile_setLogCallback; lsf_ShaderFile_setLogCallback: Tlsf_ShaderFile_setLogCallback;
lsf_ShaderFile_loadFromFile: Tlsf_ShaderFile_loadFromFile; lsf_ShaderFile_loadFromFile: Tlsf_ShaderFile_loadFromFile;
lsf_ShaderFile_loadFromFunc: Tlsf_ShaderFile_loadFromFunc;
lsf_ShaderFile_saveToFile: Tlsf_ShaderFile_saveToFile; lsf_ShaderFile_saveToFile: Tlsf_ShaderFile_saveToFile;
lsf_ShaderFile_saveToFunc: Tlsf_ShaderFile_saveToFunc;
lsf_ShaderFile_getGeneratorNames: Tlsf_ShaderFile_getGeneratorNames; lsf_ShaderFile_getGeneratorNames: Tlsf_ShaderFile_getGeneratorNames;
lsf_ShaderFile_destroy: Tlsf_ShaderFile_destroy; lsf_ShaderFile_destroy: Tlsf_ShaderFile_destroy;


@@ -143,6 +177,12 @@ var
lsf_Generator_generateCode: Tlsf_Generator_generateCode; lsf_Generator_generateCode: Tlsf_Generator_generateCode;
lsf_Generator_destroy: Tlsf_Generator_destroy; lsf_Generator_destroy: Tlsf_Generator_destroy;


lsf_Stream_getSize: Tlsf_Stream_getSize;
lsf_Stream_setSize: Tlsf_Stream_setSize;
lsf_Stream_seek: Tlsf_Stream_seek;
lsf_Stream_read: Tlsf_Stream_read;
lsf_Stream_write: Tlsf_Stream_write;

lsf_getLastErrorCode: Tlsf_getLastErrorCode; lsf_getLastErrorCode: Tlsf_getLastErrorCode;
lsf_getLastErrorMsg: Tlsf_getLastErrorMsg; lsf_getLastErrorMsg: Tlsf_getLastErrorMsg;
lsf_getLastErrorTrace: Tlsf_getLastErrorTrace; lsf_getLastErrorTrace: Tlsf_getLastErrorTrace;
@@ -218,6 +258,21 @@ var
lsf_init_intern: Tlsf_init; lsf_init_intern: Tlsf_init;
lsf_finish_intern: Tlsf_finish; lsf_finish_intern: Tlsf_finish;


type
TlsfStream = class(TStream)
private
fHandle: TlsfStreamHandle;
protected
function GetSize: Int64; override;
procedure SetSize(NewSize: Longint); override; {$IFDEF FPC}overload;{$ENDIF}
public
function Seek(Offset: Longint; Origin: Word): Longint; override; {$IFDEF FPC}overload;{$ENDIF}
function Read(var Buffer; Count: Longint): Longint; override;
function Write(const Buffer; Count: Longint): Longint; override;

constructor Create(const aHandle: TlsfStreamHandle);
end;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure lsf_init(const aLibName: String); procedure lsf_init(const aLibName: String);


@@ -239,7 +294,9 @@ begin
lsf_ShaderFile_create := Tlsf_ShaderFile_create( LoadProc('lsf_ShaderFile_create')); lsf_ShaderFile_create := Tlsf_ShaderFile_create( LoadProc('lsf_ShaderFile_create'));
lsf_ShaderFile_setLogCallback := Tlsf_ShaderFile_setLogCallback( LoadProc('lsf_ShaderFile_setLogCallback')); lsf_ShaderFile_setLogCallback := Tlsf_ShaderFile_setLogCallback( LoadProc('lsf_ShaderFile_setLogCallback'));
lsf_ShaderFile_loadFromFile := Tlsf_ShaderFile_loadFromFile( LoadProc('lsf_ShaderFile_loadFromFile')); lsf_ShaderFile_loadFromFile := Tlsf_ShaderFile_loadFromFile( LoadProc('lsf_ShaderFile_loadFromFile'));
lsf_ShaderFile_loadFromFunc := Tlsf_ShaderFile_loadFromFunc( LoadProc('lsf_ShaderFile_loadFromFunc'));
lsf_ShaderFile_saveToFile := Tlsf_ShaderFile_saveToFile( LoadProc('lsf_ShaderFile_saveToFile')); lsf_ShaderFile_saveToFile := Tlsf_ShaderFile_saveToFile( LoadProc('lsf_ShaderFile_saveToFile'));
lsf_ShaderFile_saveToFunc := Tlsf_ShaderFile_saveToFunc( LoadProc('lsf_ShaderFile_saveToFunc'));
lsf_ShaderFile_getGeneratorNames := Tlsf_ShaderFile_getGeneratorNames( LoadProc('lsf_ShaderFile_getGeneratorNames')); lsf_ShaderFile_getGeneratorNames := Tlsf_ShaderFile_getGeneratorNames( LoadProc('lsf_ShaderFile_getGeneratorNames'));
lsf_ShaderFile_destroy := Tlsf_ShaderFile_destroy( LoadProc('lsf_ShaderFile_destroy')); lsf_ShaderFile_destroy := Tlsf_ShaderFile_destroy( LoadProc('lsf_ShaderFile_destroy'));


@@ -252,6 +309,12 @@ begin
lsf_Generator_generateCode := Tlsf_Generator_generateCode( LoadProc('lsf_Generator_generateCode')); lsf_Generator_generateCode := Tlsf_Generator_generateCode( LoadProc('lsf_Generator_generateCode'));
lsf_Generator_destroy := Tlsf_Generator_destroy( LoadProc('lsf_Generator_destroy')); lsf_Generator_destroy := Tlsf_Generator_destroy( LoadProc('lsf_Generator_destroy'));


lsf_Stream_getSize := Tlsf_Stream_getSize( LoadProc('lsf_Stream_getSize'));
lsf_Stream_setSize := Tlsf_Stream_setSize( LoadProc('lsf_Stream_setSize'));
lsf_Stream_seek := Tlsf_Stream_seek( LoadProc('lsf_Stream_seek'));
lsf_Stream_read := Tlsf_Stream_read( LoadProc('lsf_Stream_read'));
lsf_Stream_write := Tlsf_Stream_write( LoadProc('lsf_Stream_write'));

lsf_init_intern := Tlsf_init( LoadProc('lsf_init')); lsf_init_intern := Tlsf_init( LoadProc('lsf_init'));
lsf_getLastErrorCode := Tlsf_getLastErrorCode( LoadProc('lsf_getLastErrorCode')); lsf_getLastErrorCode := Tlsf_getLastErrorCode( LoadProc('lsf_getLastErrorCode'));
lsf_getLastErrorMsg := Tlsf_getLastErrorMsg( LoadProc('lsf_getLastErrorMsg')); lsf_getLastErrorMsg := Tlsf_getLastErrorMsg( LoadProc('lsf_getLastErrorMsg'));
@@ -267,27 +330,128 @@ end;
procedure lsf_finish; procedure lsf_finish;
begin begin
lsf_finish_intern(); lsf_finish_intern();
lsf_ShaderFile_create := nil;
lsf_ShaderFile_setLogCallback := nil;
lsf_ShaderFile_loadFromFile := nil;
lsf_ShaderFile_saveToFile := nil;
lsf_ShaderFile_getGeneratorNames := nil;
lsf_ShaderFile_destroy := nil;
lsf_getLastErrorCode := nil;
lsf_getLastErrorMsg := nil;
lsf_getLastErrorTrace := nil;

lsf_ShaderFile_create := nil;
lsf_ShaderFile_setLogCallback := nil;
lsf_ShaderFile_loadFromFile := nil;
lsf_ShaderFile_loadFromFunc := nil;
lsf_ShaderFile_saveToFile := nil;
lsf_ShaderFile_saveToFunc := nil;
lsf_ShaderFile_getGeneratorNames := nil;
lsf_ShaderFile_destroy := nil;

lsf_Generator_create := nil;
lsf_Generator_getPropertyNames := nil;
lsf_Generator_getProperty := nil;
lsf_Generator_getPropertyByName := nil;
lsf_Generator_setProperty := nil;
lsf_Generator_setPropertyByName := nil;
lsf_Generator_generateCode := nil;
lsf_Generator_destroy := nil;

lsf_Stream_getSize := nil;
lsf_Stream_setSize := nil;
lsf_Stream_seek := nil;
lsf_Stream_read := nil;
lsf_Stream_write := nil;

lsf_init_intern := nil;
lsf_getLastErrorCode := nil;
lsf_getLastErrorMsg := nil;
lsf_getLastErrorTrace := nil;
lsf_finish_intern := nil;

if (libHandle <> InvalidLibHandle) then begin if (libHandle <> InvalidLibHandle) then begin
LibClose(libHandle); LibClose(libHandle);
libHandle := InvalidLibHandle; libHandle := InvalidLibHandle;
end; end;
end; end;


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Callbacks From Library////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure LogCallback(const aLogLevel: TlsfLogLevel; const aMsg: PAnsiChar; const aUserArgs: Pointer); stdcall; procedure LogCallback(const aLogLevel: TlsfLogLevel; const aMsg: PAnsiChar; const aUserArgs: Pointer); stdcall;
begin begin
TlsfShaderFile(aUserArgs).LogMsg(aLogLevel, String(aMsg)); TlsfShaderFile(aUserArgs).LogMsg(aLogLevel, String(aMsg));
end; end;


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure SaveDataCallback(const aFilename: PAnsiChar; const aHandle: TlsfStreamHandle; const aUserArgs: Pointer); stdcall;
var
s: TlsfStream;
begin
s := TlsfStream.Create(aHandle);
try
IlsfFileWriter(aUserArgs).SaveStream(aFilename, s);
finally
FreeAndNil(s);
end;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function LoadDataCallback(const aFilename: PAnsiChar; const aHandle: TlsfStreamHandle; const aUserArgs: Pointer): Boolean; stdcall;
var
s: TlsfStream;
begin
s := TlsfStream.Create(aHandle);
try
result := IlsfFileReader(aUserArgs).LoadStream(aFilename, s);
finally
FreeAndNil(s);
end;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//TlsfStream////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TlsfStream.GetSize: Int64;
begin
result := lsf_Stream_getSize(fHandle);
if (result < 0) then
raise TlsfException.Create('error in TlsfStream.GetSize: ' + lsf_getLastErrorMsg(), lsf_getLastErrorCode());
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TlsfStream.SetSize(NewSize: Longint);
var
err: TlsfErrorCode;
begin
err := lsf_Stream_setSize(fHandle, NewSize);
if (err <> errNone) then
raise TlsfException.Create('error in TlsfStream.SetSize: ' + lsf_getLastErrorMsg(), lsf_getLastErrorCode());
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TlsfStream.Seek(Offset: Longint; Origin: Word): Longint;
begin
result := lsf_Stream_seek(fHandle, Offset, TlsfSeekOrigin(Origin));
if (result < 0) then
raise TlsfException.Create('error in TlsfStream.Seek: ' + lsf_getLastErrorMsg(), lsf_getLastErrorCode());
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TlsfStream.Read(var Buffer; Count: Longint): Longint;
begin
result := lsf_Stream_read(fHandle, @Buffer, Count);
if (result < 0) then
raise TlsfException.Create('error in TlsfStream.Read: ' + lsf_getLastErrorMsg(), lsf_getLastErrorCode());
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TlsfStream.Write(const Buffer; Count: Longint): Longint;
begin
result := lsf_Stream_write(fHandle, @Buffer, Count);
if (result < 0) then
raise TlsfException.Create('error in TlsfStream.Write: ' + lsf_getLastErrorMsg(), lsf_getLastErrorCode());
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
constructor TlsfStream.Create(const aHandle: TlsfStreamHandle);
begin
inherited Create;
fHandle := aHandle;
end;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//TlsfShaderFile//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TlsfShaderFile////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -306,6 +470,18 @@ begin
raise TlsfException.Create('error while loading from file: ' + lsf_getLastErrorMsg(), lsf_getLastErrorCode()); raise TlsfException.Create('error while loading from file: ' + lsf_getLastErrorMsg(), lsf_getLastErrorCode());
end; end;


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TlsfShaderFile.LoadFromFunc(const aFilename: String; const aFileReader: IlsfFileReader);
var
err: TlsfErrorCode;
begin
if not Assigned(aFileReader) then
LoadFromFile(aFilename);
err := lsf_ShaderFile_loadFromFunc(fHandle, PAnsiChar(AnsiString(aFilename)), @LoadDataCallback, Pointer(aFileReader));
if (err <> errNone) then
raise TlsfException.Create('error while loading from function: ' + lsf_getLastErrorMsg(), lsf_getLastErrorCode());
end;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TlsfShaderFile.SaveToFile(const aFilename: String); procedure TlsfShaderFile.SaveToFile(const aFilename: String);
var var
@@ -316,6 +492,18 @@ begin
raise TlsfException.Create('error while saving to file: ' + lsf_getLastErrorMsg(), lsf_getLastErrorCode()); raise TlsfException.Create('error while saving to file: ' + lsf_getLastErrorMsg(), lsf_getLastErrorCode());
end; end;


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TlsfShaderFile.SaveToFunc(const aFilename: String; const aFileWriter: IlsfFileWriter);
var
err: TlsfErrorCode;
begin
if not Assigned(aFileWriter) then
SaveToFile(aFilename);
err := lsf_ShaderFile_saveToFunc(fHandle, PAnsiChar(AnsiString(aFilename)), @SaveDataCallback, Pointer(aFileWriter));
if (err <> errNone) then
raise TlsfException.Create('error while saving to function: ' + lsf_getLastErrorMsg(), lsf_getLastErrorCode());
end;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
constructor TlsfShaderFile.Create; constructor TlsfShaderFile.Create;
var var


+ 227
- 38
libShaderFile.lpr 파일 보기

@@ -3,7 +3,7 @@ library libShaderFile;
{$mode objfpc}{$H+} {$mode objfpc}{$H+}


uses uses
SysUtils, variants,
SysUtils, variants, Classes,
uengShaderFile, uengShaderGenerator, uengShaderPart, uengShaderFile, uengShaderGenerator, uengShaderPart,
uengShaderFileGenerics, uengShaderFileTypes; uengShaderFileGenerics, uengShaderFileTypes;


@@ -20,6 +20,7 @@ const
LSF_ERR_NOT_INIT = $00000001; LSF_ERR_NOT_INIT = $00000001;
LSF_ERR_INVALID_HANDLE_SHADER_FILE = $00000010; LSF_ERR_INVALID_HANDLE_SHADER_FILE = $00000010;
LSF_ERR_INVALID_HANDLE_SHADER_GENERATOR = $00000011; LSF_ERR_INVALID_HANDLE_SHADER_GENERATOR = $00000011;
LSF_ERR_INVALID_HANDLE_STREAM = $00000012;
LSF_ERR_INVALID_GENERATOR_NAME = $00000020; LSF_ERR_INVALID_GENERATOR_NAME = $00000020;
LSF_ERR_INVALID_PROPERTY_INDEX = $00000021; LSF_ERR_INVALID_PROPERTY_INDEX = $00000021;
LSF_ERR_INVALID_PROPERTY_NAME = $00000022; LSF_ERR_INVALID_PROPERTY_NAME = $00000022;
@@ -38,13 +39,23 @@ const
LSF_ERR_SHADER_PART = $0000100B; LSF_ERR_SHADER_PART = $0000100B;
LSF_ERR_UNKNOWN = $FFFFFFFF; LSF_ERR_UNKNOWN = $FFFFFFFF;


{%H-}LSF_SEEK_BEG = soBeginning;
{%H-}LSF_SEEK_CUR = soCurrent;
{%H-}LSF_SEEK_END = soEnd;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
type type
TlsfErrorCode = Cardinal; TlsfErrorCode = Cardinal;
TlsfLogLevel = Cardinal; TlsfLogLevel = Cardinal;
TlsfSeekOrigin = Cardinal;
TlsfShaderFileHandle = Pointer; TlsfShaderFileHandle = Pointer;
TlsfShaderGeneratorHandle = Pointer; TlsfShaderGeneratorHandle = Pointer;
TlsfStreamHandle = Pointer;

TlsfShaderFileLogEvent = procedure(const aLogLevel: TlsfLogLevel; const aMsg: PAnsiChar; const aUserArgs: Pointer); stdcall; TlsfShaderFileLogEvent = procedure(const aLogLevel: TlsfLogLevel; const aMsg: PAnsiChar; const aUserArgs: Pointer); stdcall;
TlsfSaveDataCallback = procedure(const aFilename: PAnsiChar; const aHandle: TlsfStreamHandle; const aUserArgs: Pointer); stdcall;
TlsfLoadDataCallback = function(const aFilename: PAnsiChar; const aHandle: TlsfStreamHandle; const aUserArgs: Pointer): Boolean; stdcall;



//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//internal types and contstants///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //internal types and contstants/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -56,7 +67,9 @@ type
TPropertyMap = specialize TutlMap<string, variant>; TPropertyMap = specialize TutlMap<string, variant>;
TShaderGeneratorHandleHashSet = specialize TutlHashSet<TlsfShaderGeneratorHandle>; TShaderGeneratorHandleHashSet = specialize TutlHashSet<TlsfShaderGeneratorHandle>;
TShaderGeneratorHashSet = specialize TutlHashSet<TShaderGenerator>; TShaderGeneratorHashSet = specialize TutlHashSet<TShaderGenerator>;
TStreamHashSet = specialize TutlHashSet<TStream>;


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
TShaderGenerator = class(TObject) TShaderGenerator = class(TObject)
private private
fOwner: TShaderFile; fOwner: TShaderFile;
@@ -80,6 +93,7 @@ type
destructor Destroy; override; destructor Destroy; override;
end; end;


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
TShaderFile = class(TengShaderFile) TShaderFile = class(TengShaderFile)
private private
fLogUserArgs: Pointer; fLogUserArgs: Pointer;
@@ -93,7 +107,7 @@ type
property LogUserArgs: Pointer read fLogUserArgs write fLogUserArgs; property LogUserArgs: Pointer read fLogUserArgs write fLogUserArgs;
property GeneratorNames: String read fGeneratorNames; property GeneratorNames: String read fGeneratorNames;


procedure LoadFromFile(const aFilename: String); reintroduce;
procedure LoadFromFile(const aFilename: String; const aFileReader: IengShaderFileReader = nil); reintroduce;


function CreateGenerator(const aName: String): TShaderGenerator; function CreateGenerator(const aName: String): TShaderGenerator;
function DestroyGenerator(const aGenerator: TShaderGenerator): TlsfErrorCode; function DestroyGenerator(const aGenerator: TShaderGenerator): TlsfErrorCode;
@@ -103,10 +117,31 @@ type
end; end;
TShaderFileHashSet = specialize TutlHashSet<TShaderFile>; TShaderFileHashSet = specialize TutlHashSet<TShaderFile>;


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
TFileWriterProxy = class(TInterfacedObject, IengShaderFileWriter)
private
fUserArgs: Pointer;
fCallback: TlsfSaveDataCallback;
public
procedure SaveStream(const aFilename: String; const aStream: TStream);
constructor Create(const aCallback: TlsfSaveDataCallback; const aUserArgs: Pointer);
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
TFileReaderProxy = class(TInterfacedObject, IengShaderFileReader)
private
fUserArgs: Pointer;
fCallback: TlsfLoadDataCallback;
public
function LoadStream(const aFilename: String; const aStream: TStream): Boolean;
constructor Create(const aCallback: TlsfLoadDataCallback; const aUserArgs: Pointer);
end;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
var var
ShaderFiles: TShaderFileHashSet = nil; ShaderFiles: TShaderFileHashSet = nil;
ShaderGenerators: TShaderGeneratorHandleHashSet = nil; ShaderGenerators: TShaderGeneratorHandleHashSet = nil;
Streams: TStreamHashSet = nil;
LastErrorCode: TlsfErrorCode = LSF_ERR_NONE; LastErrorCode: TlsfErrorCode = LSF_ERR_NONE;
LastErrorMsg: String = ''; LastErrorMsg: String = '';
LastErrorTrace: String = ''; LastErrorTrace: String = '';
@@ -159,51 +194,41 @@ end;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function CheckIfInitialized: Boolean; function CheckIfInitialized: Boolean;
begin begin
try
result := Assigned(ShaderFiles);
if not result then
SetLastError(LSf_ERR_NOT_INIT, 'libShaderFile has not been initialized. call lsf_init before using any other methods.');
except
on e: Exception do begin
SetLastError(e);
result := false;
end;
end;
result := Assigned(ShaderFiles);
if not result then
SetLastError(LSf_ERR_NOT_INIT, 'libShaderFile has not been initialized. call lsf_init before using any other methods.');
end; end;


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function CheckShaderFileHandle(const aHandle: TlsfShaderFileHandle): Boolean; function CheckShaderFileHandle(const aHandle: TlsfShaderFileHandle): Boolean;
begin begin
try
result := CheckIfInitialized;
if result then begin
result := ShaderFiles.Contains(TShaderFile(aHandle));
if not result then
SetLastError(LSF_ERR_INVALID_HANDLE_SHADER_FILE, Format('0x%x is not a valid shader file handle', [{%H-}PtrUInt(aHandle)]));
end;
except
on e: Exception do begin
SetLastError(e);
result := false;
end;
result := CheckIfInitialized;
if result then begin
result := ShaderFiles.Contains(TShaderFile(aHandle));
if not result then
SetLastError(LSF_ERR_INVALID_HANDLE_SHADER_FILE, Format('0x%x is not a valid shader file handle', [{%H-}PtrUInt(aHandle)]));
end; end;
end; end;


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function CheckShaderGeneratorHandle(const aHandle: TlsfShaderGeneratorHandle): Boolean; function CheckShaderGeneratorHandle(const aHandle: TlsfShaderGeneratorHandle): Boolean;
begin begin
try
result := CheckIfInitialized;
if result then begin
result := ShaderGenerators.Contains(TShaderGenerator(aHandle));
if not result then
SetLastError(LSF_ERR_INVALID_HANDLE_SHADER_GENERATOR, Format('0x%x is not a valid shader generator handle', [{%H-}PtrUInt(aHandle)]));
end;
except
on e: Exception do begin
SetLastError(e);
result := false;
end;
result := CheckIfInitialized;
if result then begin
result := ShaderGenerators.Contains(TShaderGenerator(aHandle));
if not result then
SetLastError(LSF_ERR_INVALID_HANDLE_SHADER_GENERATOR, Format('0x%x is not a valid shader generator handle', [{%H-}PtrUInt(aHandle)]));
end;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function CheckStreamHandle(const aHandle: TlsfStreamHandle): Boolean;
begin
result := CheckIfInitialized;
if result then begin
result := Streams.Contains(TStream(aHandle));
if not result then
SetLastError(LSF_ERR_INVALID_HANDLE_STREAM, Format('0x%x is not a valid stream handle', [{%H-}PtrUInt(aHandle)]));
end; end;
end; end;


@@ -263,6 +288,23 @@ begin
end; end;
end; end;


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function lsf_ShaderFile_loadFromFunc(const aHandle: TlsfShaderFileHandle; const aFilename: PAnsiChar;
const aCallback: TlsfLoadDataCallback; const aUserArgs: Pointer): TlsfErrorCode; stdcall;
begin
try
result := LSF_ERR_NONE;
if not CheckShaderFileHandle(aHandle)
then result := LastErrorCode
else TShaderFile(aHandle).LoadFromFile(aFilename, TFileReaderProxy.Create(aCallback, aUserArgs));
except
on e: Exception do begin
SetLastError(e);
result := LastErrorCode;
end;
end;
end;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function lsf_ShaderFile_saveToFile(const aHandle: TlsfShaderFileHandle; const aFilename: PAnsiChar): TlsfErrorCode; stdcall; function lsf_ShaderFile_saveToFile(const aHandle: TlsfShaderFileHandle; const aFilename: PAnsiChar): TlsfErrorCode; stdcall;
begin begin
@@ -279,6 +321,23 @@ begin
end; end;
end; end;


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function lsf_ShaderFile_saveToFunc(const aHandle: TlsfShaderFileHandle; const aFilename: PAnsiChar;
const aCallback: TlsfSaveDataCallback; const aUserArgs: Pointer): TlsfErrorCode; stdcall;
begin
try
result := LSF_ERR_NONE;
if not CheckShaderFileHandle(aHandle)
then result := LastErrorCode
else TShaderFile(aHandle).SaveToFile(aFilename, TFileWriterProxy.Create(aCallback, aUserArgs));
except
on e: Exception do begin
SetLastError(e);
result := LastErrorCode;
end;
end;
end;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function lsf_ShaderFile_getGeneratorNames(const aHandle: TlsfShaderFileHandle): PAnsiChar; stdcall; function lsf_ShaderFile_getGeneratorNames(const aHandle: TlsfShaderFileHandle): PAnsiChar; stdcall;
begin begin
@@ -439,6 +498,83 @@ begin
end; end;
end; end;


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Stream////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function lsf_Stream_getSize(const aHandle: TlsfStreamHandle): Integer; stdcall;
begin
try
if CheckStreamHandle(aHandle)
then result := TStream(aHandle).Size
else result := -1;
except
on e: Exception do begin
SetLastError(e);
result := LastErrorCode;
end;
end;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function lsf_Stream_setSize(const aHandle: TlsfStreamHandle; const aSize: Integer): TlsfErrorCode; stdcall;
begin
try
if CheckStreamHandle(aHandle)
then TStream(aHandle).Size := aSize
else result := LastErrorCode;
except
on e: Exception do begin
SetLastError(e);
result := LastErrorCode;
end;
end;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function lsf_Stream_seek(const aHandle: TlsfStreamHandle; const aOffset: Integer; const aOrigin: TlsfSeekOrigin): Integer; stdcall;
begin
try
if CheckStreamHandle(aHandle)
then result := TStream(aHandle).Seek(aOrigin, aOrigin)
else result := -1;
except
on e: Exception do begin
SetLastError(e);
result := LastErrorCode;
end;
end;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function lsf_Stream_read(const aHandle: TlsfStreamHandle; const aBuffer: Pointer; const aSize: Integer): Integer; stdcall;
begin
try
if CheckStreamHandle(aHandle)
then result := TStream(aHandle).Read(aBuffer^, aSize)
else result := -1;
except
on e: Exception do begin
SetLastError(e);
result := LastErrorCode;
end;
end;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function lsf_Stream_write(const aHandle: TlsfStreamHandle; const aBuffer: Pointer; const aSize: Integer): Integer; stdcall;
begin
try
if CheckStreamHandle(aHandle)
then result := TStream(aHandle).Write(aBuffer^, aSize)
else result := -1;
except
on e: Exception do begin
SetLastError(e);
result := LastErrorCode;
end;
end;
end;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Global//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //Global////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -448,6 +584,7 @@ begin
result := LSF_ERR_NONE; result := LSF_ERR_NONE;
ShaderFiles := TShaderFileHashSet.Create(true); ShaderFiles := TShaderFileHashSet.Create(true);
ShaderGenerators := TShaderGeneratorHandleHashSet.Create(true); ShaderGenerators := TShaderGeneratorHandleHashSet.Create(true);
Streams := TStreamHashSet.Create(false);
except except
on e: Exception do begin on e: Exception do begin
SetLastError(e); SetLastError(e);
@@ -479,6 +616,7 @@ function lsf_finish: TlsfErrorCode; stdcall;
begin begin
try try
result := LSF_ERR_NONE; result := LSF_ERR_NONE;
FreeAndNil(Streams);
FreeAndNil(ShaderGenerators); FreeAndNil(ShaderGenerators);
FreeAndNil(ShaderFiles); FreeAndNil(ShaderFiles);
except except
@@ -493,7 +631,9 @@ exports
lsf_ShaderFile_create, lsf_ShaderFile_create,
lsf_ShaderFile_setLogCallback, lsf_ShaderFile_setLogCallback,
lsf_ShaderFile_loadFromFile, lsf_ShaderFile_loadFromFile,
lsf_ShaderFile_loadFromFunc,
lsf_ShaderFile_saveToFile, lsf_ShaderFile_saveToFile,
lsf_ShaderFile_saveToFunc,
lsf_ShaderFile_getGeneratorNames, lsf_ShaderFile_getGeneratorNames,
lsf_ShaderFile_destroy, lsf_ShaderFile_destroy,


@@ -506,6 +646,12 @@ exports
lsf_Generator_generateCode, lsf_Generator_generateCode,
lsf_Generator_destroy, lsf_Generator_destroy,


lsf_Stream_getSize,
lsf_Stream_setSize,
lsf_Stream_seek,
lsf_Stream_read,
lsf_Stream_write,

lsf_init, lsf_init,
lsf_getLastErrorCode, lsf_getLastErrorCode,
lsf_getLastErrorMsg, lsf_getLastErrorMsg,
@@ -617,11 +763,11 @@ begin
end; end;


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TShaderFile.LoadFromFile(const aFilename: String);
procedure TShaderFile.LoadFromFile(const aFilename: String; const aFileReader: IengShaderFileReader);
var var
i: Integer; i: Integer;
begin begin
inherited LoadFromFile(aFilename, nil);
inherited LoadFromFile(aFilename, aFileReader);
fGeneratorNames := ''; fGeneratorNames := '';
for i := 0 to GeneratorCount-1 do for i := 0 to GeneratorCount-1 do
fGeneratorNames := fGeneratorNames + inherited GeneratorNames[i] + sLineBreak; fGeneratorNames := fGeneratorNames + inherited GeneratorNames[i] + sLineBreak;
@@ -678,4 +824,47 @@ begin
inherited Destroy; inherited Destroy;
end; end;


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//TFileWriterProxy//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TFileWriterProxy.SaveStream(const aFilename: String; const aStream: TStream);
begin
Streams.Add(aStream);
try
fCallback(PAnsiChar(aFilename), TlsfStreamHandle(aStream), fUserArgs);
finally
Streams.Remove(aStream);
end;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
constructor TFileWriterProxy.Create(const aCallback: TlsfSaveDataCallback; const aUserArgs: Pointer);
begin
inherited Create;
fCallback := aCallback;
fUserArgs := aUserArgs;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//TFileReaderProxy//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TFileReaderProxy.LoadStream(const aFilename: String; const aStream: TStream): Boolean;
begin
Streams.Add(aStream);
try
result := fCallback(PAnsiChar(aFilename), TlsfStreamHandle(aStream), fUserArgs);
finally
Streams.Remove(aStream);
end;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
constructor TFileReaderProxy.Create(const aCallback: TlsfLoadDataCallback; const aUserArgs: Pointer);
begin
inherited Create;
fCallback := aCallback;
fUserArgs := aUserArgs;
end;


end. end.

불러오는 중...
취소
저장