diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..81b1890 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +build/ +*.rpx +*.elf +*.exe +src/resources/filelist.h +*.wbf +out/ diff --git a/Makefile b/Makefile index c7bad2d..1b18435 100644 --- a/Makefile +++ b/Makefile @@ -1,259 +1,160 @@ -#--------------------------------------------------------------------------------- -# Clear the implicit built in rules -#--------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- .SUFFIXES: -#--------------------------------------------------------------------------------- -ifeq ($(strip $(DEVKITPPC)),) -$(error "Please set DEVKITPPC in your environment. export DEVKITPPC=devkitPPC") -endif +#------------------------------------------------------------------------------- + ifeq ($(strip $(DEVKITPRO)),) -$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=devkitPRO") +$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=/devkitpro") endif -ifeq ($(strip $(WUT_ROOT)),) -$(error "Please ensure WUT_ROOT is in your environment.") -endif -export PATH := $(DEVKITPPC)/bin:$(PORTLIBS)/bin:$(PATH) -export LIBOGC_INC := $(DEVKITPRO)/libogc/include -export LIBOGC_LIB := $(DEVKITPRO)/libogc/lib/wii -export PORTLIBS := $(DEVKITPRO)/portlibs/ppc -PREFIX := powerpc-eabi- +TOPDIR ?= $(CURDIR) -export AS := $(PREFIX)as -export CC := $(PREFIX)gcc -export CXX := $(PREFIX)g++ -export AR := $(PREFIX)ar -export OBJCOPY := $(PREFIX)objcopy +include $(DEVKITPRO)/wut/share/wut_rules -export ELF2RPL := $(WUT_ROOT)/bin/elf2rpl - -#--------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- # TARGET is the name of the output # BUILD is the directory where object files & intermediate files will be placed # SOURCES is a list of directories containing source code -# INCLUDES is a list of directories containing extra header files -#--------------------------------------------------------------------------------- -TARGET := flappy_bird +# DATA is a list of directories containing data files +# INCLUDES is a list of directories containing header files +#------------------------------------------------------------------------------- +TARGET := $(notdir $(CURDIR)) BUILD := build -BUILD_DBG := $(TARGET)_dbg SOURCES := src \ - src/dynamic_libs \ src/fs \ - src/game \ src/gui \ - src/kernel \ - src/loader \ + src/game \ src/menu \ - src/network \ - src/patcher \ src/resources \ - src/settings \ - src/sounds \ src/system \ - src/utils \ - src/video \ - src/video/shaders + src/utils DATA := data \ data/images \ - data/fonts \ - data/sounds + data/sounds \ + data/fonts +INCLUDES := src -INCLUDES := src - -#--------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- # options for code generation -#--------------------------------------------------------------------------------- -CFLAGS := -std=gnu11 -mrvl -mcpu=750 -meabi -mhard-float -ffast-math \ - -O3 -Wall -Wextra -Wno-unused-parameter -Wno-strict-aliasing $(INCLUDE) -CXXFLAGS := -std=gnu++11 -mrvl -mcpu=750 -meabi -mhard-float -ffast-math \ - -O3 -Wall -Wextra -Wno-unused-parameter -Wno-strict-aliasing $(INCLUDE) -ASFLAGS := -mregnames -LDFLAGS := -nostartfiles -T $(WUT_ROOT)/rules/rpl.ld -pie -fPIE -z common-page-size=64 -z max-page-size=64 -lcrt \ - -Wl,-wrap,malloc,-wrap,free,-wrap,memalign,-wrap,calloc,-wrap,realloc,-wrap,malloc_usable_size \ - -Wl,-wrap,_malloc_r,-wrap,_free_r,-wrap,_realloc_r,-wrap,_calloc_r,-wrap,_memalign_r,-wrap,_malloc_usable_size_r \ - -Wl,-wrap,valloc,-wrap,_valloc_r,-wrap,_pvalloc_r,-wrap,__eabi -Wl,--gc-sections +#------------------------------------------------------------------------------- +CFLAGS := -g -Wall -O2 -ffunction-sections \ + $(MACHDEP) -#--------------------------------------------------------------------------------- -Q := @ -MAKEFLAGS += --no-print-directory -#--------------------------------------------------------------------------------- -# any extra libraries we wish to link with the project -#--------------------------------------------------------------------------------- -LIBS := -lcrt -lcoreinit -lproc_ui -lnsysnet -lsndcore2 -lvpad -lgx2 -lsysapp -lgd -lpng -lz -lfreetype -lmad -lvorbisidec +CFLAGS += $(INCLUDE) -D__WIIU__ -D__WUT__ -#--------------------------------------------------------------------------------- -# list of directories containing libraries, this must be the top level containing -# include and lib -#--------------------------------------------------------------------------------- -LIBDIRS := $(CURDIR) \ - $(DEVKITPPC)/ \ - $(DEVKITPPC)/lib/gcc/powerpc-eabi/4.8.2 \ - $(WUT_ROOT)/lib +CXXFLAGS := $(CFLAGS) -#--------------------------------------------------------------------------------- +ASFLAGS := -g $(ARCH) +LDFLAGS = -g $(ARCH) $(RPXSPECS) -Wl,-Map,$(notdir $*.map) + +LIBS := -lgui -lfreetype -lgd -lpng -ljpeg -lz -lmad -lvorbisidec -logg -lbz2 -lwut + +#------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level +# containing include and lib +#------------------------------------------------------------------------------- +LIBDIRS := $(PORTLIBS) $(WUT_ROOT) $(WUT_ROOT)/usr + +#------------------------------------------------------------------------------- # no real need to edit anything past this point unless you need to add additional # rules for different file extensions -#--------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- ifneq ($(BUILD),$(notdir $(CURDIR))) -#--------------------------------------------------------------------------------- -export PROJECTDIR := $(CURDIR) -export OUTPUT := $(CURDIR)/$(TARGETDIR)/$(TARGET) -export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ - $(foreach dir,$(DATA),$(CURDIR)/$(dir)) -export DEPSDIR := $(CURDIR)/$(BUILD) - -#--------------------------------------------------------------------------------- -# automatically build a list of object files for our project -#--------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- FILELIST := $(shell bash ./filelist.sh) -CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) -CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) -sFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) -SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.S))) -BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) -TTFFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.ttf))) -PNGFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.png))) - -#--------------------------------------------------------------------------------- -# use CXX for linking C++ projects, CC for standard C -#--------------------------------------------------------------------------------- -ifeq ($(strip $(CPPFILES)),) - export LD := $(CC) -else - export LD := $(CXX) -endif - -export OFILES := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) \ - $(sFILES:.s=.o) $(SFILES:.S=.o) \ - $(PNGFILES:.png=.png.o) $(addsuffix .o,$(BINFILES)) - -#--------------------------------------------------------------------------------- -# build a list of include paths -#--------------------------------------------------------------------------------- -export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ - -I$(CURDIR)/$(BUILD) -I$(WUT_ROOT)/include \ - -I$(PORTLIBS)/include -I$(PORTLIBS)/include/freetype2 - -#--------------------------------------------------------------------------------- -# build a list of library paths -#--------------------------------------------------------------------------------- -export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)) \ - -L$(LIBOGC_LIB) -L$(PORTLIBS)/lib export OUTPUT := $(CURDIR)/$(TARGET) -.PHONY: $(BUILD) clean install +export TOPDIR := $(CURDIR) + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) + +export DEPSDIR := $(CURDIR)/$(BUILD) + +CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) +CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) + +#------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) +#------------------------------------------------------------------------------- + export LD := $(CC) +#------------------------------------------------------------------------------- +else +#------------------------------------------------------------------------------- + export LD := $(CXX) +#------------------------------------------------------------------------------- +endif +#------------------------------------------------------------------------------- + +export OFILES_BIN := $(addsuffix .o,$(BINFILES)) +export OFILES_SRC := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) +export OFILES := $(OFILES_BIN) $(OFILES_SRC) +export HFILES_BIN := $(addsuffix .h,$(subst .,_,$(BINFILES))) + +export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + -I$(CURDIR)/$(BUILD) -I$(PORTLIBS_PATH)/ppc/include/freetype2 + +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) + +.PHONY: $(BUILD) clean all + +#------------------------------------------------------------------------------- +all: $(BUILD) -#--------------------------------------------------------------------------------- $(BUILD): @[ -d $@ ] || mkdir -p $@ -# @$(Q)$(MAKE) -C sd_loader @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile -#--------------------------------------------------------------------------------- -clean: clean_channel +#------------------------------------------------------------------------------- +clean: @echo clean ... - @rm -fr $(BUILD) $(OUTPUT).elf $(OUTPUT).bin $(BUILD_DBG).elf $(OUTPUT).rpx -# @$(MAKE) -C sd_loader clean + @rm -fr $(BUILD) $(TARGET).rpx $(TARGET).elf -#--------------------------------------------------------------------------------- -install_channel: $(BUILD) NUSPacker.jar encryptKeyWith - @cp $(OUTPUT).rpx channel/code/ - java -jar NUSPacker.jar -in "channel" -out "install_channel" - -NUSPacker.jar: - wget https://bitbucket.org/timogus/nuspacker/downloads/NUSPacker.jar - -encryptKeyWith: - @echo "Missing common key file \"encryptKeyWith\"! Insert the common key as string into \"encryptKeyWith\" file in the HBL Makefile path!" - @exit 1 - -clean_channel: - @rm -fr install_channel NUSPacker.jar fst.bin output tmp - -#--------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- else +.PHONY: all DEPENDS := $(OFILES:.o=.d) -#--------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- # main targets -#--------------------------------------------------------------------------------- -$(OUTPUT).rpx: $(OUTPUT).elf -$(OUTPUT).elf: $(OFILES) +#------------------------------------------------------------------------------- +all : $(OUTPUT).rpx -#--------------------------------------------------------------------------------- -# This rule links in binary data with the .jpg extension -#--------------------------------------------------------------------------------- -%.elf: $(OFILES) - @echo "linking ... $(TARGET).elf" - $(Q)$(LD) $^ $(LDFLAGS) -o $@ $(LIBPATHS) $(LIBS) -# $(Q)$(OBJCOPY) -S -R .comment -R .gnu.attributes ../$(BUILD_DBG).elf $@ +$(OUTPUT).rpx : $(OUTPUT).elf +$(OUTPUT).elf : $(OFILES) -#--------------------------------------------------------------------------------- -%.rpx: %.elf -#--------------------------------------------------------------------------------- - @echo "[RPX] $(notdir $@)" - @$(ELF2RPL) $^ $@ +$(OFILES_SRC) : $(HFILES_BIN) -#--------------------------------------------------------------------------------- -%.a: -#--------------------------------------------------------------------------------- - @echo $(notdir $@) - @rm -f $@ - @$(AR) -rc $@ $^ - -#--------------------------------------------------------------------------------- -%.o: %.cpp +#------------------------------------------------------------------------------- +# you need a rule like this for each extension you use as binary data +#------------------------------------------------------------------------------- +%.bin.o %_bin.h : %.bin @echo $(notdir $<) - @$(CXX) -MMD -MP -MF $(DEPSDIR)/$*.d $(CXXFLAGS) -c $< -o $@ $(ERROR_FILTER) + @$(bin2o) -#--------------------------------------------------------------------------------- -%.o: %.c +%.png.o %_png.h : %.png @echo $(notdir $<) - @$(CC) -MMD -MP -MF $(DEPSDIR)/$*.d $(CFLAGS) -c $< -o $@ $(ERROR_FILTER) - -#--------------------------------------------------------------------------------- -%.o: %.S + @$(bin2o) + +%.ogg.o %_ogg.h : %.ogg @echo $(notdir $<) - @$(CC) -MMD -MP -MF $(DEPSDIR)/$*.d -x assembler-with-cpp $(ASFLAGS) -c $< -o $@ $(ERROR_FILTER) - -#--------------------------------------------------------------------------------- -%.png.o : %.png + @$(bin2o) + +%.mp3.o %_mp3.h : %.mp3 @echo $(notdir $<) - @bin2s -a 32 $< | $(AS) -o $(@) - -#--------------------------------------------------------------------------------- -%.jpg.o : %.jpg + @$(bin2o) + +%.ttf.o %_ttf.h : %.ttf @echo $(notdir $<) - @bin2s -a 32 $< | $(AS) -o $(@) - -#--------------------------------------------------------------------------------- -%.ttf.o : %.ttf - @echo $(notdir $<) - @bin2s -a 32 $< | $(AS) -o $(@) - -#--------------------------------------------------------------------------------- -%.bin.o : %.bin - @echo $(notdir $<) - @bin2s -a 32 $< | $(AS) -o $(@) - -#--------------------------------------------------------------------------------- -%.wav.o : %.wav - @echo $(notdir $<) - @bin2s -a 32 $< | $(AS) -o $(@) - -#--------------------------------------------------------------------------------- -%.mp3.o : %.mp3 - @echo $(notdir $<) - @bin2s -a 32 $< | $(AS) -o $(@) - -#--------------------------------------------------------------------------------- -%.ogg.o : %.ogg - @echo $(notdir $<) - @bin2s -a 32 $< | $(AS) -o $(@) + @$(bin2o) -include $(DEPENDS) -#--------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- endif -#--------------------------------------------------------------------------------- +#------------------------------------------------------------------------------- diff --git a/README.md b/README.md index 3fdd511..572c8c0 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,15 @@ -#Flappy Bird RPX# +# Flappy Bird RPX A RPX Flappy Bird port for WiiU Assest from floppy bird HTML5 and original android game -#Installation# -Put the Flappy Bird folder on an SD card in the "install" folder. Use wup installer y mod to install to your NAND or USB. It is recommended to install to USB. Signature patching is required. - -#Usage# +# Usage Press A to begin the Game Press A to jump Press HOME to exit Avoid the pipes and the floor! -#Building# -In order to build this application, you need the custom liboGC and portlibs modified/created by dimok. You can find them on the loadiine_gx2 repo (https://github.com/dimok789/loadiine_gx2/releases/tag/v0.2). Simply put the files in your devkit folder and run the Makefile. +# Building +In order to build this application, you need [wut](https://github.com/devkitPro/wut/) and [libgui](https://github.com/wiiu-env/libgui) installed. #Credits:# dimok - WiiU librabries, dynamic_libs, examples, Homebrew Launcher diff --git a/src/Application.cpp b/src/Application.cpp index 8d3d2f2..1517ef5 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -19,13 +19,13 @@ #include #include #include "Application.h" -#include "common/common.h" #include "gui/FreeTypeGX.h" #include "gui/VPadController.h" #include "gui/WPadController.h" #include "resources/Resources.h" -#include "sounds/SoundHandler.hpp" +#include "gui/sounds/SoundHandler.hpp" #include "system/memory.h" +#include "system/AsyncDeleter.h" #include "utils/logger.h" Application *Application::applicationInstance = NULL; @@ -38,7 +38,7 @@ Application::Application() , video(NULL) , mainWindow(NULL) , fontSystem(NULL) - , exitCode(EXIT_RELAUNCH_ON_LOAD) + , exitCode(0) { controller[0] = new VPadController(GuiTrigger::CHANNEL_1); controller[1] = new WPadController(GuiTrigger::CHANNEL_2); @@ -47,10 +47,10 @@ Application::Application() controller[4] = new WPadController(GuiTrigger::CHANNEL_5); //! create bgMusic -// bgMusic = new GuiSound(Resources::GetFile("bgMusic.ogg"), Resources::GetFileSize("bgMusic.ogg")); -// bgMusic->SetLoop(true); -// bgMusic->Play(); -// bgMusic->SetVolume(50); + bgMusic = new GuiSound(Resources::GetFile("bgMusic.ogg"), Resources::GetFileSize("bgMusic.ogg")); + bgMusic->SetLoop(true); + bgMusic->Play(); + bgMusic->SetVolume(50); exitApplication = false; diff --git a/src/Application.h b/src/Application.h index 46dc8d9..84f1caa 100644 --- a/src/Application.h +++ b/src/Application.h @@ -18,7 +18,7 @@ #define _APPLICATION_H #include "menu/MainWindow.h" -#include "video/CVideo.h" +#include #include "system/CThread.h" // forward declaration diff --git a/src/common/common.h b/src/common/common.h deleted file mode 100644 index 5e353eb..0000000 --- a/src/common/common.h +++ /dev/null @@ -1,69 +0,0 @@ -#ifndef COMMON_H -#define COMMON_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "os_defs.h" - -#define HBL_VERSION_INT 200 - -#define CAFE_OS_SD_PATH "/vol/external01" -#define SD_PATH "fs:" -#define WIIU_PATH "/wiiu" - -/* Macros for libs */ -#define LIB_CORE_INIT 0 -#define LIB_NSYSNET 1 -#define LIB_GX2 2 -#define LIB_AOC 3 -#define LIB_AX 4 -#define LIB_FS 5 -#define LIB_OS 6 -#define LIB_PADSCORE 7 -#define LIB_SOCKET 8 -#define LIB_SYS 9 -#define LIB_VPAD 10 -#define LIB_NN_ACP 11 -#define LIB_SYSHID 12 -#define LIB_VPADBASE 13 - -// functions types -#define STATIC_FUNCTION 0 -#define DYNAMIC_FUNCTION 1 - -// none dynamic libs -#define LIB_LOADER 0x1001 - -#ifndef MEM_BASE -#define MEM_BASE (0x00800000) -#endif - -#define ELF_DATA_ADDR (*(volatile unsigned int*)(MEM_BASE + 0x1300 + 0x00)) -#define ELF_DATA_SIZE (*(volatile unsigned int*)(MEM_BASE + 0x1300 + 0x04)) -#define HBL_CHANNEL_OFFSET (0x1300 + 0x08) -#define HBL_CHANNEL (*(volatile unsigned int*)(MEM_BASE + HBL_CHANNEL_OFFSET)) -#define RPX_MAX_SIZE (*(volatile unsigned int*)(MEM_BASE + 0x1300 + 0x0C)) -#define RPX_MAX_CODE_SIZE (*(volatile unsigned int*)(MEM_BASE + 0x1300 + 0x10)) -#define MAIN_ENTRY_ADDR (*(volatile unsigned int*)(MEM_BASE + 0x1400 + 0x00)) -#define OS_FIRMWARE_OFFSET (0x1400 + 0x04) -#define OS_FIRMWARE (*(volatile unsigned int*)(MEM_BASE + 0x1400 + 0x04)) - -#define OS_SPECIFICS ((OsSpecifics*)(MEM_BASE + 0x1500)) - -#define MEM_AREA_TABLE ((s_mem_area*)(MEM_BASE + 0x1600)) -#define APP_BASE_MEM ((unsigned char*)(MEM_BASE + 0x2000)) - -#ifndef EXIT_SUCCESS -#define EXIT_SUCCESS 0 -#endif -#define EXIT_HBL_EXIT 0xFFFFFFFE -#define EXIT_RELAUNCH_ON_LOAD 0xFFFFFFFD - -#ifdef __cplusplus -} -#endif - -#endif /* COMMON_H */ - diff --git a/src/common/gx2_ext.h b/src/common/gx2_ext.h deleted file mode 100644 index 2746298..0000000 --- a/src/common/gx2_ext.h +++ /dev/null @@ -1,177 +0,0 @@ -#ifndef __GX2_EXTENSION_H -#define __GX2_EXTENSION_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include -#include -#include -#include -#include -#include -#include - -#define GX2_FALSE 0 -#define GX2_TRUE 1 -#define GX2_DISABLE 0 -#define GX2_ENABLE 1 - -#define GX2_COMMAND_BUFFER_SIZE 0x400000 -#define GX2_SCAN_BUFFER_ALIGNMENT 0x1000 -#define GX2_CONTEXT_STATE_ALIGNMENT 0x100 -#define GX2_SHADER_ALIGNMENT 0x100 -#define GX2_VERTEX_BUFFER_ALIGNMENT 0x40 -#define GX2_INDEX_BUFFER_ALIGNMENT 0x20 - -#define GX2_AA_BUFFER_CLEAR_VALUE 0xCC - -#define GX2_COMP_SEL_NONE 0x04040405 -#define GX2_COMP_SEL_X001 0x00040405 -#define GX2_COMP_SEL_XY01 0x00010405 -#define GX2_COMP_SEL_XYZ1 0x00010205 -#define GX2_COMP_SEL_XYZW 0x00010203 -#define GX2_COMP_SEL_XXXX 0x00000000 -#define GX2_COMP_SEL_YYYY 0x01010101 -#define GX2_COMP_SEL_ZZZZ 0x02020202 -#define GX2_COMP_SEL_WWWW 0x03030303 -#define GX2_COMP_SEL_WZYX 0x03020100 -#define GX2_COMP_SEL_WXYZ 0x03000102 - -static const u32 attribute_dest_comp_selector[20] = { - GX2_COMP_SEL_X001, GX2_COMP_SEL_XY01, GX2_COMP_SEL_X001, GX2_COMP_SEL_X001, GX2_COMP_SEL_XY01, GX2_COMP_SEL_X001, - GX2_COMP_SEL_X001, GX2_COMP_SEL_XY01, GX2_COMP_SEL_XY01, GX2_COMP_SEL_XYZ1, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_XYZW, - GX2_COMP_SEL_XY01, GX2_COMP_SEL_XY01, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_XYZ1, GX2_COMP_SEL_XYZ1, - GX2_COMP_SEL_XYZW, GX2_COMP_SEL_XYZW -}; - -static const u32 texture_comp_selector[54] = { - GX2_COMP_SEL_NONE, GX2_COMP_SEL_X001, GX2_COMP_SEL_XY01, GX2_COMP_SEL_NONE, GX2_COMP_SEL_NONE, GX2_COMP_SEL_X001, - GX2_COMP_SEL_X001, GX2_COMP_SEL_XY01, GX2_COMP_SEL_XYZ1, GX2_COMP_SEL_XYZ1, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_XYZW, - GX2_COMP_SEL_WZYX, GX2_COMP_SEL_X001, GX2_COMP_SEL_X001, GX2_COMP_SEL_XY01, GX2_COMP_SEL_XY01, GX2_COMP_SEL_NONE, - GX2_COMP_SEL_NONE, GX2_COMP_SEL_NONE, GX2_COMP_SEL_NONE, GX2_COMP_SEL_NONE, GX2_COMP_SEL_XYZ1, GX2_COMP_SEL_NONE, - GX2_COMP_SEL_NONE, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_WZYX, GX2_COMP_SEL_XY01, GX2_COMP_SEL_XY01, - GX2_COMP_SEL_XY01, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_NONE, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_XYZW, - GX2_COMP_SEL_NONE, GX2_COMP_SEL_NONE, GX2_COMP_SEL_NONE, GX2_COMP_SEL_XYZ1, GX2_COMP_SEL_XYZ1, GX2_COMP_SEL_X001, - GX2_COMP_SEL_XY01, GX2_COMP_SEL_XYZ1, GX2_COMP_SEL_NONE, GX2_COMP_SEL_NONE, GX2_COMP_SEL_NONE, GX2_COMP_SEL_XYZ1, - GX2_COMP_SEL_XYZ1, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_X001, GX2_COMP_SEL_XY01 -}; - -typedef struct _GX2Color { - u8 r, g, b, a; -} GX2Color; - -typedef struct _GX2ColorF32 { - f32 r, g, b, a; -} GX2ColorF32; - -static inline void GX2InitDepthBuffer(GX2DepthBuffer *depthBuffer, GX2SurfaceDim dim, u32 width, u32 height, u32 depth, GX2SurfaceFormat format, GX2AAMode aa) -{ - depthBuffer->surface.dim = dim; - depthBuffer->surface.width = width; - depthBuffer->surface.height = height; - depthBuffer->surface.depth = depth; - depthBuffer->surface.mipLevels = 1; - depthBuffer->surface.format = format; - depthBuffer->surface.aa = aa; - depthBuffer->surface.use = (GX2SurfaceUse)(((format==GX2_SURFACE_FORMAT_UNORM_R24_X8) || (format==GX2_SURFACE_FORMAT_FLOAT_D24_S8)) ? - GX2_SURFACE_USE_DEPTH_BUFFER : (GX2_SURFACE_USE_DEPTH_BUFFER | GX2_SURFACE_USE_TEXTURE)); - depthBuffer->surface.tileMode = GX2_TILE_MODE_DEFAULT; - depthBuffer->surface.swizzle = 0; - depthBuffer->viewMip = 0; - depthBuffer->viewFirstSlice = 0; - depthBuffer->viewNumSlices = depth; - depthBuffer->depthClear = 1.0f; - depthBuffer->stencilClear = 0; - depthBuffer->hiZPtr = NULL; - depthBuffer->hiZSize = 0; - GX2CalcSurfaceSizeAndAlignment(&depthBuffer->surface); - GX2InitDepthBufferRegs(depthBuffer); -} - -static inline void GX2InitColorBuffer(GX2ColorBuffer *colorBuffer, GX2SurfaceDim dim, u32 width, u32 height, u32 depth, GX2SurfaceFormat format, GX2AAMode aa) -{ - colorBuffer->surface.dim = dim; - colorBuffer->surface.width = width; - colorBuffer->surface.height = height; - colorBuffer->surface.depth = depth; - colorBuffer->surface.mipLevels = 1; - colorBuffer->surface.format = format; - colorBuffer->surface.aa = aa; - colorBuffer->surface.use = GX2_SURFACE_USE_TEXTURE_COLOR_BUFFER_TV; - colorBuffer->surface.imageSize = 0; - colorBuffer->surface.image = NULL; - colorBuffer->surface.mipmapSize = 0; - colorBuffer->surface.mipmaps = NULL; - colorBuffer->surface.tileMode = GX2_TILE_MODE_DEFAULT; - colorBuffer->surface.swizzle = 0; - colorBuffer->surface.alignment = 0; - colorBuffer->surface.pitch = 0; - u32 i; - for(i = 0; i < 13; i++) - colorBuffer->surface.mipLevelOffset[i] = 0; - colorBuffer->viewMip = 0; - colorBuffer->viewFirstSlice = 0; - colorBuffer->viewNumSlices = depth; - colorBuffer->aaBuffer = NULL; - colorBuffer->aaSize = 0; - for(i = 0; i < 5; i++) - colorBuffer->regs[i] = 0; - - GX2CalcSurfaceSizeAndAlignment(&colorBuffer->surface); - GX2InitColorBufferRegs(colorBuffer); -} - -static inline void GX2InitAttribStream(GX2AttribStream* attr, u32 location, u32 buffer, u32 offset, GX2AttribFormat format) -{ - attr->location = location; - attr->buffer = buffer; - attr->offset = offset; - attr->format = format; - attr->type = GX2_ATTRIB_INDEX_PER_VERTEX; - attr->aluDivisor = 0; - attr->mask = attribute_dest_comp_selector[format & 0xff]; - attr->endianSwap = GX2_ENDIAN_SWAP_DEFAULT; -} - -static inline void GX2InitTexture(GX2Texture *tex, u32 width, u32 height, u32 depth, u32 mipLevels, GX2SurfaceFormat format, GX2SurfaceDim dim, GX2TileMode tile) -{ - tex->surface.dim = dim; - tex->surface.width = width; - tex->surface.height = height; - tex->surface.depth = depth; - tex->surface.mipLevels = mipLevels; - tex->surface.format = format; - tex->surface.aa = GX2_AA_MODE1X; - tex->surface.use = GX2_SURFACE_USE_TEXTURE; - tex->surface.imageSize = 0; - tex->surface.image = NULL; - tex->surface.mipmapSize = 0; - tex->surface.mipmaps = NULL; - tex->surface.tileMode = tile; - tex->surface.swizzle = 0; - tex->surface.alignment = 0; - tex->surface.pitch = 0; - u32 i; - for(i = 0; i < 13; i++) - tex->surface.mipLevelOffset[i] = 0; - tex->viewFirstMip = 0; - tex->viewNumMips = mipLevels; - tex->viewFirstSlice = 0; - tex->viewNumSlices = depth; - tex->compMap = texture_comp_selector[format & 0x3f]; - for(i = 0; i < 5; i++) - tex->regs[i] = 0; - - GX2CalcSurfaceSizeAndAlignment(&tex->surface); - GX2InitTextureRegs(tex); -} - -#ifdef __cplusplus -} -#endif - -#endif /* COMMON_H */ - diff --git a/src/common/os_defs.h b/src/common/os_defs.h deleted file mode 100644 index b92c527..0000000 --- a/src/common/os_defs.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef __OS_DEFS_H_ -#define __OS_DEFS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct _OsSpecifics -{ - unsigned int addr_OSDynLoad_Acquire; - unsigned int addr_OSDynLoad_FindExport; - unsigned int addr_OSTitle_main_entry; - - unsigned int addr_KernSyscallTbl1; - unsigned int addr_KernSyscallTbl2; - unsigned int addr_KernSyscallTbl3; - unsigned int addr_KernSyscallTbl4; - unsigned int addr_KernSyscallTbl5; - - int (*LiWaitIopComplete)(int, int *); - int (*LiWaitIopCompleteWithInterrupts)(int, int *); - unsigned int addr_LiWaitOneChunk; - unsigned int addr_PrepareTitle_hook; - unsigned int addr_sgIsLoadingBuffer; - unsigned int addr_gDynloadInitialized; - unsigned int orig_LiWaitOneChunkInstr; -} OsSpecifics; - -typedef struct _s_mem_area -{ - unsigned int address; - unsigned int size; - struct _s_mem_area* next; -} s_mem_area; - -#ifdef __cplusplus -} -#endif - -#endif // __OS_DEFS_H_ diff --git a/src/common/types.h b/src/common/types.h deleted file mode 100644 index c1eb26c..0000000 --- a/src/common/types.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef TYPES_H -#define TYPES_H - -#include - -#endif /* TYPES_H */ - diff --git a/src/dynamic_libs/exports.h b/src/dynamic_libs/exports.h deleted file mode 100644 index 53ba488..0000000 --- a/src/dynamic_libs/exports.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef __EXPORTS_H_ -#define __EXPORTS_H_ - -#include -#include - -#define EXPORT_DECL(res, func, ...) res (* func)(__VA_ARGS__) __attribute__((section(".data"))) = 0; -#define EXPORT_VAR(type, var) type var __attribute__((section(".data"))); - - -#define EXPORT_FUNC_WRITE(func, val) *(u32*)(((u32)&func) + 0) = (u32)val - -#define OS_FIND_EXPORT(handle, func) funcPointer = 0; \ - OSDynLoad_FindExport(handle, 0, # func, (void**) &funcPointer); \ - if(!funcPointer) \ - OSFatal("Function " # func " is NULL"); \ - EXPORT_FUNC_WRITE(func, funcPointer); - -#define OS_FIND_EXPORT_EX(handle, func, func_p) \ - funcPointer = 0; \ - OSDynLoad_FindExport(handle, 0, # func, (void**) &funcPointer); \ - if(!funcPointer) \ - OSFatal("Function " # func " is NULL"); \ - EXPORT_FUNC_WRITE(func_p, funcPointer); - -#endif diff --git a/src/dynamic_libs/padscore_functions.c b/src/dynamic_libs/padscore_functions.c deleted file mode 100644 index 698ef63..0000000 --- a/src/dynamic_libs/padscore_functions.c +++ /dev/null @@ -1,50 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - ***************************************************************************/ -#include "exports.h" -#include "padscore_functions.h" - -EXPORT_DECL(void, KPADInit, void); -EXPORT_DECL(s32, WPADProbe, s32 chan, u32 * pad_type); -EXPORT_DECL(s32, WPADSetDataFormat, s32 chan, s32 format); -EXPORT_DECL(void, WPADEnableURCC, s32 enable); -EXPORT_DECL(void, WPADRead, s32 chan, void * data); -EXPORT_DECL(s32, KPADRead, s32 chan, void * data, u32 size); - -void InitPadScoreFunctionPointers(void) -{ - unsigned int *funcPointer = 0; - OSDynLoadModule padscore_handle; - OSDynLoad_Acquire("padscore.rpl", &padscore_handle); - - OS_FIND_EXPORT(padscore_handle, KPADInit); - OS_FIND_EXPORT(padscore_handle, WPADProbe); - OS_FIND_EXPORT(padscore_handle, WPADSetDataFormat); - OS_FIND_EXPORT(padscore_handle, WPADEnableURCC); - OS_FIND_EXPORT(padscore_handle, WPADRead); - OS_FIND_EXPORT(padscore_handle, KPADRead); - - KPADInit(); - WPADEnableURCC(1); -} - diff --git a/src/dynamic_libs/padscore_functions.h b/src/dynamic_libs/padscore_functions.h deleted file mode 100644 index 68cf989..0000000 --- a/src/dynamic_libs/padscore_functions.h +++ /dev/null @@ -1,122 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - ***************************************************************************/ -#ifndef __PAD_SCORE_FUNCTIONS_H_ -#define __PAD_SCORE_FUNCTIONS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "common/types.h" - -#define WPAD_BUTTON_LEFT 0x0001 -#define WPAD_BUTTON_RIGHT 0x0002 -#define WPAD_BUTTON_DOWN 0x0004 -#define WPAD_BUTTON_UP 0x0008 -#define WPAD_BUTTON_PLUS 0x0010 -#define WPAD_BUTTON_2 0x0100 -#define WPAD_BUTTON_1 0x0200 -#define WPAD_BUTTON_B 0x0400 -#define WPAD_BUTTON_A 0x0800 -#define WPAD_BUTTON_MINUS 0x1000 -#define WPAD_BUTTON_Z 0x2000 -#define WPAD_BUTTON_C 0x4000 -#define WPAD_BUTTON_HOME 0x8000 - -#define WPAD_CLASSIC_BUTTON_UP 0x0001 -#define WPAD_CLASSIC_BUTTON_LEFT 0x0002 -#define WPAD_CLASSIC_BUTTON_ZR 0x0004 -#define WPAD_CLASSIC_BUTTON_X 0x0008 -#define WPAD_CLASSIC_BUTTON_A 0x0010 -#define WPAD_CLASSIC_BUTTON_Y 0x0020 -#define WPAD_CLASSIC_BUTTON_B 0x0040 -#define WPAD_CLASSIC_BUTTON_ZL 0x0080 -#define WPAD_CLASSIC_BUTTON_R 0x0200 -#define WPAD_CLASSIC_BUTTON_PLUS 0x0400 -#define WPAD_CLASSIC_BUTTON_HOME 0x0800 -#define WPAD_CLASSIC_BUTTON_MINUS 0x1000 -#define WPAD_CLASSIC_BUTTON_L 0x2000 -#define WPAD_CLASSIC_BUTTON_DOWN 0x4000 -#define WPAD_CLASSIC_BUTTON_RIGHT 0x8000 - -void InitPadScoreFunctionPointers(void); - - -typedef struct _KPADData -{ - u32 btns_h; - u32 btns_d; - u32 btns_r; - u32 unused_1[5]; - f32 pos_x; - f32 pos_y; - u32 unused_2[3]; - f32 angle_x; - f32 angle_y; - u32 unused_3[8]; - u8 device_type; - u8 wpad_error; - u8 pos_valid; - u8 unused_4[1]; - - union - { - struct - { - f32 stick_x; - f32 stick_y; - } nunchuck; - - struct - { - u32 btns_h; - u32 btns_d; - u32 btns_r; - f32 lstick_x; - f32 lstick_y; - f32 rstick_x; - f32 rstick_y; - f32 ltrigger; - f32 rtrigger; - } classic; - - u32 unused_6[20]; - }; - u32 unused_7[16]; -} KPADData; - -typedef void (* wpad_connect_callback_t)(s32 chan, s32 status); - -extern void (* KPADInit)(void); -extern s32 (* WPADProbe)(s32 chan, u32 * pad_type); -extern s32 (* WPADSetDataFormat)(s32 chan, s32 format); -extern void (* WPADEnableURCC)(s32 enable); -extern void (* WPADRead)(s32 chan, void * data); -extern s32 (* KPADRead)(s32 chan, void * data, u32 size); - -#ifdef __cplusplus -} -#endif - -#endif // __PAD_SCORE_FUNCTIONS_H_ diff --git a/src/entry.c b/src/entry.c index ea0bfce..afdd39a 100644 --- a/src/entry.c +++ b/src/entry.c @@ -1,15 +1,11 @@ #include -#include -#include "common/common.h" -#include "utils/utils.h" +#include #include "main.h" -static volatile uint8_t ucRunOnce = 0; - int main(int argc, char **argv) { //! ******************************************************************* //! * Jump to our application * //! ******************************************************************* - return Menu_Main(); + return Menu_Main(); } diff --git a/src/fs/CFile.cpp b/src/fs/CFile.cpp index 161b980..c9348aa 100644 --- a/src/fs/CFile.cpp +++ b/src/fs/CFile.cpp @@ -1,40 +1,36 @@ #include #include -#include "CFile.hpp" +#include +#include +#include -CFile::CFile() -{ - iFd = -1; - mem_file = NULL; - filesize = 0; - pos = 0; +CFile::CFile() { + iFd = -1; + mem_file = NULL; + filesize = 0; + pos = 0; } -CFile::CFile(const std::string & filepath, eOpenTypes mode) -{ - iFd = -1; - this->open(filepath, mode); +CFile::CFile(const std::string & filepath, eOpenTypes mode) { + iFd = -1; + this->open(filepath, mode); } -CFile::CFile(const u8 * mem, int size) -{ - iFd = -1; - this->open(mem, size); +CFile::CFile(const uint8_t * mem, int32_t size) { + iFd = -1; + this->open(mem, size); } -CFile::~CFile() -{ - this->close(); +CFile::~CFile() { + this->close(); } -int CFile::open(const std::string & filepath, eOpenTypes mode) -{ - this->close(); +int32_t CFile::open(const std::string & filepath, eOpenTypes mode) { + this->close(); - s32 openMode = 0; + int32_t openMode = 0; - switch(mode) - { + switch(mode) { default: case ReadOnly: openMode = O_RDONLY; @@ -48,80 +44,72 @@ int CFile::open(const std::string & filepath, eOpenTypes mode) case Append: openMode = O_APPEND | O_WRONLY; break; - } + } //! Using fopen works only on the first launch as expected //! on the second launch it causes issues because we don't overwrite //! the .data sections which is needed for a normal application to re-init //! this will be added with launching as RPX - iFd = ::open(filepath.c_str(), openMode); - if(iFd < 0) - return iFd; + iFd = ::open(filepath.c_str(), openMode); + if(iFd < 0) + return iFd; - filesize = ::lseek(iFd, 0, SEEK_END); - ::lseek(iFd, 0, SEEK_SET); + filesize = ::lseek(iFd, 0, SEEK_END); + ::lseek(iFd, 0, SEEK_SET); - return 0; + return 0; } -int CFile::open(const u8 * mem, int size) -{ - this->close(); +int32_t CFile::open(const uint8_t * mem, int32_t size) { + this->close(); - mem_file = mem; - filesize = size; + mem_file = mem; + filesize = size; - return 0; + return 0; } -void CFile::close() -{ - if(iFd >= 0) - ::close(iFd); +void CFile::close() { + if(iFd >= 0) + ::close(iFd); - iFd = -1; - mem_file = NULL; - filesize = 0; - pos = 0; + iFd = -1; + mem_file = NULL; + filesize = 0; + pos = 0; } -int CFile::read(u8 * ptr, size_t size) -{ - if(iFd >= 0) - { - int ret = ::read(iFd, ptr,size); - if(ret > 0) - pos += ret; - return ret; - } +int32_t CFile::read(uint8_t * ptr, size_t size) { + if(iFd >= 0) { + int32_t ret = ::read(iFd, ptr,size); + if(ret > 0) + pos += ret; + return ret; + } - int readsize = size; + int32_t readsize = size; - if(readsize > (s64) (filesize-pos)) - readsize = filesize-pos; + if(readsize > (int64_t) (filesize-pos)) + readsize = filesize-pos; - if(readsize <= 0) - return readsize; + if(readsize <= 0) + return readsize; - if(mem_file != NULL) - { - memcpy(ptr, mem_file+pos, readsize); - pos += readsize; - return readsize; - } + if(mem_file != NULL) { + memcpy(ptr, mem_file+pos, readsize); + pos += readsize; + return readsize; + } - return -1; + return -1; } -int CFile::write(const u8 * ptr, size_t size) -{ - if(iFd >= 0) - { - size_t done = 0; - while(done < size) - { - int ret = ::write(iFd, ptr, size - done); +int32_t CFile::write(const uint8_t * ptr, size_t size) { + if(iFd >= 0) { + size_t done = 0; + while(done < size) { + int32_t ret = ::write(iFd, ptr, size - done); if(ret <= 0) return ret; @@ -129,67 +117,54 @@ int CFile::write(const u8 * ptr, size_t size) done += ret; pos += ret; } - return done; - } + return done; + } - return -1; + return -1; } -int CFile::seek(long int offset, int origin) -{ - int ret = 0; - s64 newPos = pos; +int32_t CFile::seek(long int offset, int32_t origin) { + int32_t ret = 0; + int64_t newPos = pos; - if(origin == SEEK_SET) - { - newPos = offset; - } - else if(origin == SEEK_CUR) - { - newPos += offset; - } - else if(origin == SEEK_END) - { - newPos = filesize+offset; - } + if(origin == SEEK_SET) { + newPos = offset; + } else if(origin == SEEK_CUR) { + newPos += offset; + } else if(origin == SEEK_END) { + newPos = filesize+offset; + } - if(newPos < 0) - { - pos = 0; - } - else { + if(newPos < 0) { + pos = 0; + } else { pos = newPos; - } + } - if(iFd >= 0) - ret = ::lseek(iFd, pos, SEEK_SET); + if(iFd >= 0) + ret = ::lseek(iFd, pos, SEEK_SET); - if(mem_file != NULL) - { - if(pos > filesize) - { - pos = filesize; - } - } + if(mem_file != NULL) { + if(pos > filesize) { + pos = filesize; + } + } - return ret; + return ret; } -int CFile::fwrite(const char *format, ...) -{ - int result = -1; - char * tmp = NULL; +int32_t CFile::fwrite(const char *format, ...) { + char tmp[512]; + tmp[0] = 0; + int32_t result = -1; - va_list va; - va_start(va, format); - if((vasprintf(&tmp, format, va) >= 0) && tmp) - { - result = this->write((u8 *)tmp, strlen(tmp)); - } - va_end(va); + va_list va; + va_start(va, format); + if((vsprintf(tmp, format, va) >= 0)) { + result = this->write((uint8_t *)tmp, strlen(tmp)); + } + va_end(va); - if(tmp) - free(tmp); return result; } diff --git a/src/fs/CFile.hpp b/src/fs/CFile.hpp index 0203162..8816a49 100644 --- a/src/fs/CFile.hpp +++ b/src/fs/CFile.hpp @@ -4,54 +4,58 @@ #include #include #include -#include #include -#include "common/types.h" +#include +#include -class CFile -{ - public: - enum eOpenTypes - { - ReadOnly, - WriteOnly, - ReadWrite, - Append - }; +class CFile { +public: + enum eOpenTypes { + ReadOnly, + WriteOnly, + ReadWrite, + Append + }; - CFile(); - CFile(const std::string & filepath, eOpenTypes mode); - CFile(const u8 * memory, int memsize); - virtual ~CFile(); + CFile(); + CFile(const std::string & filepath, eOpenTypes mode); + CFile(const uint8_t * memory, int32_t memsize); + virtual ~CFile(); - int open(const std::string & filepath, eOpenTypes mode); - int open(const u8 * memory, int memsize); + int32_t open(const std::string & filepath, eOpenTypes mode); + int32_t open(const uint8_t * memory, int32_t memsize); - bool isOpen() const { - if(iFd >= 0) - return true; + BOOL isOpen() const { + if(iFd >= 0) + return true; - if(mem_file) - return true; + if(mem_file) + return true; - return false; - } + return false; + } - void close(); + void close(); - int read(u8 * ptr, size_t size); - int write(const u8 * ptr, size_t size); - int fwrite(const char *format, ...); - int seek(long int offset, int origin); - u64 tell() { return pos; }; - u64 size() { return filesize; }; - void rewind() { this->seek(0, SEEK_SET); }; + int32_t read(uint8_t * ptr, size_t size); + int32_t write(const uint8_t * ptr, size_t size); + int32_t fwrite(const char *format, ...); + int32_t seek(long int offset, int32_t origin); + uint64_t tell() { + return pos; + }; + uint64_t size() { + return filesize; + }; + void rewind() { + this->seek(0, SEEK_SET); + }; - protected: - int iFd; - const u8 * mem_file; - u64 filesize; - u64 pos; +protected: + int32_t iFd; + const uint8_t * mem_file; + uint64_t filesize; + uint64_t pos; }; #endif diff --git a/src/fs/DirList.cpp b/src/fs/DirList.cpp index c37b504..6b98c49 100644 --- a/src/fs/DirList.cpp +++ b/src/fs/DirList.cpp @@ -28,205 +28,186 @@ #include #include #include +#include #include #include #include -#include "DirList.h" -#include "utils/StringTools.h" +#include +#include -DirList::DirList() -{ - Flags = 0; - Filter = 0; - Depth = 0; +DirList::DirList() { + Flags = 0; + Filter = 0; + Depth = 0; } -DirList::DirList(const std::string & path, const char *filter, u32 flags, u32 maxDepth) -{ - this->LoadPath(path, filter, flags, maxDepth); - this->SortList(); +DirList::DirList(const std::string & path, const char *filter, uint32_t flags, uint32_t maxDepth) { + this->LoadPath(path, filter, flags, maxDepth); + this->SortList(); } -DirList::~DirList() -{ - ClearList(); +DirList::~DirList() { + ClearList(); } -bool DirList::LoadPath(const std::string & folder, const char *filter, u32 flags, u32 maxDepth) -{ - if(folder.empty()) return false; +BOOL DirList::LoadPath(const std::string & folder, const char *filter, uint32_t flags, uint32_t maxDepth) { + if(folder.empty()) return false; - Flags = flags; - Filter = filter; - Depth = maxDepth; + Flags = flags; + Filter = filter; + Depth = maxDepth; - std::string folderpath(folder); - u32 length = folderpath.size(); + std::string folderpath(folder); + uint32_t length = folderpath.size(); - //! clear path of double slashes - RemoveDoubleSlashs(folderpath); + //! clear path of double slashes + StringTools::RemoveDoubleSlashs(folderpath); - //! remove last slash if exists - if(length > 0 && folderpath[length-1] == '/') - folderpath.erase(length-1); + //! remove last slash if exists + if(length > 0 && folderpath[length-1] == '/') + folderpath.erase(length-1); //! add root slash if missing - if(folderpath.find('/') == std::string::npos) + if(folderpath.find('/') == std::string::npos) { folderpath += '/'; + } - return InternalLoadPath(folderpath); + return InternalLoadPath(folderpath); } -bool DirList::InternalLoadPath(std::string &folderpath) -{ - if(folderpath.size() < 3) - return false; +BOOL DirList::InternalLoadPath(std::string &folderpath) { + if(folderpath.size() < 3) + return false; - struct dirent *dirent = NULL; - DIR *dir = NULL; + struct dirent *dirent = NULL; + DIR *dir = NULL; - dir = opendir(folderpath.c_str()); - if (dir == NULL) - return false; + dir = opendir(folderpath.c_str()); + if (dir == NULL) + return false; - while ((dirent = readdir(dir)) != 0) - { - bool isDir = dirent->d_type & DT_DIR; - const char *filename = dirent->d_name; + while ((dirent = readdir(dir)) != 0) { + BOOL isDir = dirent->d_type & DT_DIR; + const char *filename = dirent->d_name; - if(isDir) - { - if(strcmp(filename,".") == 0 || strcmp(filename,"..") == 0) - continue; + if(isDir) { + if(strcmp(filename,".") == 0 || strcmp(filename,"..") == 0) + continue; - if((Flags & CheckSubfolders) && (Depth > 0)) - { - int length = folderpath.size(); - if(length > 2 && folderpath[length-1] != '/') - folderpath += '/'; - folderpath += filename; + if((Flags & CheckSubfolders) && (Depth > 0)) { + int32_t length = folderpath.size(); + if(length > 2 && folderpath[length-1] != '/') { + folderpath += '/'; + } + folderpath += filename; Depth--; - InternalLoadPath(folderpath); - folderpath.erase(length); - Depth++; - } + InternalLoadPath(folderpath); + folderpath.erase(length); + Depth++; + } - if(!(Flags & Dirs)) - continue; - } - else if(!(Flags & Files)) - { - continue; - } + if(!(Flags & Dirs)) + continue; + } else if(!(Flags & Files)) { + continue; + } - if(Filter) - { - char * fileext = strrchr(filename, '.'); - if(!fileext) - continue; + if(Filter) { + char * fileext = strrchr(filename, '.'); + if(!fileext) + continue; - if(strtokcmp(fileext, Filter, ",") == 0) - AddEntrie(folderpath, filename, isDir); - } - else - { - AddEntrie(folderpath, filename, isDir); - } - } - closedir(dir); + if(StringTools::strtokcmp(fileext, Filter, ",") == 0) + AddEntrie(folderpath, filename, isDir); + } else { + AddEntrie(folderpath, filename, isDir); + } + } + closedir(dir); - return true; + return true; } -void DirList::AddEntrie(const std::string &filepath, const char * filename, bool isDir) -{ - if(!filename) - return; +void DirList::AddEntrie(const std::string &filepath, const char * filename, BOOL isDir) { + if(!filename) + return; - int pos = FileInfo.size(); + int32_t pos = FileInfo.size(); - FileInfo.resize(pos+1); + FileInfo.resize(pos+1); - FileInfo[pos].FilePath = (char *) malloc(filepath.size()+strlen(filename)+2); - if(!FileInfo[pos].FilePath) - { - FileInfo.resize(pos); - return; - } + FileInfo[pos].FilePath = (char *) malloc(filepath.size()+strlen(filename)+2); + if(!FileInfo[pos].FilePath) { + FileInfo.resize(pos); + return; + } - sprintf(FileInfo[pos].FilePath, "%s/%s", filepath.c_str(), filename); - FileInfo[pos].isDir = isDir; + sprintf(FileInfo[pos].FilePath, "%s/%s", filepath.c_str(), filename); + FileInfo[pos].isDir = isDir; } -void DirList::ClearList() -{ - for(u32 i = 0; i < FileInfo.size(); ++i) - { - if(FileInfo[i].FilePath) - free(FileInfo[i].FilePath); - } +void DirList::ClearList() { + for(uint32_t i = 0; i < FileInfo.size(); ++i) { + if(FileInfo[i].FilePath) { + free(FileInfo[i].FilePath); + FileInfo[i].FilePath = NULL; + } + } - FileInfo.clear(); - std::vector().swap(FileInfo); + FileInfo.clear(); + std::vector().swap(FileInfo); } -const char * DirList::GetFilename(int ind) const -{ - if (!valid(ind)) - return ""; +const char * DirList::GetFilename(int32_t ind) const { + if (!valid(ind)) + return ""; - return FullpathToFilename(FileInfo[ind].FilePath); + return StringTools::FullpathToFilename(FileInfo[ind].FilePath); } -static bool SortCallback(const DirEntry & f1, const DirEntry & f2) -{ - if(f1.isDir && !(f2.isDir)) return true; - if(!(f1.isDir) && f2.isDir) return false; +static BOOL SortCallback(const DirEntry & f1, const DirEntry & f2) { + if(f1.isDir && !(f2.isDir)) return true; + if(!(f1.isDir) && f2.isDir) return false; - if(f1.FilePath && !f2.FilePath) return true; - if(!f1.FilePath) return false; + if(f1.FilePath && !f2.FilePath) return true; + if(!f1.FilePath) return false; - if(strcasecmp(f1.FilePath, f2.FilePath) > 0) - return false; + if(strcasecmp(f1.FilePath, f2.FilePath) > 0) + return false; - return true; + return true; } -void DirList::SortList() -{ - if(FileInfo.size() > 1) - std::sort(FileInfo.begin(), FileInfo.end(), SortCallback); +void DirList::SortList() { + if(FileInfo.size() > 1) + std::sort(FileInfo.begin(), FileInfo.end(), SortCallback); } -void DirList::SortList(bool (*SortFunc)(const DirEntry &a, const DirEntry &b)) -{ - if(FileInfo.size() > 1) - std::sort(FileInfo.begin(), FileInfo.end(), SortFunc); +void DirList::SortList(BOOL (*SortFunc)(const DirEntry &a, const DirEntry &b)) { + if(FileInfo.size() > 1) + std::sort(FileInfo.begin(), FileInfo.end(), SortFunc); } -u64 DirList::GetFilesize(int index) const -{ - struct stat st; - const char *path = GetFilepath(index); +uint64_t DirList::GetFilesize(int32_t index) const { + struct stat st; + const char *path = GetFilepath(index); - if(!path || stat(path, &st) != 0) - return 0; + if(!path || stat(path, &st) != 0) + return 0; - return st.st_size; + return st.st_size; } -int DirList::GetFileIndex(const char *filename) const -{ - if(!filename) - return -1; +int32_t DirList::GetFileIndex(const char *filename) const { + if(!filename) + return -1; - for (u32 i = 0; i < FileInfo.size(); ++i) - { - if (strcasecmp(GetFilename(i), filename) == 0) - return i; - } + for (uint32_t i = 0; i < FileInfo.size(); ++i) { + if (strcasecmp(GetFilename(i), filename) == 0) + return i; + } - return -1; + return -1; } diff --git a/src/fs/DirList.h b/src/fs/DirList.h index ea5c20c..64072df 100644 --- a/src/fs/DirList.h +++ b/src/fs/DirList.h @@ -29,68 +29,75 @@ #include #include -#include "common/types.h" +#include -typedef struct -{ - char * FilePath; - bool isDir; +typedef struct { + char * FilePath; + BOOL isDir; } DirEntry; -class DirList -{ +class DirList { public: - //!Constructor - DirList(void); - //!\param path Path from where to load the filelist of all files - //!\param filter A fileext that needs to be filtered - //!\param flags search/filter flags from the enum - DirList(const std::string & path, const char *filter = NULL, u32 flags = Files | Dirs, u32 maxDepth = 0xffffffff); - //!Destructor - virtual ~DirList(); - //! Load all the files from a directory - bool LoadPath(const std::string & path, const char *filter = NULL, u32 flags = Files | Dirs, u32 maxDepth = 0xffffffff); - //! Get a filename of the list - //!\param list index - const char * GetFilename(int index) const; - //! Get the a filepath of the list - //!\param list index - const char *GetFilepath(int index) const { if (!valid(index)) return ""; else return FileInfo[index].FilePath; } - //! Get the a filesize of the list - //!\param list index - u64 GetFilesize(int index) const; - //! Is index a dir or a file - //!\param list index - bool IsDir(int index) const { if(!valid(index)) return false; return FileInfo[index].isDir; }; - //! Get the filecount of the whole list - int GetFilecount() const { return FileInfo.size(); }; - //! Sort list by filepath - void SortList(); - //! Custom sort command for custom sort functions definitions - void SortList(bool (*SortFunc)(const DirEntry &a, const DirEntry &b)); - //! Get the index of the specified filename - int GetFileIndex(const char *filename) const; - //! Enum for search/filter flags - enum - { - Files = 0x01, - Dirs = 0x02, - CheckSubfolders = 0x08, - }; + //!Constructor + DirList(void); + //!\param path Path from where to load the filelist of all files + //!\param filter A fileext that needs to be filtered + //!\param flags search/filter flags from the enum + DirList(const std::string & path, const char *filter = NULL, uint32_t flags = Files | Dirs, uint32_t maxDepth = 0xffffffff); + //!Destructor + virtual ~DirList(); + //! Load all the files from a directory + BOOL LoadPath(const std::string & path, const char *filter = NULL, uint32_t flags = Files | Dirs, uint32_t maxDepth = 0xffffffff); + //! Get a filename of the list + //!\param list index + const char * GetFilename(int32_t index) const; + //! Get the a filepath of the list + //!\param list index + const char *GetFilepath(int32_t index) const { + if (!valid(index)) return ""; + else return FileInfo[index].FilePath; + } + //! Get the a filesize of the list + //!\param list index + uint64_t GetFilesize(int32_t index) const; + //! Is index a dir or a file + //!\param list index + BOOL IsDir(int32_t index) const { + if(!valid(index)) return false; + return FileInfo[index].isDir; + }; + //! Get the filecount of the whole list + int32_t GetFilecount() const { + return FileInfo.size(); + }; + //! Sort list by filepath + void SortList(); + //! Custom sort command for custom sort functions definitions + void SortList(BOOL (*SortFunc)(const DirEntry &a, const DirEntry &b)); + //! Get the index of the specified filename + int32_t GetFileIndex(const char *filename) const; + //! Enum for search/filter flags + enum { + Files = 0x01, + Dirs = 0x02, + CheckSubfolders = 0x08, + }; protected: - // Internal parser - bool InternalLoadPath(std::string &path); - //!Add a list entrie - void AddEntrie(const std::string &filepath, const char * filename, bool isDir); - //! Clear the list - void ClearList(); - //! Check if valid pos is requested - inline bool valid(u32 pos) const { return (pos < FileInfo.size()); }; + // Internal parser + BOOL InternalLoadPath(std::string &path); + //!Add a list entrie + void AddEntrie(const std::string &filepath, const char * filename, BOOL isDir); + //! Clear the list + void ClearList(); + //! Check if valid pos is requested + inline BOOL valid(uint32_t pos) const { + return (pos < FileInfo.size()); + }; - u32 Flags; - u32 Depth; - const char *Filter; - std::vector FileInfo; + uint32_t Flags; + uint32_t Depth; + const char *Filter; + std::vector FileInfo; }; #endif diff --git a/src/fs/FSUtils.cpp b/src/fs/FSUtils.cpp new file mode 100644 index 0000000..ba59544 --- /dev/null +++ b/src/fs/FSUtils.cpp @@ -0,0 +1,144 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +int32_t FSUtils::LoadFileToMem(const char *filepath, uint8_t **inbuffer, uint32_t *size) { + //! always initialze input + *inbuffer = NULL; + if(size) + *size = 0; + + int32_t iFd = open(filepath, O_RDONLY); + if (iFd < 0) + return -1; + + uint32_t filesize = lseek(iFd, 0, SEEK_END); + lseek(iFd, 0, SEEK_SET); + + uint8_t *buffer = (uint8_t *) malloc(filesize); + if (buffer == NULL) { + close(iFd); + return -2; + } + + uint32_t blocksize = 0x4000; + uint32_t done = 0; + int32_t readBytes = 0; + + while(done < filesize) { + if(done + blocksize > filesize) { + blocksize = filesize - done; + } + readBytes = read(iFd, buffer + done, blocksize); + if(readBytes <= 0) + break; + done += readBytes; + } + + close(iFd); + + if (done != filesize) { + free(buffer); + buffer = NULL; + return -3; + } + + *inbuffer = buffer; + + //! sign is optional input + if(size) { + *size = filesize; + } + + return filesize; +} + +int32_t FSUtils::CheckFile(const char * filepath) { + if(!filepath) + return 0; + + struct stat filestat; + + char dirnoslash[strlen(filepath)+2]; + snprintf(dirnoslash, sizeof(dirnoslash), "%s", filepath); + + while(dirnoslash[strlen(dirnoslash)-1] == '/') + dirnoslash[strlen(dirnoslash)-1] = '\0'; + + char * notRoot = strrchr(dirnoslash, '/'); + if(!notRoot) { + strcat(dirnoslash, "/"); + } + + if (stat(dirnoslash, &filestat) == 0) + return 1; + + return 0; +} + +int32_t FSUtils::CreateSubfolder(const char * fullpath) { + if(!fullpath) + return 0; + + int32_t result = 0; + + char dirnoslash[strlen(fullpath)+1]; + strcpy(dirnoslash, fullpath); + + int32_t pos = strlen(dirnoslash)-1; + while(dirnoslash[pos] == '/') { + dirnoslash[pos] = '\0'; + pos--; + } + + if(CheckFile(dirnoslash)) { + return 1; + } else { + char parentpath[strlen(dirnoslash)+2]; + strcpy(parentpath, dirnoslash); + char * ptr = strrchr(parentpath, '/'); + + if(!ptr) { + //!Device root directory (must be with '/') + strcat(parentpath, "/"); + struct stat filestat; + if (stat(parentpath, &filestat) == 0) + return 1; + + return 0; + } + + ptr++; + ptr[0] = '\0'; + + result = CreateSubfolder(parentpath); + } + + if(!result) + return 0; + + if (mkdir(dirnoslash, 0777) == -1) { + return 0; + } + + return 1; +} + +BOOL FSUtils::saveBufferToFile(const char * path, void * buffer, uint32_t size) { + int32_t res = open(path, O_CREAT | O_TRUNC | O_WRONLY); + close(res); + CFile file(path, CFile::WriteOnly); + if (!file.isOpen()) { + DEBUG_FUNCTION_LINE("Failed to open %s\n",path); + return false; + } + file.write((const uint8_t*) buffer,size); + file.close(); + return true; +} + diff --git a/src/fs/FSUtils.h b/src/fs/FSUtils.h new file mode 100644 index 0000000..b589a44 --- /dev/null +++ b/src/fs/FSUtils.h @@ -0,0 +1,16 @@ +#ifndef __FS_UTILS_H_ +#define __FS_UTILS_H_ + +#include + +class FSUtils { +public: + static int32_t LoadFileToMem(const char *filepath, uint8_t **inbuffer, uint32_t *size); + + //! todo: C++ class + static int32_t CreateSubfolder(const char * fullpath); + static int32_t CheckFile(const char * filepath); + static BOOL saveBufferToFile(const char * path, void * buffer, uint32_t size); +}; + +#endif // __FS_UTILS_H_ diff --git a/src/fs/fs_utils.c b/src/fs/fs_utils.c deleted file mode 100644 index ffadd89..0000000 --- a/src/fs/fs_utils.c +++ /dev/null @@ -1,182 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#define FS_MAX_MOUNTPATH_SIZE 128 - -int MountFS(void *pClient, void *pCmd, char **mount_path) -{ - int result = -1; - - void *mountSrc = malloc(sizeof(FSMountSource)); - if(!mountSrc) - return -3; - - char* mountPath = (char*) malloc(FS_MAX_MOUNTPATH_SIZE); - if(!mountPath) { - free(mountSrc); - return -4; - } - - memset(mountSrc, 0, sizeof(FSMountSource)); - memset(mountPath, 0, FS_MAX_MOUNTPATH_SIZE); - - // Mount sdcard - if (FSGetMountSource(pClient, pCmd, FS_MOUNT_SOURCE_SD, mountSrc, -1) == 0) - { - result = FSMount(pClient, pCmd, mountSrc, mountPath, FS_MAX_MOUNTPATH_SIZE, -1); - if((result == 0) && mount_path) { - *mount_path = (char*)malloc(strlen(mountPath) + 1); - if(*mount_path) - strcpy(*mount_path, mountPath); - } - } - - free(mountPath); - free(mountSrc); - return result; -} - -int UmountFS(void *pClient, void *pCmd, const char *mountPath) -{ - int result = -1; - result = FSUnmount(pClient, pCmd, mountPath, -1); - - return result; -} - -int LoadFileToMem(const char *filepath, u8 **inbuffer, u32 *size) -{ - //! always initialze input - *inbuffer = NULL; - if(size) - *size = 0; - - int iFd = open(filepath, O_RDONLY); - if (iFd < 0) - return -1; - - u32 filesize = lseek(iFd, 0, SEEK_END); - lseek(iFd, 0, SEEK_SET); - - u8 *buffer = (u8 *) malloc(filesize); - if (buffer == NULL) - { - close(iFd); - return -2; - } - - u32 blocksize = 0x4000; - u32 done = 0; - int readBytes = 0; - - while(done < filesize) - { - if(done + blocksize > filesize) { - blocksize = filesize - done; - } - readBytes = read(iFd, buffer + done, blocksize); - if(readBytes <= 0) - break; - done += readBytes; - } - - close(iFd); - - if (done != filesize) - { - free(buffer); - return -3; - } - - *inbuffer = buffer; - - //! sign is optional input - if(size) - *size = filesize; - - return filesize; -} - -int CheckFile(const char * filepath) -{ - if(!filepath) - return 0; - - struct stat filestat; - - char dirnoslash[strlen(filepath)+2]; - snprintf(dirnoslash, sizeof(dirnoslash), "%s", filepath); - - while(dirnoslash[strlen(dirnoslash)-1] == '/') - dirnoslash[strlen(dirnoslash)-1] = '\0'; - - char * notRoot = strrchr(dirnoslash, '/'); - if(!notRoot) - { - strcat(dirnoslash, "/"); - } - - if (stat(dirnoslash, &filestat) == 0) - return 1; - - return 0; -} - -int CreateSubfolder(const char * fullpath) -{ - if(!fullpath) - return 0; - - int result = 0; - - char dirnoslash[strlen(fullpath)+1]; - strcpy(dirnoslash, fullpath); - - int pos = strlen(dirnoslash)-1; - while(dirnoslash[pos] == '/') - { - dirnoslash[pos] = '\0'; - pos--; - } - - if(CheckFile(dirnoslash)) - { - return 1; - } - else - { - char parentpath[strlen(dirnoslash)+2]; - strcpy(parentpath, dirnoslash); - char * ptr = strrchr(parentpath, '/'); - - if(!ptr) - { - //!Device root directory (must be with '/') - strcat(parentpath, "/"); - struct stat filestat; - if (stat(parentpath, &filestat) == 0) - return 1; - - return 0; - } - - ptr++; - ptr[0] = '\0'; - - result = CreateSubfolder(parentpath); - } - - if(!result) - return 0; - - if (mkdir(dirnoslash, 0777) == -1) - { - return 0; - } - - return 1; -} diff --git a/src/fs/fs_utils.h b/src/fs/fs_utils.h deleted file mode 100644 index 5d4a05b..0000000 --- a/src/fs/fs_utils.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef __FS_UTILS_H_ -#define __FS_UTILS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "common/types.h" - -int MountFS(void *pClient, void *pCmd, char **mount_path); -int UmountFS(void *pClient, void *pCmd, const char *mountPath); - -int LoadFileToMem(const char *filepath, u8 **inbuffer, u32 *size); - -//! todo: C++ class -int CreateSubfolder(const char * fullpath); -int CheckFile(const char * filepath); - -#ifdef __cplusplus -} -#endif - -#endif // __FS_UTILS_H_ diff --git a/src/game/Background.cpp b/src/game/Background.cpp index 63330c0..d299dee 100644 --- a/src/game/Background.cpp +++ b/src/game/Background.cpp @@ -17,6 +17,7 @@ #include "Background.h" #include "gui/GuiTrigger.h" #include "gui/GuiController.h" +#include "resources/Resources.h" /** * Constructor for the GuiButton class. diff --git a/src/game/Pipe.cpp b/src/game/Pipe.cpp index d3fa08f..063a0bc 100644 --- a/src/game/Pipe.cpp +++ b/src/game/Pipe.cpp @@ -14,9 +14,11 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . ****************************************************************************/ +#include #include "Pipe.h" #include "gui/GuiTrigger.h" #include "gui/GuiController.h" +#include "resources/Resources.h" /** * Constructor for the GuiButton class. diff --git a/src/game/ScoreImage.cpp b/src/game/ScoreImage.cpp index 9a7359b..1b2aa31 100644 --- a/src/game/ScoreImage.cpp +++ b/src/game/ScoreImage.cpp @@ -17,6 +17,7 @@ #include "ScoreImage.h" #include "gui/GuiTrigger.h" #include "gui/GuiController.h" +#include "resources/Resources.h" /** * Constructor for the GuiButton class. diff --git a/src/gui/FreeTypeGX.cpp b/src/gui/FreeTypeGX.cpp deleted file mode 100644 index c35432d..0000000 --- a/src/gui/FreeTypeGX.cpp +++ /dev/null @@ -1,608 +0,0 @@ -/* - * FreeTypeGX is a wrapper class for libFreeType which renders a compiled - * FreeType parsable font into a GX texture for Wii homebrew development. - * Copyright (C) 2008 Armin Tamzarian - * Modified by Dimok, 2015 for WiiU GX2 - * - * This file is part of FreeTypeGX. - * - * FreeTypeGX is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * FreeTypeGX is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with FreeTypeGX. If not, see . - */ - -#include "video/CVideo.h" -#include "video/shaders/Texture2DShader.h" -#include "FreeTypeGX.h" - -using namespace std; - -#define ALIGN4(x) (((x) + 3) & ~3) - -/** - * Default constructor for the FreeTypeGX class for WiiXplorer. - */ -FreeTypeGX::FreeTypeGX(const uint8_t* fontBuffer, FT_Long bufferSize, bool lastFace) -{ - int faceIndex = 0; - ftPointSize = 0; - GX2InitSampler(&ftSampler, GX2_TEX_CLAMP_MODE_CLAMP_BORDER, GX2_TEX_XY_FILTER_MODE_LINEAR); - - FT_Init_FreeType(&ftLibrary); - if(lastFace) - { - FT_New_Memory_Face(ftLibrary, (FT_Byte *)fontBuffer, bufferSize, -1, &ftFace); - faceIndex = ftFace->num_faces - 1; // Use the last face - FT_Done_Face(ftFace); - ftFace = NULL; - } - FT_New_Memory_Face(ftLibrary, (FT_Byte *) fontBuffer, bufferSize, faceIndex, &ftFace); - - ftKerningEnabled = FT_HAS_KERNING(ftFace); -} - -/** - * Default destructor for the FreeTypeGX class. - */ -FreeTypeGX::~FreeTypeGX() -{ - unloadFont(); - FT_Done_Face(ftFace); - FT_Done_FreeType(ftLibrary); -} - -/** - * Convert a short char string to a wide char string. - * - * This routine converts a supplied short character string into a wide character string. - * Note that it is the user's responsibility to clear the returned buffer once it is no longer needed. - * - * @param strChar Character string to be converted. - * @return Wide character representation of supplied character string. - */ - -wchar_t* FreeTypeGX::charToWideChar(const char* strChar) -{ - if (!strChar) return NULL; - - wchar_t *strWChar = new (std::nothrow) wchar_t[strlen(strChar) + 1]; - if (!strWChar) return NULL; - - int bt = mbstowcs(strWChar, strChar, strlen(strChar)); - if (bt > 0) - { - strWChar[bt] = 0; - return strWChar; - } - - wchar_t *tempDest = strWChar; - while ((*tempDest++ = *strChar++)) - ; - - return strWChar; -} - -char *FreeTypeGX::wideCharToUTF8(const wchar_t* strChar) -{ - if(!strChar) { - return NULL; - } - - size_t len = 0; - wchar_t wc; - - for (size_t i = 0; strChar[i]; ++i) - { - wc = strChar[i]; - if (wc < 0x80) - ++len; - else if (wc < 0x800) - len += 2; - else if (wc < 0x10000) - len += 3; - else - len += 4; - } - - char *pOut = new (std::nothrow) char[len]; - if(!pOut) - return NULL; - - size_t n = 0; - - for (size_t i = 0; strChar[i]; ++i) - { - wc = strChar[i]; - if (wc < 0x80) - pOut[n++] = (char)wc; - else if (wc < 0x800) - { - pOut[n++] = (char)((wc >> 6) | 0xC0); - pOut[n++] = (char)((wc & 0x3F) | 0x80); - } - else if (wc < 0x10000) - { - pOut[n++] = (char)((wc >> 12) | 0xE0); - pOut[n++] = (char)(((wc >> 6) & 0x3F) | 0x80); - pOut[n++] = (char)((wc & 0x3F) | 0x80); - } - else - { - pOut[n++] = (char)(((wc >> 18) & 0x07) | 0xF0); - pOut[n++] = (char)(((wc >> 12) & 0x3F) | 0x80); - pOut[n++] = (char)(((wc >> 6) & 0x3F) | 0x80); - pOut[n++] = (char)((wc & 0x3F) | 0x80); - } - } - return pOut; -} - -/** - * Clears all loaded font glyph data. - * - * This routine clears all members of the font map structure and frees all allocated memory back to the system. - */ -void FreeTypeGX::unloadFont() -{ - map::iterator itr; - map::iterator itr2; - - for (itr = fontData.begin(); itr != fontData.end(); itr++) - { - for (itr2 = itr->second.ftgxCharMap.begin(); itr2 != itr->second.ftgxCharMap.end(); itr2++) - { - if(itr2->second.texture) - { - if(itr2->second.texture->surface.image) - free(itr2->second.texture->surface.image); - - delete itr2->second.texture; - itr2->second.texture = NULL; - } - } - } - - fontData.clear(); -} - -/** - * Caches the given font glyph in the instance font texture buffer. - * - * This routine renders and stores the requested glyph's bitmap and relevant information into its own quickly addressible - * structure within an instance-specific map. - * - * @param charCode The requested glyph's character code. - * @return A pointer to the allocated font structure. - */ -ftgxCharData * FreeTypeGX::cacheGlyphData(wchar_t charCode, int16_t pixelSize) -{ - map::iterator itr = fontData.find(pixelSize); - if (itr != fontData.end()) - { - map::iterator itr2 = itr->second.ftgxCharMap.find(charCode); - if (itr2 != itr->second.ftgxCharMap.end()) - { - return &itr2->second; - } - } - //!Cache ascender and decender as well - ftGX2Data *ftData = &fontData[pixelSize]; - - FT_UInt gIndex; - uint16_t textureWidth = 0, textureHeight = 0; - if (ftPointSize != pixelSize) - { - ftPointSize = pixelSize; - FT_Set_Pixel_Sizes(ftFace, 0, ftPointSize); - ftData->ftgxAlign.ascender = (int16_t) ftFace->size->metrics.ascender >> 6; - ftData->ftgxAlign.descender = (int16_t) ftFace->size->metrics.descender >> 6; - ftData->ftgxAlign.max = 0; - ftData->ftgxAlign.min = 0; - } - - gIndex = FT_Get_Char_Index(ftFace, (FT_ULong) charCode); - if (gIndex != 0 && FT_Load_Glyph(ftFace, gIndex, FT_LOAD_DEFAULT | FT_LOAD_RENDER) == 0) - { - if (ftFace->glyph->format == FT_GLYPH_FORMAT_BITMAP) - { - FT_Bitmap *glyphBitmap = &ftFace->glyph->bitmap; - - textureWidth = ALIGN4(glyphBitmap->width); - textureHeight = ALIGN4(glyphBitmap->rows); - if(textureWidth == 0) - textureWidth = 4; - if(textureHeight == 0) - textureHeight = 4; - - ftgxCharData *charData = &ftData->ftgxCharMap[charCode]; - charData->renderOffsetX = (int16_t) ftFace->glyph->bitmap_left; - charData->glyphAdvanceX = (uint16_t) (ftFace->glyph->advance.x >> 6); - charData->glyphAdvanceY = (uint16_t) (ftFace->glyph->advance.y >> 6); - charData->glyphIndex = (uint32_t) gIndex; - charData->renderOffsetY = (int16_t) ftFace->glyph->bitmap_top; - charData->renderOffsetMax = (int16_t) ftFace->glyph->bitmap_top; - charData->renderOffsetMin = (int16_t) glyphBitmap->rows - ftFace->glyph->bitmap_top; - - //! Initialize texture - charData->texture = new GX2Texture; - GX2InitTexture(charData->texture, textureWidth, textureHeight, 1, 0, GX2_SURFACE_FORMAT_UNORM_R5_G5_B5_A1, GX2_SURFACE_DIM_TEXTURE_2D, GX2_TILE_MODE_LINEAR_ALIGNED); - - loadGlyphData(glyphBitmap, charData); - - return charData; - } - } - return NULL; -} - -/** - * Locates each character in this wrapper's configured font face and proccess them. - * - * This routine locates each character in the configured font face and renders the glyph's bitmap. - * Each bitmap and relevant information is loaded into its own quickly addressible structure within an instance-specific map. - */ -uint16_t FreeTypeGX::cacheGlyphDataComplete(int16_t pixelSize) -{ - uint32_t i = 0; - FT_UInt gIndex; - - FT_ULong charCode = FT_Get_First_Char(ftFace, &gIndex); - while (gIndex != 0) - { - if (cacheGlyphData(charCode, pixelSize) != NULL) ++i; - charCode = FT_Get_Next_Char(ftFace, charCode, &gIndex); - } - return (uint16_t) (i); -} - -/** - * Loads the rendered bitmap into the relevant structure's data buffer. - * - * This routine does a simple byte-wise copy of the glyph's rendered 8-bit grayscale bitmap into the structure's buffer. - * Each byte is converted from the bitmap's intensity value into the a uint32_t RGBA value. - * - * @param bmp A pointer to the most recently rendered glyph's bitmap. - * @param charData A pointer to an allocated ftgxCharData structure whose data represent that of the last rendered glyph. - */ - -void FreeTypeGX::loadGlyphData(FT_Bitmap *bmp, ftgxCharData *charData) -{ - charData->texture->surface.image = (uint8_t *) memalign(charData->texture->surface.alignment, charData->texture->surface.imageSize); - if(!charData->texture->surface.image) - return; - - memset(charData->texture->surface.image, 0x00, charData->texture->surface.imageSize); - - uint8_t *src = (uint8_t *)bmp->buffer; - uint16_t *dst = (uint16_t *)charData->texture->surface.image; - int32_t x, y; - - for(y = 0; y < bmp->rows; y++) - { - for(x = 0; x < bmp->width; x++) - { - uint8_t intensity = src[y * bmp->width + x] >> 3; - dst[y * charData->texture->surface.pitch + x] = intensity ? ((intensity << 11) | (intensity << 6) | (intensity << 1) | 1) : 0; - } - } - GX2Invalidate(GX2_INVALIDATE_MODE_CPU_TEXTURE, charData->texture->surface.image, charData->texture->surface.imageSize); -} - -/** - * Determines the x offset of the rendered string. - * - * This routine calculates the x offset of the rendered string based off of a supplied positional format parameter. - * - * @param width Current pixel width of the string. - * @param format Positional format of the string. - */ -int16_t FreeTypeGX::getStyleOffsetWidth(uint16_t width, uint16_t format) -{ - if (format & FTGX_JUSTIFY_LEFT) - return 0; - else if (format & FTGX_JUSTIFY_CENTER) - return -(width >> 1); - else if (format & FTGX_JUSTIFY_RIGHT) return -width; - return 0; -} - -/** - * Determines the y offset of the rendered string. - * - * This routine calculates the y offset of the rendered string based off of a supplied positional format parameter. - * - * @param offset Current pixel offset data of the string. - * @param format Positional format of the string. - */ -int16_t FreeTypeGX::getStyleOffsetHeight(int16_t format, uint16_t pixelSize) -{ - std::map::iterator itr = fontData.find(pixelSize); - if (itr == fontData.end()) return 0; - - switch (format & FTGX_ALIGN_MASK) - { - case FTGX_ALIGN_TOP: - return itr->second.ftgxAlign.descender; - - case FTGX_ALIGN_MIDDLE: - default: - return (itr->second.ftgxAlign.ascender + itr->second.ftgxAlign.descender + 1) >> 1; - - case FTGX_ALIGN_BOTTOM: - return itr->second.ftgxAlign.ascender; - - case FTGX_ALIGN_BASELINE: - return 0; - - case FTGX_ALIGN_GLYPH_TOP: - return itr->second.ftgxAlign.max; - - case FTGX_ALIGN_GLYPH_MIDDLE: - return (itr->second.ftgxAlign.max + itr->second.ftgxAlign.min + 1) >> 1; - - case FTGX_ALIGN_GLYPH_BOTTOM: - return itr->second.ftgxAlign.min; - } - return 0; -} - -/** - * Processes the supplied text string and prints the results at the specified coordinates. - * - * This routine processes each character of the supplied text string, loads the relevant preprocessed bitmap buffer, - * a texture from said buffer, and loads the resultant texture into the EFB. - * - * @param x Screen X coordinate at which to output the text. - * @param y Screen Y coordinate at which to output the text. Note that this value corresponds to the text string origin and not the top or bottom of the glyphs. - * @param text NULL terminated string to output. - * @param color Optional color to apply to the text characters. If not specified default value is ftgxWhite: (GXColor){0xff, 0xff, 0xff, 0xff} - * @param textStyle Flags which specify any styling which should be applied to the rendered string. - * @return The number of characters printed. - */ - -uint16_t FreeTypeGX::drawText(CVideo *video, int16_t x, int16_t y, int16_t z, const wchar_t *text, int16_t pixelSize, const glm::vec4 & color, uint16_t textStyle, uint16_t textWidth, const float &textBlur, const float & colorBlurIntensity, const glm::vec4 & blurColor, const float & internalRenderingScale) -{ - if (!text) - return 0; - - uint16_t fullTextWidth = (textWidth > 0) ? textWidth : getWidth(text, pixelSize); - uint16_t x_pos = x, printed = 0; - uint16_t x_offset = 0, y_offset = 0; - FT_Vector pairDelta; - - if (textStyle & FTGX_JUSTIFY_MASK) - { - x_offset = getStyleOffsetWidth(fullTextWidth, textStyle); - } - if (textStyle & FTGX_ALIGN_MASK) - { - y_offset = getStyleOffsetHeight(textStyle, pixelSize); - } - - int i = 0; - - while (text[i]) - { - ftgxCharData* glyphData = cacheGlyphData(text[i], pixelSize); - - if (glyphData != NULL) - { - if (ftKerningEnabled && i > 0) - { - FT_Get_Kerning(ftFace, fontData[pixelSize].ftgxCharMap[text[i - 1]].glyphIndex, glyphData->glyphIndex, FT_KERNING_DEFAULT, &pairDelta); - x_pos += (pairDelta.x >> 6); - - } - copyTextureToFramebuffer(video, glyphData->texture,x_pos + glyphData->renderOffsetX + x_offset, y + glyphData->renderOffsetY - y_offset, z, color, textBlur, colorBlurIntensity, blurColor,internalRenderingScale); - - x_pos += glyphData->glyphAdvanceX; - ++printed; - } - ++i; - } - - return printed; -} - - -/** - * Processes the supplied string and return the width of the string in pixels. - * - * This routine processes each character of the supplied text string and calculates the width of the entire string. - * Note that if precaching of the entire font set is not enabled any uncached glyph will be cached after the call to this function. - * - * @param text NULL terminated string to calculate. - * @return The width of the text string in pixels. - */ -uint16_t FreeTypeGX::getWidth(const wchar_t *text, int16_t pixelSize) -{ - if (!text) return 0; - - uint16_t strWidth = 0; - FT_Vector pairDelta; - - int i = 0; - while (text[i]) - { - ftgxCharData* glyphData = cacheGlyphData(text[i], pixelSize); - - if (glyphData != NULL) - { - if (ftKerningEnabled && (i > 0)) - { - FT_Get_Kerning(ftFace, fontData[pixelSize].ftgxCharMap[text[i - 1]].glyphIndex, glyphData->glyphIndex, FT_KERNING_DEFAULT, &pairDelta); - strWidth += pairDelta.x >> 6; - } - - strWidth += glyphData->glyphAdvanceX; - } - ++i; - } - return strWidth; -} - -/** - * Single char width - */ -uint16_t FreeTypeGX::getCharWidth(const wchar_t wChar, int16_t pixelSize, const wchar_t prevChar) -{ - uint16_t strWidth = 0; - ftgxCharData * glyphData = cacheGlyphData(wChar, pixelSize); - - if (glyphData != NULL) - { - if (ftKerningEnabled && prevChar != 0x0000) - { - FT_Vector pairDelta; - FT_Get_Kerning(ftFace, fontData[pixelSize].ftgxCharMap[prevChar].glyphIndex, glyphData->glyphIndex, FT_KERNING_DEFAULT, &pairDelta); - strWidth += pairDelta.x >> 6; - } - strWidth += glyphData->glyphAdvanceX; - } - - return strWidth; -} - -/** - * Processes the supplied string and return the height of the string in pixels. - * - * This routine processes each character of the supplied text string and calculates the height of the entire string. - * Note that if precaching of the entire font set is not enabled any uncached glyph will be cached after the call to this function. - * - * @param text NULL terminated string to calculate. - * @return The height of the text string in pixels. - */ -uint16_t FreeTypeGX::getHeight(const wchar_t *text, int16_t pixelSize) -{ - getOffset(text, pixelSize); - return fontData[pixelSize].ftgxAlign.max - fontData[pixelSize].ftgxAlign.min; -} - -/** - * Get the maximum offset above and minimum offset below the font origin line. - * - * This function calculates the maximum pixel height above the font origin line and the minimum - * pixel height below the font origin line and returns the values in an addressible structure. - * - * @param text NULL terminated string to calculate. - * @param offset returns the max and min values above and below the font origin line - * - */ -void FreeTypeGX::getOffset(const wchar_t *text, int16_t pixelSize, uint16_t widthLimit) -{ - if (fontData.find(pixelSize) != fontData.end()) - return; - - int16_t strMax = 0, strMin = 9999; - uint16_t currWidth = 0; - - int i = 0; - - while (text[i]) - { - if (widthLimit > 0 && currWidth >= widthLimit) break; - - ftgxCharData* glyphData = cacheGlyphData(text[i], pixelSize); - - if (glyphData != NULL) - { - strMax = glyphData->renderOffsetMax > strMax ? glyphData->renderOffsetMax : strMax; - strMin = glyphData->renderOffsetMin < strMin ? glyphData->renderOffsetMin : strMin; - currWidth += glyphData->glyphAdvanceX; - } - - ++i; - } - - if (ftPointSize != pixelSize) - { - ftPointSize = pixelSize; - FT_Set_Pixel_Sizes(ftFace, 0, ftPointSize); - } - - fontData[pixelSize].ftgxAlign.ascender = ftFace->size->metrics.ascender >> 6; - fontData[pixelSize].ftgxAlign.descender = ftFace->size->metrics.descender >> 6; - fontData[pixelSize].ftgxAlign.max = strMax; - fontData[pixelSize].ftgxAlign.min = strMin; -} - -/** - * Copies the supplied texture quad to the EFB. - * - * This routine uses the in-built GX quad builder functions to define the texture bounds and location on the EFB target. - * - * @param texObj A pointer to the glyph's initialized texture object. - * @param texWidth The pixel width of the texture object. - * @param texHeight The pixel height of the texture object. - * @param screenX The screen X coordinate at which to output the rendered texture. - * @param screenY The screen Y coordinate at which to output the rendered texture. - * @param color Color to apply to the texture. - */ -void FreeTypeGX::copyTextureToFramebuffer(CVideo *pVideo, GX2Texture *texture, int16_t x, int16_t y, int16_t z, const glm::vec4 & color, const float & defaultBlur, const float & blurIntensity, const glm::vec4 & blurColor, const float & internalRenderingScale) -{ - static const f32 imageAngle = 0.0f; - static const f32 blurScale = (2.0f/ (internalRenderingScale)); - - f32 offsetLeft = blurScale * ((f32)x + 0.5f * (f32)texture->surface.width) * (f32)pVideo->getWidthScaleFactor(); - f32 offsetTop = blurScale * ((f32)y - 0.5f * (f32)texture->surface.height) * (f32)pVideo->getHeightScaleFactor(); - - f32 widthScale = blurScale * (f32)texture->surface.width * pVideo->getWidthScaleFactor(); - f32 heightScale = blurScale * (f32)texture->surface.height * pVideo->getHeightScaleFactor(); - - glm::vec3 positionOffsets( offsetLeft, offsetTop, (f32)z ); - - //! blur doubles due to blur we have to scale the texture - glm::vec3 scaleFactor( widthScale, heightScale, 1.0f ); - - glm::vec3 blurDirection; - blurDirection[2] = 1.0f; - - Texture2DShader::instance()->setShaders(); - Texture2DShader::instance()->setAttributeBuffer(); - Texture2DShader::instance()->setAngle(imageAngle); - Texture2DShader::instance()->setOffset(positionOffsets); - Texture2DShader::instance()->setScale(scaleFactor); - Texture2DShader::instance()->setTextureAndSampler(texture, &ftSampler); - - if(blurIntensity > 0.0f) - { - //! glow blur color - Texture2DShader::instance()->setColorIntensity(blurColor); - - //! glow blur horizontal - blurDirection[0] = blurIntensity; - blurDirection[1] = 0.0f; - Texture2DShader::instance()->setBlurring(blurDirection); - Texture2DShader::instance()->draw(); - - //! glow blur vertical - blurDirection[0] = 0.0f; - blurDirection[1] = blurIntensity; - Texture2DShader::instance()->setBlurring(blurDirection); - Texture2DShader::instance()->draw(); - } - - //! set text color - Texture2DShader::instance()->setColorIntensity(color); - - //! blur horizontal - blurDirection[0] = defaultBlur; - blurDirection[1] = 0.0f; - Texture2DShader::instance()->setBlurring(blurDirection); - Texture2DShader::instance()->draw(); - - //! blur vertical - blurDirection[0] = 0.0f; - blurDirection[1] = defaultBlur; - Texture2DShader::instance()->setBlurring(blurDirection); - Texture2DShader::instance()->draw(); -} diff --git a/src/gui/FreeTypeGX.h b/src/gui/FreeTypeGX.h deleted file mode 100644 index c3843d2..0000000 --- a/src/gui/FreeTypeGX.h +++ /dev/null @@ -1,154 +0,0 @@ -/* - * FreeTypeGX is a wrapper class for libFreeType which renders a compiled - * FreeType parsable font into a GX texture for Wii homebrew development. - * Copyright (C) 2008 Armin Tamzarian - * Modified by Dimok, 2015 for WiiU GX2 - * - * This file is part of FreeTypeGX. - * - * FreeTypeGX is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published - * by the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * FreeTypeGX is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with FreeTypeGX. If not, see . - */ - -#ifndef FREETYPEGX_H_ -#define FREETYPEGX_H_ - -#include -#include -#include FT_FREETYPE_H -#include FT_BITMAP_H - -#include -#include -#include -#include - -#include -#include - -#include "common/types.h" - -/*! \struct ftgxCharData_ - * - * Font face character glyph relevant data structure. - */ -typedef struct ftgxCharData_ -{ - int16_t renderOffsetX; /**< Texture X axis bearing offset. */ - uint16_t glyphAdvanceX; /**< Character glyph X coordinate advance in pixels. */ - uint16_t glyphAdvanceY; /**< Character glyph Y coordinate advance in pixels. */ - uint32_t glyphIndex; /**< Charachter glyph index in the font face. */ - - int16_t renderOffsetY; /**< Texture Y axis bearing offset. */ - int16_t renderOffsetMax; /**< Texture Y axis bearing maximum value. */ - int16_t renderOffsetMin; /**< Texture Y axis bearing minimum value. */ - - GX2Texture * texture; -} ftgxCharData; - -/*! \struct ftgxDataOffset_ - * - * Offset structure which hold both a maximum and minimum value. - */ -typedef struct ftgxDataOffset_ -{ - int16_t ascender; /**< Maximum data offset. */ - int16_t descender; /**< Minimum data offset. */ - int16_t max; /**< Maximum data offset. */ - int16_t min; /**< Minimum data offset. */ -} ftgxDataOffset; - -typedef struct ftgxCharData_ ftgxCharData; -typedef struct ftgxDataOffset_ ftgxDataOffset; -#define _TEXT(t) L ## t /**< Unicode helper macro. */ - -#define FTGX_NULL 0x0000 -#define FTGX_JUSTIFY_LEFT 0x0001 -#define FTGX_JUSTIFY_CENTER 0x0002 -#define FTGX_JUSTIFY_RIGHT 0x0004 -#define FTGX_JUSTIFY_MASK 0x000f - -#define FTGX_ALIGN_TOP 0x0010 -#define FTGX_ALIGN_MIDDLE 0x0020 -#define FTGX_ALIGN_BOTTOM 0x0040 -#define FTGX_ALIGN_BASELINE 0x0080 -#define FTGX_ALIGN_GLYPH_TOP 0x0100 -#define FTGX_ALIGN_GLYPH_MIDDLE 0x0200 -#define FTGX_ALIGN_GLYPH_BOTTOM 0x0400 -#define FTGX_ALIGN_MASK 0x0ff0 - -#define FTGX_STYLE_UNDERLINE 0x1000 -#define FTGX_STYLE_STRIKE 0x2000 -#define FTGX_STYLE_MASK 0xf000 - -/**< Constant color value used only to sanitize Doxygen documentation. */ -static const GX2ColorF32 ftgxWhite = (GX2ColorF32){ 1.0f, 1.0f, 1.0f, 1.0f }; - - -//! forward declaration -class CVideo; - -/*! \class FreeTypeGX - * \brief Wrapper class for the libFreeType library with GX rendering. - * \author Armin Tamzarian - * \version 0.2.4 - * - * FreeTypeGX acts as a wrapper class for the libFreeType library. It supports precaching of transformed glyph data into - * a specified texture format. Rendering of the data to the EFB is accomplished through the application of high performance - * GX texture functions resulting in high throughput of string rendering. - */ -class FreeTypeGX -{ - private: - FT_Library ftLibrary; /**< FreeType FT_Library instance. */ - FT_Face ftFace; /**< FreeType reusable FT_Face typographic object. */ - int16_t ftPointSize; /**< Current set size of the rendered font. */ - bool ftKerningEnabled; /**< Flag indicating the availability of font kerning data. */ - uint8_t vertexIndex; /**< Vertex format descriptor index. */ - GX2Sampler ftSampler; - - typedef struct _ftGX2Data - { - ftgxDataOffset ftgxAlign; - std::map ftgxCharMap; - } ftGX2Data; - - std::map fontData; /**< Map which holds the glyph data structures for the corresponding characters in one size. */ - - int16_t getStyleOffsetWidth(uint16_t width, uint16_t format); - int16_t getStyleOffsetHeight(int16_t format, uint16_t pixelSize); - - void unloadFont(); - ftgxCharData *cacheGlyphData(wchar_t charCode, int16_t pixelSize); - uint16_t cacheGlyphDataComplete(int16_t pixelSize); - void loadGlyphData(FT_Bitmap *bmp, ftgxCharData *charData); - - void copyTextureToFramebuffer(CVideo * pVideo, GX2Texture *tex, int16_t screenX, int16_t screenY, int16_t screenZ, const glm::vec4 & color, const float &textBlur, const float &colorBlurIntensity, const glm::vec4 & blurColor, const float & internalRenderingScale); - - public: - FreeTypeGX(const uint8_t* fontBuffer, FT_Long bufferSize, bool lastFace = false); - ~FreeTypeGX(); - - uint16_t drawText(CVideo * pVideo, int16_t x, int16_t y, int16_t z, const wchar_t *text, int16_t pixelSize, const glm::vec4 & color, - uint16_t textStyling, uint16_t textWidth, const float &textBlur, const float &colorBlurIntensity, const glm::vec4 & blurColor, const float & internalRenderingScale); - - uint16_t getWidth(const wchar_t *text, int16_t pixelSize); - uint16_t getCharWidth(const wchar_t wChar, int16_t pixelSize, const wchar_t prevChar = 0x0000); - uint16_t getHeight(const wchar_t *text, int16_t pixelSize); - void getOffset(const wchar_t *text, int16_t pixelSize, uint16_t widthLimit = 0); - - static wchar_t* charToWideChar(const char* p); - static char* wideCharToUTF8(const wchar_t* strChar); -}; - -#endif /* FREETYPEGX_H_ */ diff --git a/src/gui/GameBgImage.cpp b/src/gui/GameBgImage.cpp deleted file mode 100644 index 6497f4f..0000000 --- a/src/gui/GameBgImage.cpp +++ /dev/null @@ -1,42 +0,0 @@ -#include "GameBgImage.h" -#include "video/CVideo.h" -#include "video/shaders/Shader3D.h" - -GameBgImage::GameBgImage(const std::string & filename, GuiImageData *preloadImage) - : GuiImageAsync(filename, preloadImage) -{ - identity = glm::mat4(1.0f); - alphaFadeOut = glm::vec4(1.0f, 0.075f, 5.305f, 2.0f); -} - -GameBgImage::~GameBgImage() -{ -} - -void GameBgImage::draw(CVideo *pVideo) -{ - if(!getImageData() || !getImageData()->getTexture()) - return; - - //! first setup 2D GUI positions - f32 currPosX = getCenterX(); - f32 currPosY = getCenterY(); - f32 currPosZ = getDepth(); - f32 currScaleX = getScaleX() * (f32)getWidth() * pVideo->getWidthScaleFactor(); - f32 currScaleY = getScaleY() * (f32)getHeight() * pVideo->getHeightScaleFactor(); - f32 currScaleZ = getScaleZ() * (f32)getWidth() * pVideo->getDepthScaleFactor(); - - glm::mat4 m_modelView = glm::translate(identity, glm::vec3(currPosX,currPosY, currPosZ)); - m_modelView = glm::scale(m_modelView, glm::vec3(currScaleX, currScaleY, currScaleZ)); - - Shader3D::instance()->setShaders(); - Shader3D::instance()->setProjectionMtx(identity); - Shader3D::instance()->setViewMtx(identity); - Shader3D::instance()->setModelViewMtx(m_modelView); - Shader3D::instance()->setTextureAndSampler(getImageData()->getTexture(), getImageData()->getSampler()); - Shader3D::instance()->setAlphaFadeOut(alphaFadeOut); - Shader3D::instance()->setDistanceFadeOut(0.0f); - Shader3D::instance()->setColorIntensity(glm::vec4(1.0f, 1.0f, 1.0f, getAlpha())); - Shader3D::instance()->setAttributeBuffer(); - Shader3D::instance()->draw(); -} diff --git a/src/gui/GameBgImage.h b/src/gui/GameBgImage.h deleted file mode 100644 index a78b715..0000000 --- a/src/gui/GameBgImage.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef _GAME_BG_IMAGE_H_ -#define _GAME_BG_IMAGE_H_ - -#include "GuiImageAsync.h" -#include "video/shaders/Shader3D.h" - -class GameBgImage : public GuiImageAsync -{ -public: - GameBgImage(const std::string & filename, GuiImageData *preloadImage); - virtual ~GameBgImage(); - - void setAlphaFadeOut(const glm::vec4 & a) { - alphaFadeOut = a; - } - - void draw(CVideo *pVideo); -private: - glm::mat4 identity; - glm::vec4 alphaFadeOut; -}; - -#endif // _GAME_BG_IMAGE_H_ diff --git a/src/gui/GameIcon.cpp b/src/gui/GameIcon.cpp deleted file mode 100644 index ca051ac..0000000 --- a/src/gui/GameIcon.cpp +++ /dev/null @@ -1,321 +0,0 @@ -#include "GameIcon.h" -#include "GameIconModel.h" -#include "Application.h" -#include "video/CVideo.h" -#include "video/shaders/Shader3D.h" -#include "video/shaders/ShaderFractalColor.h" - -static const f32 cfIconMirrorScale = 1.15f; -static const f32 cfIconMirrorAlpha = 0.45f; - -GameIcon::GameIcon(const std::string & filename, GuiImageData *preloadImage) - : GuiImageAsync(filename, preloadImage) -{ - bSelected = false; - bRenderStroke = true; - bRenderReflection = false; - bIconLast = false; - strokeFractalEnable = 1; - strokeBlurBorder = 0.0f; - distanceFadeout = 0.0f; - rotationX = 0.0f; - reflectionAlpha = 0.4f; - strokeWidth = 2.35f; - colorIntensity = glm::vec4(1.0f); - colorIntensityMirror = colorIntensity; - alphaFadeOutNorm = glm::vec4(0.0f); - alphaFadeOutRefl = glm::vec4(-1.0f, 0.0f, 0.9f, 1.0f); - selectionBlurOuterColorIntensity = glm::vec4(0.09411764f * 1.15f, 0.56862745f * 1.15f, 0.96862745098f * 1.15f, 1.0f); - selectionBlurOuterSize = 1.65f; - selectionBlurOuterBorderSize = 0.5f; - selectionBlurInnerColorIntensity = glm::vec4(0.46666667f, 0.90588235f, 1.0f, 1.0f); - selectionBlurInnerSize = 1.45f; - selectionBlurInnerBorderSize = 0.95f; - - vtxCount = sizeof(cfGameIconPosVtxs) / (Shader3D::cuVertexAttrSize); - - //! texture and vertex coordinates - posVtxs = (f32*)memalign(GX2_VERTEX_BUFFER_ALIGNMENT, sizeof(cfGameIconPosVtxs)); - texCoords = (f32*)memalign(GX2_VERTEX_BUFFER_ALIGNMENT, sizeof(cfGameIconTexCoords)); - - if(posVtxs) - { - memcpy((f32*)posVtxs, cfGameIconPosVtxs, sizeof(cfGameIconPosVtxs)); - GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, (f32*)posVtxs, sizeof(cfGameIconPosVtxs)); - } - if(texCoords) - { - memcpy((f32*)texCoords, cfGameIconTexCoords, sizeof(cfGameIconTexCoords)); - GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, (f32*)texCoords, sizeof(cfGameIconTexCoords)); - } - - //! create vertexes for the mirror frame - texCoordsMirror = (f32*)memalign(GX2_VERTEX_BUFFER_ALIGNMENT, sizeof(cfGameIconTexCoords)); - - if(texCoordsMirror) - { - for(u32 i = 0; i < vtxCount; i++) - { - texCoordsMirror[i*2 + 0] = texCoords[i*2 + 0] * cfIconMirrorScale - ((cfIconMirrorScale - 1.0f) - (cfIconMirrorScale - 1.0f) * 0.5f); - texCoordsMirror[i*2 + 1] = texCoords[i*2 + 1] * cfIconMirrorScale - ((cfIconMirrorScale - 1.0f) - (cfIconMirrorScale - 1.0f) * 0.5f); - } - GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, texCoordsMirror, sizeof(cfGameIconTexCoords)); - } - - //! setup stroke of the icon - strokePosVtxs = (f32*)memalign(GX2_VERTEX_BUFFER_ALIGNMENT, sizeof(cfGameIconStrokeVtxs)); - if(strokePosVtxs) - { - memcpy(strokePosVtxs, cfGameIconStrokeVtxs, sizeof(cfGameIconStrokeVtxs)); - GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, strokePosVtxs, sizeof(cfGameIconStrokeVtxs)); - } - strokeTexCoords = (f32*)memalign(GX2_VERTEX_BUFFER_ALIGNMENT, cuGameIconStrokeVtxCount * Shader::cuTexCoordAttrSize); - if(strokeTexCoords) - { - for(size_t i = 0, n = 0; i < cuGameIconStrokeVtxCount; n += 2, i += 3) - { - strokeTexCoords[n] = (1.0f + strokePosVtxs[i]) * 0.5f; - strokeTexCoords[n+1] = 1.0f - (1.0f + strokePosVtxs[i+1]) * 0.5f; - } - GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, strokeTexCoords, cuGameIconStrokeVtxCount * Shader::cuTexCoordAttrSize); - } - strokeColorVtxs = (u8*)memalign(GX2_VERTEX_BUFFER_ALIGNMENT, cuGameIconStrokeVtxCount * Shader::cuColorAttrSize); - if(strokeColorVtxs) - { - for(size_t i = 0; i < (cuGameIconStrokeVtxCount * Shader::cuColorAttrSize); i++) - strokeColorVtxs[i] = 0xff; - GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, strokeColorVtxs, cuGameIconStrokeVtxCount * Shader::cuColorAttrSize); - } -} - -GameIcon::~GameIcon() -{ - //! remove image so it can not be drawn anymore from this point on - imageData = NULL; - - //! main image vertexes - if(posVtxs) - { - free((void*)posVtxs); - posVtxs = NULL; - } - if(texCoords) - { - free((void*)texCoords); - texCoords = NULL; - } - //! mirror image vertexes - if(texCoordsMirror) - { - free(texCoordsMirror); - texCoordsMirror = NULL; - } - //! stroke image vertexes - if(strokePosVtxs) - { - free(strokePosVtxs); - strokePosVtxs = NULL; - } - if(strokeTexCoords) - { - free(strokeTexCoords); - strokeTexCoords = NULL; - } - if(strokeColorVtxs) - { - free(strokeColorVtxs); - strokeColorVtxs = NULL; - } -} - -bool GameIcon::checkRayIntersection(const glm::vec3 & rayOrigin, const glm::vec3 & rayDirFrac) -{ - //! since we always face the camera we can just check the AABB intersection - //! otherwise an OOB intersection would be required - - f32 currPosX = getCenterX() * Application::instance()->getVideo()->getWidthScaleFactor() * 2.0f; - f32 currPosY = getCenterY() * Application::instance()->getVideo()->getHeightScaleFactor() * 2.0f; - f32 currPosZ = getDepth() * Application::instance()->getVideo()->getDepthScaleFactor() * 2.0f; - f32 currScaleX = getScaleX() * (f32)getWidth() * Application::instance()->getVideo()->getWidthScaleFactor(); - f32 currScaleY = getScaleY() * (f32)getHeight() * Application::instance()->getVideo()->getHeightScaleFactor(); - f32 currScaleZ = getScaleZ() * (f32)getWidth() * Application::instance()->getVideo()->getDepthScaleFactor(); - //! lb is the corner of AABB with minimal coordinates - left bottom, rt is maximal corner - glm::vec3 lb(currPosX - currScaleX, currPosY - currScaleY, currPosZ - currScaleZ); - glm::vec3 rt(currPosX + currScaleX, currPosY + currScaleY, currPosZ + currScaleZ); - - float t1 = (lb.x - rayOrigin.x) * rayDirFrac.x; - float t2 = (rt.x - rayOrigin.x) * rayDirFrac.x; - float t3 = (lb.y - rayOrigin.y) * rayDirFrac.y; - float t4 = (rt.y - rayOrigin.y) * rayDirFrac.y; - float t5 = (lb.z - rayOrigin.z) * rayDirFrac.z; - float t6 = (rt.z - rayOrigin.z) * rayDirFrac.z; - - float tmin = std::max(std::max(std::min(t1, t2), std::min(t3, t4)), std::min(t5, t6)); - float tmax = std::min(std::min(std::max(t1, t2), std::max(t3, t4)), std::max(t5, t6)); - - //! if tmax < 0, ray (line) is intersecting AABB, but whole AABB is behing us - if (tmax < 0) - { - //t = tmax; - return false; - } - - //! if tmin > tmax, ray doesn't intersect AABB - if (tmin > tmax) - { - //t = tmax; - return false; - } - - //t = tmin; - return true; -} - -void GameIcon::draw(CVideo *pVideo, const glm::mat4 & projectionMtx, const glm::mat4 & viewMtx, const glm::mat4 & modelView) -{ - //! first setup 2D GUI positions - f32 currPosX = getCenterX() * pVideo->getWidthScaleFactor() * 2.0f; - f32 currPosY = getCenterY() * pVideo->getHeightScaleFactor() * 2.0f; - f32 currPosZ = getDepth() * pVideo->getDepthScaleFactor() * 2.0f; - f32 currScaleX = getScaleX() * (f32)getWidth() * pVideo->getWidthScaleFactor(); - f32 currScaleY = getScaleY() * (f32)getHeight() * pVideo->getHeightScaleFactor(); - f32 currScaleZ = getScaleZ() * (f32)getWidth() * pVideo->getDepthScaleFactor(); - f32 strokeScaleX = pVideo->getWidthScaleFactor() * strokeWidth * 0.25f + cfIconMirrorScale; - f32 strokeScaleY = pVideo->getHeightScaleFactor() * strokeWidth * 0.25f + cfIconMirrorScale; - - for(int iDraw = 0; iDraw < 2; iDraw++) - { - glm::vec4 * alphaFadeOut; - glm::mat4 m_iconView; - glm::mat4 m_mirrorView; - glm::mat4 m_strokeView; - - if(iDraw == RENDER_REFLECTION) - { - //! Reflection render - if(!bRenderReflection) - continue; - m_iconView = glm::translate(modelView, glm::vec3(currPosX, -currScaleY * 2.0f - currPosY, currPosZ + cosf(DegToRad(rotationX)) * currScaleZ * 2.0f)); - m_iconView = glm::rotate(m_iconView, DegToRad(rotationX), glm::vec3(1.0f, 0.0f, 0.0f)); - m_iconView = glm::scale(m_iconView, glm::vec3(currScaleX, -currScaleY, currScaleZ)); - - colorIntensity[3] = reflectionAlpha * getAlpha(); - selectionBlurOuterColorIntensity[3] = colorIntensity[3] * 0.7f; - selectionBlurInnerColorIntensity[3] = colorIntensity[3] * 0.7f; - alphaFadeOut = &alphaFadeOutRefl; - - GX2SetCullOnlyControl(GX2_FRONT_FACE_CCW, GX2_ENABLE, GX2_DISABLE); - } - else - { - //! Normal render - m_iconView = glm::translate(modelView, glm::vec3(currPosX,currPosY, currPosZ)); - m_iconView = glm::rotate(m_iconView, DegToRad(rotationX), glm::vec3(1.0f, 0.0f, 0.0f)); - m_iconView = glm::scale(m_iconView, glm::vec3(currScaleX, currScaleY, currScaleZ)); - - colorIntensity[3] = getAlpha(); - selectionBlurOuterColorIntensity[3] = colorIntensity[3]; - selectionBlurInnerColorIntensity[3] = colorIntensity[3]; - alphaFadeOut = &alphaFadeOutNorm; - } - - m_mirrorView = glm::scale(m_iconView, glm::vec3(cfIconMirrorScale, cfIconMirrorScale, cfIconMirrorScale)); - - colorIntensityMirror[3] = cfIconMirrorAlpha * colorIntensity[3]; - - if(!bIconLast) - { - Shader3D::instance()->setShaders(); - Shader3D::instance()->setProjectionMtx(projectionMtx); - Shader3D::instance()->setViewMtx(viewMtx); - Shader3D::instance()->setTextureAndSampler(imageData->getTexture(), imageData->getSampler()); - Shader3D::instance()->setAlphaFadeOut(*alphaFadeOut); - Shader3D::instance()->setDistanceFadeOut(distanceFadeout); - - //! render the real symbol - Shader3D::instance()->setModelViewMtx(m_iconView); - Shader3D::instance()->setColorIntensity(colorIntensity); - Shader3D::instance()->setAttributeBuffer(vtxCount, posVtxs, texCoords); - Shader3D::instance()->draw(GX2_PRIMITIVE_MODE_QUADS, vtxCount); - } - - if(bSelected) - { - strokeFractalEnable = 0; - - GX2SetDepthOnlyControl(GX2_ENABLE, GX2_DISABLE, GX2_COMPARE_FUNC_LEQUAL); - m_strokeView = glm::scale(m_iconView, glm::vec3(selectionBlurOuterSize, selectionBlurOuterSize, 0.0f)); - ShaderFractalColor::instance()->setShaders(); - ShaderFractalColor::instance()->setProjectionMtx(projectionMtx); - ShaderFractalColor::instance()->setViewMtx(viewMtx); - ShaderFractalColor::instance()->setModelViewMtx(m_strokeView); - ShaderFractalColor::instance()->setFractalColor(strokeFractalEnable); - ShaderFractalColor::instance()->setBlurBorder(selectionBlurOuterBorderSize); - ShaderFractalColor::instance()->setColorIntensity(selectionBlurOuterColorIntensity); - ShaderFractalColor::instance()->setAlphaFadeOut(*alphaFadeOut); - ShaderFractalColor::instance()->setAttributeBuffer(); - ShaderFractalColor::instance()->draw(); - - m_strokeView = glm::scale(m_iconView, glm::vec3(selectionBlurInnerSize, selectionBlurInnerSize, 0.0f)); - ShaderFractalColor::instance()->setBlurBorder(selectionBlurInnerBorderSize); - ShaderFractalColor::instance()->setColorIntensity(selectionBlurInnerColorIntensity); - ShaderFractalColor::instance()->draw(); - GX2SetDepthOnlyControl(GX2_ENABLE, GX2_ENABLE, GX2_COMPARE_FUNC_LEQUAL); - } - - if(iDraw == RENDER_NORMAL && bRenderStroke) - { - strokeFractalEnable = 1; - //! now render the icon stroke - //! make the stroke a little bigger than the mirror, just by the line width on each side - m_strokeView = glm::scale(m_iconView, glm::vec3(strokeScaleX, strokeScaleY, cfIconMirrorScale)); - - ShaderFractalColor::instance()->setShaders(); - ShaderFractalColor::instance()->setLineWidth(strokeWidth); - ShaderFractalColor::instance()->setProjectionMtx(projectionMtx); - ShaderFractalColor::instance()->setViewMtx(viewMtx); - ShaderFractalColor::instance()->setModelViewMtx(m_strokeView); - ShaderFractalColor::instance()->setFractalColor(strokeFractalEnable); - ShaderFractalColor::instance()->setBlurBorder(strokeBlurBorder); - ShaderFractalColor::instance()->setColorIntensity(colorIntensity); - ShaderFractalColor::instance()->setAlphaFadeOut(*alphaFadeOut); - ShaderFractalColor::instance()->setAttributeBuffer(cuGameIconStrokeVtxCount, strokePosVtxs, strokeTexCoords, strokeColorVtxs); - ShaderFractalColor::instance()->draw(GX2_PRIMITIVE_MODE_LINE_STRIP, cuGameIconStrokeVtxCount); - - } - - //! render the background mirror frame - Shader3D::instance()->setShaders(); - Shader3D::instance()->setProjectionMtx(projectionMtx); - Shader3D::instance()->setViewMtx(viewMtx); - Shader3D::instance()->setTextureAndSampler(imageData->getTexture(), imageData->getSampler()); - Shader3D::instance()->setAlphaFadeOut(*alphaFadeOut); - Shader3D::instance()->setDistanceFadeOut(distanceFadeout); - Shader3D::instance()->setModelViewMtx(m_mirrorView); - Shader3D::instance()->setColorIntensity(colorIntensityMirror); - Shader3D::instance()->setAttributeBuffer(vtxCount, posVtxs, texCoordsMirror); - Shader3D::instance()->draw(GX2_PRIMITIVE_MODE_QUADS, vtxCount); - - if(bIconLast) - { - Shader3D::instance()->setShaders(); - Shader3D::instance()->setProjectionMtx(projectionMtx); - Shader3D::instance()->setViewMtx(viewMtx); - Shader3D::instance()->setTextureAndSampler(imageData->getTexture(), imageData->getSampler()); - Shader3D::instance()->setAlphaFadeOut(*alphaFadeOut); - Shader3D::instance()->setDistanceFadeOut(distanceFadeout); - - //! render the real symbol - Shader3D::instance()->setModelViewMtx(m_iconView); - Shader3D::instance()->setColorIntensity(colorIntensity); - Shader3D::instance()->setAttributeBuffer(vtxCount, posVtxs, texCoords); - Shader3D::instance()->draw(GX2_PRIMITIVE_MODE_QUADS, vtxCount); - } - - //! return back normal culling - if(iDraw == RENDER_REFLECTION) - { - GX2SetCullOnlyControl(GX2_FRONT_FACE_CCW, GX2_DISABLE, GX2_ENABLE); - } - } -} diff --git a/src/gui/GameIcon.h b/src/gui/GameIcon.h deleted file mode 100644 index 238060c..0000000 --- a/src/gui/GameIcon.h +++ /dev/null @@ -1,85 +0,0 @@ -#ifndef _GAME_ICON_H_ -#define _GAME_ICON_H_ - -#include "GuiImageAsync.h" -#include "video/shaders/Shader3D.h" - -class GameIcon : public GuiImageAsync -{ -public: - GameIcon(const std::string & filename, GuiImageData *preloadImage); - virtual ~GameIcon(); - - void setRotationX(f32 r) { - rotationX = r; - } - void setColorIntensity(const glm::vec4 & color) { - colorIntensity = color; - colorIntensityMirror = colorIntensity; - selectionBlurOuterColorIntensity = color * glm::vec4(0.09411764f * 1.15f, 0.56862745f * 1.15f, 0.96862745098f * 1.15f, 1.0f); - selectionBlurInnerColorIntensity = color * glm::vec4(0.46666667f, 0.90588235f, 1.0f, 1.0f); - } - const glm::vec4 & getColorIntensity() const { - return colorIntensity; - } - void setAlphaFadeOutNorm(const glm::vec4 & a) { - alphaFadeOutNorm = a; - } - void setAlphaFadeOutRefl(const glm::vec4 & a) { - alphaFadeOutRefl = a; - } - void setRenderReflection(bool enable) { - bRenderReflection = enable; - } - void setSelected(bool enable) { - bSelected = enable; - } - void setStrokeRender(bool enable) { - bRenderStroke = enable; - } - void setRenderIconLast(bool enable) { - bIconLast = enable; - } - void draw(CVideo *pVideo) { - static const glm::mat4 identity(1.0f); - draw(pVideo, identity, identity, identity); - } - void draw(CVideo *pVideo, const glm::mat4 & projection, const glm::mat4 & view, const glm::mat4 & modelView); - - bool checkRayIntersection(const glm::vec3 & rayOrigin, const glm::vec3 & rayDirFrac); -private: - enum eRenderState - { - RENDER_REFLECTION, - RENDER_NORMAL - }; - - bool bSelected; - bool bRenderStroke; - bool bRenderReflection; - bool bIconLast; - glm::vec4 colorIntensity; - glm::vec4 colorIntensityMirror; - glm::vec4 alphaFadeOutNorm; - glm::vec4 alphaFadeOutRefl; - - f32 reflectionAlpha; - f32 strokeWidth; - f32 rotationX; - f32 rgbReduction; - f32 distanceFadeout; - f32 *texCoordsMirror; - f32 *strokePosVtxs; - f32 *strokeTexCoords; - u8 *strokeColorVtxs; - int strokeFractalEnable; - f32 strokeBlurBorder; - glm::vec4 selectionBlurOuterColorIntensity; - f32 selectionBlurOuterSize; - f32 selectionBlurOuterBorderSize; - glm::vec4 selectionBlurInnerColorIntensity; - f32 selectionBlurInnerSize; - f32 selectionBlurInnerBorderSize; -}; - -#endif // _GAME_ICON_H_ diff --git a/src/gui/GameIconModel.h b/src/gui/GameIconModel.h deleted file mode 100644 index 97621ea..0000000 --- a/src/gui/GameIconModel.h +++ /dev/null @@ -1,760 +0,0 @@ -#ifndef ICON_MODEL_H_ -#define ICON_MODEL_H_ - -static const float cfGameIconPosVtxs[] = { --0.844501f,-0.861263f,0.050154f,-0.802664f,-0.8797f,0.054004f,-0.809968f,-0.828995f,0.061777f,-0.864233f,-0.822169f,0.054004f, --0.802664f,-0.8797f,0.054004f,-0.726455f,-0.89991f,0.058224f,-0.730326f,-0.842312f,0.067487f,-0.809968f,-0.828995f,0.061777f, --0.809968f,-0.828995f,0.061777f,-0.730326f,-0.842312f,0.067487f,-0.738488f,-0.760488f,0.074426f,-0.824221f,-0.752861f,0.067487f, --0.864233f,-0.822169f,0.054004f,-0.809968f,-0.828995f,0.061777f,-0.824221f,-0.752861f,0.067487f,-0.885862f,-0.749245f,0.058224f, --0.726455f,-0.89991f,0.058224f,-0.612405f,-0.916988f,0.061789f,-0.614352f,-0.854962f,0.071886f,-0.730326f,-0.842312f,0.067487f, --0.612405f,-0.916988f,0.061789f,-0.392243f,-0.928623f,0.064218f,-0.39312f,-0.8642f,0.074693f,-0.614352f,-0.854962f,0.071886f, --0.614352f,-0.854962f,0.071886f,-0.39312f,-0.8642f,0.074693f,-0.395094f,-0.775509f,0.082561f,-0.618732f,-0.768902f,0.079479f, --0.730326f,-0.842312f,0.067487f,-0.614352f,-0.854962f,0.071886f,-0.618732f,-0.768902f,0.079479f,-0.738488f,-0.760488f,0.074426f, --0.738488f,-0.760488f,0.074426f,-0.618732f,-0.768902f,0.079479f,-0.624085f,-0.648442f,0.084918f,-0.747494f,-0.64344f,0.079479f, --0.618732f,-0.768902f,0.079479f,-0.395094f,-0.775509f,0.082561f,-0.397505f,-0.652534f,0.088189f,-0.624085f,-0.648442f,0.084918f, --0.624085f,-0.648442f,0.084918f,-0.397505f,-0.652534f,0.088189f,-0.399478f,-0.422739f,0.09157f,-0.628465f,-0.420911f,0.088189f, --0.747494f,-0.64344f,0.079479f,-0.624085f,-0.648442f,0.084918f,-0.628465f,-0.420911f,0.088189f,-0.754564f,-0.418675f,0.082561f, --0.885862f,-0.749245f,0.058224f,-0.824221f,-0.752861f,0.067487f,-0.837759f,-0.639347f,0.071886f,-0.90414f,-0.637528f,0.061789f, --0.824221f,-0.752861f,0.067487f,-0.738488f,-0.760488f,0.074426f,-0.747494f,-0.64344f,0.079479f,-0.837759f,-0.639347f,0.071886f, --0.837759f,-0.639347f,0.071886f,-0.747494f,-0.64344f,0.079479f,-0.754564f,-0.418675f,0.082561f,-0.847646f,-0.416846f,0.074693f, --0.90414f,-0.637528f,0.061789f,-0.837759f,-0.639347f,0.071886f,-0.847646f,-0.416846f,0.074693f,-0.916591f,-0.416033f,0.064218f, --0.399478f,-0.422739f,0.09157f,-0.397505f,-0.652534f,0.088189f,0.002274f,-0.653898f,0.089279f,0.002265f,-0.423349f,0.092698f, --0.397505f,-0.652534f,0.088189f,-0.395094f,-0.775509f,0.082561f,0.002284f,-0.777711f,0.083588f,0.002274f,-0.653898f,0.089279f, -0.002274f,-0.653898f,0.089279f,0.002284f,-0.777711f,0.083588f,0.399509f,-0.775509f,0.082561f,0.401892f,-0.652534f,0.088189f, -0.002265f,-0.423349f,0.092698f,0.002274f,-0.653898f,0.089279f,0.401892f,-0.652534f,0.088189f,0.403842f,-0.422739f,0.09157f, --0.395094f,-0.775509f,0.082561f,-0.39312f,-0.8642f,0.074693f,0.002293f,-0.867279f,0.075629f,0.002284f,-0.777711f,0.083588f, --0.39312f,-0.8642f,0.074693f,-0.392243f,-0.928623f,0.064218f,0.002297f,-0.932501f,0.065028f,0.002293f,-0.867279f,0.075629f, -0.002293f,-0.867279f,0.075629f,0.002297f,-0.932501f,0.065028f,0.396693f,-0.928623f,0.064218f,0.397559f,-0.8642f,0.074693f, -0.002284f,-0.777711f,0.083588f,0.002293f,-0.867279f,0.075629f,0.397559f,-0.8642f,0.074693f,0.399509f,-0.775509f,0.082561f, --0.399478f,-0.422739f,0.09157f,0.002265f,-0.423349f,0.092698f,0.002263f,-0.013572f,0.093837f,-0.400136f,-0.013589f,0.092698f, -0.002265f,-0.423349f,0.092698f,0.403842f,-0.422739f,0.09157f,0.404492f,-0.013589f,0.092698f,0.002263f,-0.013572f,0.093837f, -0.002263f,-0.013572f,0.093837f,0.404492f,-0.013589f,0.092698f,0.403842f,0.396564f,0.09157f,0.002265f,0.397221f,0.092698f, --0.400136f,-0.013589f,0.092698f,0.002263f,-0.013572f,0.093837f,0.002265f,0.397221f,0.092698f,-0.399478f,0.396564f,0.09157f, --0.754564f,0.392188f,0.082561f,-0.847646f,0.390218f,0.074693f,-0.850941f,-0.013754f,0.075629f,-0.756921f,-0.013703f,0.083588f, --0.847646f,0.390218f,0.074693f,-0.916591f,0.389343f,0.064218f,-0.920742f,-0.013776f,0.065028f,-0.850941f,-0.013754f,0.075629f, --0.850941f,-0.013754f,0.075629f,-0.920742f,-0.013776f,0.065028f,-0.916591f,-0.416033f,0.064218f,-0.847646f,-0.416846f,0.074693f, --0.756921f,-0.013703f,0.083588f,-0.850941f,-0.013754f,0.075629f,-0.847646f,-0.416846f,0.074693f,-0.754564f,-0.418675f,0.082561f, --0.754564f,0.392188f,0.082561f,-0.756921f,-0.013703f,0.083588f,-0.629925f,-0.01364f,0.089279f,-0.628465f,0.394595f,0.088189f, --0.756921f,-0.013703f,0.083588f,-0.754564f,-0.418675f,0.082561f,-0.628465f,-0.420911f,0.088189f,-0.629925f,-0.01364f,0.089279f, --0.629925f,-0.01364f,0.089279f,-0.628465f,-0.420911f,0.088189f,-0.399478f,-0.422739f,0.09157f,-0.400136f,-0.013589f,0.092698f, --0.628465f,0.394595f,0.088189f,-0.629925f,-0.01364f,0.089279f,-0.400136f,-0.013589f,0.092698f,-0.399478f,0.396564f,0.09157f, --0.844501f,0.846382f,0.050154f,-0.802664f,0.865969f,0.054004f,-0.814648f,0.914535f,0.037876f,-0.871108f,0.872793f,0.036675f, --0.802664f,0.865969f,0.054004f,-0.726455f,0.887439f,0.058224f,-0.733131f,0.94538f,0.040237f,-0.814648f,0.914535f,0.037876f, --0.814648f,0.914535f,0.037876f,-0.733131f,0.94538f,0.040237f,-0.74278f,0.982563f,0.019733f,-0.830745f,0.945555f,0.018815f, --0.871108f,0.872793f,0.036675f,-0.814648f,0.914535f,0.037876f,-0.830745f,0.945555f,0.018815f,-0.894756f,0.896267f,0.018385f, --0.726455f,0.887439f,0.058224f,-0.612405f,0.905582f,0.061789f,-0.615909f,0.968735f,0.042517f,-0.733131f,0.94538f,0.040237f, --0.612405f,0.905582f,0.061789f,-0.392243f,0.917941f,0.064218f,-0.393822f,0.983443f,0.044197f,-0.615909f,0.968735f,0.042517f, --0.615909f,0.968735f,0.042517f,-0.393822f,0.983443f,0.044197f,-0.396235f,1.025424f,0.021594f,-0.621266f,1.009264f,0.020771f, --0.733131f,0.94538f,0.040237f,-0.615909f,0.968735f,0.042517f,-0.621266f,1.009264f,0.020771f,-0.74278f,0.982563f,0.019733f, --0.621266f,1.009264f,0.020771f,-0.396235f,1.025424f,0.021594f,-0.398382f,1.047552f,0.0f,-0.626031f,1.030658f,0.0f, --0.74278f,0.982563f,0.019733f,-0.621266f,1.009264f,0.020771f,-0.626031f,1.030658f,0.0f,-0.750636f,1.002556f,0.0f, --0.830745f,0.945555f,0.018815f,-0.74278f,0.982563f,0.019733f,-0.750636f,1.002556f,0.0f,-0.842153f,0.963302f,0.0f, --0.894756f,0.896267f,0.018385f,-0.830745f,0.945555f,0.018815f,-0.842153f,0.963302f,0.0f,-0.909674f,0.911075f,0.0f, --0.398382f,1.047552f,0.0f,-0.396235f,1.025424f,0.021594f,0.002279f,1.030811f,0.021869f,0.00227f,1.053183f,0.0f, -0.002279f,1.030811f,0.021869f,-0.396235f,1.025424f,0.021594f,-0.393822f,0.983443f,0.044197f,0.00229f,0.988345f,0.044757f, -0.400637f,1.025424f,0.021594f,0.002279f,1.030811f,0.021869f,0.00229f,0.988345f,0.044757f,0.398253f,0.983443f,0.044197f, -0.00227f,1.053183f,0.0f,0.002279f,1.030811f,0.021869f,0.400637f,1.025424f,0.021594f,0.402758f,1.047552f,0.0f, --0.393822f,0.983443f,0.044197f,-0.392243f,0.917941f,0.064218f,0.002297f,0.922061f,0.065028f,0.00229f,0.988345f,0.044757f, -0.00229f,0.988345f,0.044757f,0.002297f,0.922061f,0.065028f,0.396693f,0.917941f,0.064218f,0.398253f,0.983443f,0.044197f, -0.396693f,-0.928623f,0.064218f,0.002297f,-0.932501f,0.065028f,0.00229f,-0.994896f,0.044757f,0.398253f,-0.990281f,0.044197f, -0.002297f,-0.932501f,0.065028f,-0.392243f,-0.928623f,0.064218f,-0.393822f,-0.990281f,0.044197f,0.00229f,-0.994896f,0.044757f, -0.00229f,-0.994896f,0.044757f,-0.393822f,-0.990281f,0.044197f,-0.396235f,-1.0298f,0.021594f,0.002279f,-1.034871f,0.021869f, -0.398253f,-0.990281f,0.044197f,0.00229f,-0.994896f,0.044757f,0.002279f,-1.034871f,0.021869f,0.400637f,-1.0298f,0.021594f, --0.396235f,-1.0298f,0.021594f,-0.398382f,-1.050629f,0.0f,0.00227f,-1.05593f,0.0f,0.002279f,-1.034871f,0.021869f, -0.002279f,-1.034871f,0.021869f,0.00227f,-1.05593f,0.0f,0.402758f,-1.050629f,0.0f,0.400637f,-1.0298f,0.021594f, --0.909674f,-0.922159f,0.0f,-0.842153f,-0.971323f,0.0f,-0.830745f,-0.954616f,0.018815f,-0.894756f,-0.90822f,0.018385f, --0.842153f,-0.971323f,0.0f,-0.750636f,-1.008273f,0.0f,-0.74278f,-0.989453f,0.019733f,-0.830745f,-0.954616f,0.018815f, --0.830745f,-0.954616f,0.018815f,-0.74278f,-0.989453f,0.019733f,-0.733131f,-0.954452f,0.040237f,-0.814648f,-0.925416f,0.037876f, --0.894756f,-0.90822f,0.018385f,-0.830745f,-0.954616f,0.018815f,-0.814648f,-0.925416f,0.037876f,-0.871108f,-0.886124f,0.036675f, --0.750636f,-1.008273f,0.0f,-0.626031f,-1.034726f,0.0f,-0.621266f,-1.014588f,0.020771f,-0.74278f,-0.989453f,0.019733f, --0.626031f,-1.034726f,0.0f,-0.398382f,-1.050629f,0.0f,-0.396235f,-1.0298f,0.021594f,-0.621266f,-1.014588f,0.020771f, --0.621266f,-1.014588f,0.020771f,-0.396235f,-1.0298f,0.021594f,-0.393822f,-0.990281f,0.044197f,-0.615909f,-0.976437f,0.042517f, --0.74278f,-0.989453f,0.019733f,-0.621266f,-1.014588f,0.020771f,-0.615909f,-0.976437f,0.042517f,-0.733131f,-0.954452f,0.040237f, --0.615909f,-0.976437f,0.042517f,-0.393822f,-0.990281f,0.044197f,-0.392243f,-0.928623f,0.064218f,-0.612405f,-0.916988f,0.061789f, --0.733131f,-0.954452f,0.040237f,-0.615909f,-0.976437f,0.042517f,-0.612405f,-0.916988f,0.061789f,-0.726455f,-0.89991f,0.058224f, --0.814648f,-0.925416f,0.037876f,-0.733131f,-0.954452f,0.040237f,-0.726455f,-0.89991f,0.058224f,-0.802664f,-0.8797f,0.054004f, --0.871108f,-0.886124f,0.036675f,-0.814648f,-0.925416f,0.037876f,-0.802664f,-0.8797f,0.054004f,-0.844501f,-0.861263f,0.050154f, -0.846982f,-0.861263f,0.050154f,0.87333f,-0.886124f,0.036675f,0.914973f,-0.833367f,0.037876f,0.866523f,-0.822169f,0.054004f, -0.914973f,-0.833367f,0.037876f,0.87333f,-0.886124f,0.036675f,0.896749f,-0.90822f,0.018385f,0.94592f,-0.848408f,0.018815f, -0.945745f,-0.755482f,0.040237f,0.914973f,-0.833367f,0.037876f,0.94592f,-0.848408f,0.018815f,0.982841f,-0.764498f,0.019733f, -0.866523f,-0.822169f,0.054004f,0.914973f,-0.833367f,0.037876f,0.945745f,-0.755482f,0.040237f,0.887941f,-0.749245f,0.058224f, -0.896749f,-0.90822f,0.018385f,0.911522f,-0.922159f,0.0f,0.963626f,-0.859068f,0.0f,0.94592f,-0.848408f,0.018815f, -0.94592f,-0.848408f,0.018815f,0.963626f,-0.859068f,0.0f,1.002787f,-0.771839f,0.0f,0.982841f,-0.764498f,0.019733f, -0.945745f,-0.755482f,0.040237f,0.982841f,-0.764498f,0.019733f,1.009478f,-0.645808f,0.020771f,0.969045f,-0.640802f,0.042517f, -0.982841f,-0.764498f,0.019733f,1.002787f,-0.771839f,0.0f,1.030822f,-0.650261f,0.0f,1.009478f,-0.645808f,0.020771f, -1.009478f,-0.645808f,0.020771f,1.030822f,-0.650261f,0.0f,1.047675f,-0.421723f,0.0f,1.025601f,-0.419734f,0.021594f, -1.009478f,-0.645808f,0.020771f,1.025601f,-0.419734f,0.021594f,0.983719f,-0.417497f,0.044197f,0.969045f,-0.640802f,0.042517f, -0.887941f,-0.749245f,0.058224f,0.945745f,-0.755482f,0.040237f,0.969045f,-0.640802f,0.042517f,0.906041f,-0.637528f,0.061789f, -0.906041f,-0.637528f,0.061789f,0.969045f,-0.640802f,0.042517f,0.983719f,-0.417497f,0.044197f,0.918372f,-0.416033f,0.064218f, -0.918372f,-0.416033f,0.064218f,0.983719f,-0.417497f,0.044197f,0.98861f,-0.013736f,0.044757f,0.922482f,-0.013776f,0.065028f, -0.98861f,-0.013736f,0.044757f,0.983719f,-0.417497f,0.044197f,1.025601f,-0.419734f,0.021594f,1.030975f,-0.013673f,0.021869f, -0.983719f,0.390919f,0.044197f,0.98861f,-0.013736f,0.044757f,1.030975f,-0.013673f,0.021869f,1.025601f,0.393327f,0.021594f, -0.922482f,-0.013776f,0.065028f,0.98861f,-0.013736f,0.044757f,0.983719f,0.390919f,0.044197f,0.918372f,0.389343f,0.064218f, -1.025601f,-0.419734f,0.021594f,1.047675f,-0.421723f,0.0f,1.053293f,-0.013618f,0.0f,1.030975f,-0.013673f,0.021869f, -1.030975f,-0.013673f,0.021869f,1.053293f,-0.013618f,0.0f,1.047675f,0.39547f,0.0f,1.025601f,0.393327f,0.021594f, --0.909674f,-0.922159f,0.0f,-0.894756f,-0.90822f,0.018385f,-0.944409f,-0.848408f,0.018815f,-0.962289f,-0.859068f,0.0f, --0.944409f,-0.848408f,0.018815f,-0.894756f,-0.90822f,0.018385f,-0.871108f,-0.886124f,0.036675f,-0.913159f,-0.833367f,0.037876f, --0.981692f,-0.764498f,0.019733f,-0.944409f,-0.848408f,0.018815f,-0.913159f,-0.833367f,0.037876f,-0.944233f,-0.755482f,0.040237f, --0.962289f,-0.859068f,0.0f,-0.944409f,-0.848408f,0.018815f,-0.981692f,-0.764498f,0.019733f,-1.001834f,-0.771839f,0.0f, --0.871108f,-0.886124f,0.036675f,-0.844501f,-0.861263f,0.050154f,-0.864233f,-0.822169f,0.054004f,-0.913159f,-0.833367f,0.037876f, --0.913159f,-0.833367f,0.037876f,-0.864233f,-0.822169f,0.054004f,-0.885862f,-0.749245f,0.058224f,-0.944233f,-0.755482f,0.040237f, --0.981692f,-0.764498f,0.019733f,-0.944233f,-0.755482f,0.040237f,-0.967761f,-0.640802f,0.042517f,-1.008591f,-0.645808f,0.020771f, --0.944233f,-0.755482f,0.040237f,-0.885862f,-0.749245f,0.058224f,-0.90414f,-0.637528f,0.061789f,-0.967761f,-0.640802f,0.042517f, --0.967761f,-0.640802f,0.042517f,-0.90414f,-0.637528f,0.061789f,-0.916591f,-0.416033f,0.064218f,-0.982578f,-0.417497f,0.044197f, --0.967761f,-0.640802f,0.042517f,-0.982578f,-0.417497f,0.044197f,-1.024871f,-0.419734f,0.021594f,-1.008591f,-0.645808f,0.020771f, --1.001834f,-0.771839f,0.0f,-0.981692f,-0.764498f,0.019733f,-1.008591f,-0.645808f,0.020771f,-1.030143f,-0.650261f,0.0f, --1.030143f,-0.650261f,0.0f,-1.008591f,-0.645808f,0.020771f,-1.024871f,-0.419734f,0.021594f,-1.047163f,-0.421723f,0.0f, --1.047163f,0.39547f,0.0f,-1.052836f,-0.013618f,0.0f,-1.030298f,-0.013673f,0.021869f,-1.024871f,0.393327f,0.021594f, --1.052836f,-0.013618f,0.0f,-1.047163f,-0.421723f,0.0f,-1.024871f,-0.419734f,0.021594f,-1.030298f,-0.013673f,0.021869f, --1.030298f,-0.013673f,0.021869f,-1.024871f,-0.419734f,0.021594f,-0.982578f,-0.417497f,0.044197f,-0.987517f,-0.013736f,0.044757f, --1.024871f,0.393327f,0.021594f,-1.030298f,-0.013673f,0.021869f,-0.987517f,-0.013736f,0.044757f,-0.982578f,0.390919f,0.044197f, --0.982578f,-0.417497f,0.044197f,-0.916591f,-0.416033f,0.064218f,-0.920742f,-0.013776f,0.065028f,-0.987517f,-0.013736f,0.044757f, --0.987517f,-0.013736f,0.044757f,-0.920742f,-0.013776f,0.065028f,-0.916591f,0.389343f,0.064218f,-0.982578f,0.390919f,0.044197f, -0.396693f,0.917941f,0.064218f,0.616423f,0.905582f,0.061789f,0.619893f,0.968735f,0.042517f,0.398253f,0.983443f,0.044197f, -0.616423f,0.905582f,0.061789f,0.729904f,0.887439f,0.058224f,0.736514f,0.94538f,0.040237f,0.619893f,0.968735f,0.042517f, -0.619893f,0.968735f,0.042517f,0.736514f,0.94538f,0.040237f,0.746069f,0.982563f,0.019733f,0.625198f,1.009264f,0.020771f, -0.400637f,1.025424f,0.021594f,0.398253f,0.983443f,0.044197f,0.619893f,0.968735f,0.042517f,0.625198f,1.009264f,0.020771f, -0.729904f,0.887439f,0.058224f,0.805551f,0.865969f,0.054004f,0.817418f,0.914535f,0.037876f,0.736514f,0.94538f,0.040237f, -0.805551f,0.865969f,0.054004f,0.846982f,0.846382f,0.050154f,0.87333f,0.872793f,0.036675f,0.817418f,0.914535f,0.037876f, -0.817418f,0.914535f,0.037876f,0.87333f,0.872793f,0.036675f,0.896749f,0.896267f,0.018385f,0.833359f,0.945555f,0.018815f, -0.736514f,0.94538f,0.040237f,0.817418f,0.914535f,0.037876f,0.833359f,0.945555f,0.018815f,0.746069f,0.982563f,0.019733f, -0.833359f,0.945555f,0.018815f,0.896749f,0.896267f,0.018385f,0.911522f,0.911075f,0.0f,0.844656f,0.963302f,0.0f, -0.746069f,0.982563f,0.019733f,0.833359f,0.945555f,0.018815f,0.844656f,0.963302f,0.0f,0.753849f,1.002556f,0.0f, -0.625198f,1.009264f,0.020771f,0.746069f,0.982563f,0.019733f,0.753849f,1.002556f,0.0f,0.629917f,1.030658f,0.0f, -0.400637f,1.025424f,0.021594f,0.625198f,1.009264f,0.020771f,0.629917f,1.030658f,0.0f,0.402758f,1.047552f,0.0f, -0.396693f,-0.928623f,0.064218f,0.398253f,-0.990281f,0.044197f,0.619893f,-0.976437f,0.042517f,0.616423f,-0.916988f,0.061789f, -0.619893f,-0.976437f,0.042517f,0.398253f,-0.990281f,0.044197f,0.400637f,-1.0298f,0.021594f,0.625198f,-1.014588f,0.020771f, -0.736514f,-0.954452f,0.040237f,0.619893f,-0.976437f,0.042517f,0.625198f,-1.014588f,0.020771f,0.746069f,-0.989453f,0.019733f, -0.616423f,-0.916988f,0.061789f,0.619893f,-0.976437f,0.042517f,0.736514f,-0.954452f,0.040237f,0.729904f,-0.89991f,0.058224f, -0.400637f,-1.0298f,0.021594f,0.402758f,-1.050629f,0.0f,0.629917f,-1.034726f,0.0f,0.625198f,-1.014588f,0.020771f, -0.625198f,-1.014588f,0.020771f,0.629917f,-1.034726f,0.0f,0.753849f,-1.008273f,0.0f,0.746069f,-0.989453f,0.019733f, -0.736514f,-0.954452f,0.040237f,0.746069f,-0.989453f,0.019733f,0.833359f,-0.954616f,0.018815f,0.817418f,-0.925416f,0.037876f, -0.746069f,-0.989453f,0.019733f,0.753849f,-1.008273f,0.0f,0.844656f,-0.971323f,0.0f,0.833359f,-0.954616f,0.018815f, -0.833359f,-0.954616f,0.018815f,0.844656f,-0.971323f,0.0f,0.911522f,-0.922159f,0.0f,0.896749f,-0.90822f,0.018385f, -0.833359f,-0.954616f,0.018815f,0.896749f,-0.90822f,0.018385f,0.87333f,-0.886124f,0.036675f,0.817418f,-0.925416f,0.037876f, -0.729904f,-0.89991f,0.058224f,0.736514f,-0.954452f,0.040237f,0.817418f,-0.925416f,0.037876f,0.805551f,-0.8797f,0.054004f, -0.805551f,-0.8797f,0.054004f,0.817418f,-0.925416f,0.037876f,0.87333f,-0.886124f,0.036675f,0.846982f,-0.861263f,0.050154f, -0.403842f,-0.422739f,0.09157f,0.401892f,-0.652534f,0.088189f,0.62799f,-0.648441f,0.084918f,0.632327f,-0.420911f,0.088189f, -0.401892f,-0.652534f,0.088189f,0.399509f,-0.775509f,0.082561f,0.622688f,-0.768902f,0.079479f,0.62799f,-0.648441f,0.084918f, -0.62799f,-0.648441f,0.084918f,0.622688f,-0.768902f,0.079479f,0.741819f,-0.760488f,0.074426f,0.750737f,-0.64344f,0.079479f, -0.632327f,-0.420911f,0.088189f,0.62799f,-0.648441f,0.084918f,0.750737f,-0.64344f,0.079479f,0.757739f,-0.418675f,0.082561f, -0.399509f,-0.775509f,0.082561f,0.397559f,-0.8642f,0.074693f,0.618351f,-0.854962f,0.071886f,0.622688f,-0.768902f,0.079479f, -0.397559f,-0.8642f,0.074693f,0.396693f,-0.928623f,0.064218f,0.616423f,-0.916988f,0.061789f,0.618351f,-0.854962f,0.071886f, -0.618351f,-0.854962f,0.071886f,0.616423f,-0.916988f,0.061789f,0.729904f,-0.89991f,0.058224f,0.733736f,-0.842312f,0.067487f, -0.622688f,-0.768902f,0.079479f,0.618351f,-0.854962f,0.071886f,0.733736f,-0.842312f,0.067487f,0.741819f,-0.760488f,0.074426f, -0.741819f,-0.760488f,0.074426f,0.733736f,-0.842312f,0.067487f,0.812784f,-0.828995f,0.061777f,0.826898f,-0.752861f,0.067487f, -0.733736f,-0.842312f,0.067487f,0.729904f,-0.89991f,0.058224f,0.805551f,-0.8797f,0.054004f,0.812784f,-0.828995f,0.061777f, -0.812784f,-0.828995f,0.061777f,0.805551f,-0.8797f,0.054004f,0.846982f,-0.861263f,0.050154f,0.866523f,-0.822169f,0.054004f, -0.826898f,-0.752861f,0.067487f,0.812784f,-0.828995f,0.061777f,0.866523f,-0.822169f,0.054004f,0.887941f,-0.749245f,0.058224f, -0.757739f,-0.418675f,0.082561f,0.750737f,-0.64344f,0.079479f,0.840305f,-0.639347f,0.071886f,0.850096f,-0.416846f,0.074693f, -0.750737f,-0.64344f,0.079479f,0.741819f,-0.760488f,0.074426f,0.826898f,-0.752861f,0.067487f,0.840305f,-0.639347f,0.071886f, -0.840305f,-0.639347f,0.071886f,0.826898f,-0.752861f,0.067487f,0.887941f,-0.749245f,0.058224f,0.906041f,-0.637528f,0.061789f, -0.850096f,-0.416846f,0.074693f,0.840305f,-0.639347f,0.071886f,0.906041f,-0.637528f,0.061789f,0.918372f,-0.416033f,0.064218f, -0.403842f,0.396564f,0.09157f,0.404492f,-0.013589f,0.092698f,0.633773f,-0.01364f,0.08928f,0.632327f,0.394595f,0.088189f, -0.404492f,-0.013589f,0.092698f,0.403842f,-0.422739f,0.09157f,0.632327f,-0.420911f,0.088189f,0.633773f,-0.01364f,0.08928f, -0.633773f,-0.01364f,0.08928f,0.632327f,-0.420911f,0.088189f,0.757739f,-0.418675f,0.082561f,0.760073f,-0.013703f,0.083588f, -0.632327f,0.394595f,0.088189f,0.633773f,-0.01364f,0.08928f,0.760073f,-0.013703f,0.083588f,0.757739f,0.392188f,0.082561f, -0.757739f,-0.418675f,0.082561f,0.850096f,-0.416846f,0.074693f,0.853359f,-0.013754f,0.075629f,0.760073f,-0.013703f,0.083588f, -0.850096f,-0.416846f,0.074693f,0.918372f,-0.416033f,0.064218f,0.922482f,-0.013776f,0.065028f,0.853359f,-0.013754f,0.075629f, -0.853359f,-0.013754f,0.075629f,0.922482f,-0.013776f,0.065028f,0.918372f,0.389343f,0.064218f,0.850096f,0.390218f,0.074693f, -0.760073f,-0.013703f,0.083588f,0.853359f,-0.013754f,0.075629f,0.850096f,0.390218f,0.074693f,0.757739f,0.392188f,0.082561f, --1.047163f,0.39547f,0.0f,-1.024871f,0.393327f,0.021594f,-1.008591f,0.622221f,0.020771f,-1.030143f,0.626951f,0.0f, --1.008591f,0.622221f,0.020771f,-1.024871f,0.393327f,0.021594f,-0.982578f,0.390919f,0.044197f,-0.967761f,0.616903f,0.042517f, --0.981692f,0.744767f,0.019733f,-1.008591f,0.622221f,0.020771f,-0.967761f,0.616903f,0.042517f,-0.944233f,0.735189f,0.040237f, --1.030143f,0.626951f,0.0f,-1.008591f,0.622221f,0.020771f,-0.981692f,0.744767f,0.019733f,-1.001834f,0.752565f,0.0f, --0.982578f,0.390919f,0.044197f,-0.916591f,0.389343f,0.064218f,-0.90414f,0.613425f,0.061789f,-0.967761f,0.616903f,0.042517f, --0.967761f,0.616903f,0.042517f,-0.90414f,0.613425f,0.061789f,-0.885862f,0.728563f,0.058224f,-0.944233f,0.735189f,0.040237f, --0.981692f,0.744767f,0.019733f,-0.944233f,0.735189f,0.040237f,-0.913159f,0.816749f,0.037876f,-0.944409f,0.832727f,0.018815f, --0.944233f,0.735189f,0.040237f,-0.885862f,0.728563f,0.058224f,-0.864233f,0.804853f,0.054004f,-0.913159f,0.816749f,0.037876f, --0.913159f,0.816749f,0.037876f,-0.864233f,0.804853f,0.054004f,-0.844501f,0.846382f,0.050154f,-0.871108f,0.872793f,0.036675f, --0.913159f,0.816749f,0.037876f,-0.871108f,0.872793f,0.036675f,-0.894756f,0.896267f,0.018385f,-0.944409f,0.832727f,0.018815f, --1.001834f,0.752565f,0.0f,-0.981692f,0.744767f,0.019733f,-0.944409f,0.832727f,0.018815f,-0.962289f,0.844051f,0.0f, --0.962289f,0.844051f,0.0f,-0.944409f,0.832727f,0.018815f,-0.894756f,0.896267f,0.018385f,-0.909674f,0.911075f,0.0f, -0.918372f,0.389343f,0.064218f,0.983719f,0.390919f,0.044197f,0.969045f,0.616903f,0.042517f,0.906041f,0.613425f,0.061789f, -0.969045f,0.616903f,0.042517f,0.983719f,0.390919f,0.044197f,1.025601f,0.393327f,0.021594f,1.009478f,0.622221f,0.020771f, -0.945745f,0.735189f,0.040237f,0.969045f,0.616903f,0.042517f,1.009478f,0.622221f,0.020771f,0.982841f,0.744767f,0.019733f, -0.906041f,0.613425f,0.061789f,0.969045f,0.616903f,0.042517f,0.945745f,0.735189f,0.040237f,0.887941f,0.728563f,0.058224f, -1.025601f,0.393327f,0.021594f,1.047675f,0.39547f,0.0f,1.030822f,0.626951f,0.0f,1.009478f,0.622221f,0.020771f, -1.009478f,0.622221f,0.020771f,1.030822f,0.626951f,0.0f,1.002787f,0.752565f,0.0f,0.982841f,0.744767f,0.019733f, -0.945745f,0.735189f,0.040237f,0.982841f,0.744767f,0.019733f,0.94592f,0.832727f,0.018815f,0.914973f,0.816749f,0.037876f, -0.982841f,0.744767f,0.019733f,1.002787f,0.752565f,0.0f,0.963626f,0.844051f,0.0f,0.94592f,0.832727f,0.018815f, -0.94592f,0.832727f,0.018815f,0.963626f,0.844051f,0.0f,0.911522f,0.911075f,0.0f,0.896749f,0.896267f,0.018385f, -0.94592f,0.832727f,0.018815f,0.896749f,0.896267f,0.018385f,0.87333f,0.872793f,0.036675f,0.914973f,0.816749f,0.037876f, -0.887941f,0.728563f,0.058224f,0.945745f,0.735189f,0.040237f,0.914973f,0.816749f,0.037876f,0.866523f,0.804853f,0.054004f, -0.866523f,0.804853f,0.054004f,0.914973f,0.816749f,0.037876f,0.87333f,0.872793f,0.036675f,0.846982f,0.846382f,0.050154f, -0.396693f,0.917941f,0.064218f,0.397559f,0.849503f,0.074693f,0.618351f,0.83969f,0.071886f,0.616423f,0.905582f,0.061789f, -0.397559f,0.849503f,0.074693f,0.399509f,0.756465f,0.082561f,0.622688f,0.749446f,0.079479f,0.618351f,0.83969f,0.071886f, -0.618351f,0.83969f,0.071886f,0.622688f,0.749446f,0.079479f,0.741819f,0.740507f,0.074426f,0.733736f,0.826251f,0.067487f, -0.616423f,0.905582f,0.061789f,0.618351f,0.83969f,0.071886f,0.733736f,0.826251f,0.067487f,0.729904f,0.887439f,0.058224f, -0.399509f,0.756465f,0.082561f,0.401892f,0.629367f,0.088189f,0.62799f,0.625019f,0.084918f,0.622688f,0.749446f,0.079479f, -0.401892f,0.629367f,0.088189f,0.403842f,0.396564f,0.09157f,0.632327f,0.394595f,0.088189f,0.62799f,0.625019f,0.084918f, -0.62799f,0.625019f,0.084918f,0.632327f,0.394595f,0.088189f,0.757739f,0.392188f,0.082561f,0.750737f,0.619705f,0.079479f, -0.622688f,0.749446f,0.079479f,0.62799f,0.625019f,0.084918f,0.750737f,0.619705f,0.079479f,0.741819f,0.740507f,0.074426f, -0.741819f,0.740507f,0.074426f,0.750737f,0.619705f,0.079479f,0.840305f,0.615357f,0.071886f,0.826898f,0.732405f,0.067487f, -0.750737f,0.619705f,0.079479f,0.757739f,0.392188f,0.082561f,0.850096f,0.390218f,0.074693f,0.840305f,0.615357f,0.071886f, -0.840305f,0.615357f,0.071886f,0.850096f,0.390218f,0.074693f,0.918372f,0.389343f,0.064218f,0.906041f,0.613425f,0.061789f, -0.826898f,0.732405f,0.067487f,0.840305f,0.615357f,0.071886f,0.906041f,0.613425f,0.061789f,0.887941f,0.728563f,0.058224f, -0.729904f,0.887439f,0.058224f,0.733736f,0.826251f,0.067487f,0.812784f,0.812104f,0.061777f,0.805551f,0.865969f,0.054004f, -0.733736f,0.826251f,0.067487f,0.741819f,0.740507f,0.074426f,0.826898f,0.732405f,0.067487f,0.812784f,0.812104f,0.061777f, -0.812784f,0.812104f,0.061777f,0.826898f,0.732405f,0.067487f,0.887941f,0.728563f,0.058224f,0.866523f,0.804853f,0.054004f, -0.805551f,0.865969f,0.054004f,0.812784f,0.812104f,0.061777f,0.866523f,0.804853f,0.054004f,0.846982f,0.846382f,0.050154f, -0.399509f,0.756465f,0.082561f,0.397559f,0.849503f,0.074693f,0.002293f,0.852774f,0.075629f,0.002284f,0.758804f,0.083588f, -0.397559f,0.849503f,0.074693f,0.396693f,0.917941f,0.064218f,0.002297f,0.922061f,0.065028f,0.002293f,0.852774f,0.075629f, -0.002293f,0.852774f,0.075629f,0.002297f,0.922061f,0.065028f,-0.392243f,0.917941f,0.064218f,-0.39312f,0.849503f,0.074693f, -0.002284f,0.758804f,0.083588f,0.002293f,0.852774f,0.075629f,-0.39312f,0.849503f,0.074693f,-0.395094f,0.756465f,0.082561f, -0.399509f,0.756465f,0.082561f,0.002284f,0.758804f,0.083588f,0.002274f,0.630816f,0.089279f,0.401892f,0.629367f,0.088189f, -0.002284f,0.758804f,0.083588f,-0.395094f,0.756465f,0.082561f,-0.397505f,0.629367f,0.088189f,0.002274f,0.630816f,0.089279f, -0.002274f,0.630816f,0.089279f,-0.397505f,0.629367f,0.088189f,-0.399478f,0.396564f,0.09157f,0.002265f,0.397221f,0.092698f, -0.401892f,0.629367f,0.088189f,0.002274f,0.630816f,0.089279f,0.002265f,0.397221f,0.092698f,0.403842f,0.396564f,0.09157f, --0.916591f,0.389343f,0.064218f,-0.847646f,0.390218f,0.074693f,-0.837759f,0.615357f,0.071886f,-0.90414f,0.613425f,0.061789f, --0.847646f,0.390218f,0.074693f,-0.754564f,0.392188f,0.082561f,-0.747494f,0.619705f,0.079479f,-0.837759f,0.615357f,0.071886f, --0.837759f,0.615357f,0.071886f,-0.747494f,0.619705f,0.079479f,-0.738488f,0.740507f,0.074426f,-0.824221f,0.732405f,0.067487f, --0.90414f,0.613425f,0.061789f,-0.837759f,0.615357f,0.071886f,-0.824221f,0.732405f,0.067487f,-0.885862f,0.728563f,0.058224f, --0.754564f,0.392188f,0.082561f,-0.628465f,0.394595f,0.088189f,-0.624085f,0.625019f,0.084918f,-0.747494f,0.619705f,0.079479f, --0.628465f,0.394595f,0.088189f,-0.399478f,0.396564f,0.09157f,-0.397505f,0.629367f,0.088189f,-0.624085f,0.625019f,0.084918f, --0.624085f,0.625019f,0.084918f,-0.397505f,0.629367f,0.088189f,-0.395094f,0.756465f,0.082561f,-0.618732f,0.749446f,0.079479f, --0.747494f,0.619705f,0.079479f,-0.624085f,0.625019f,0.084918f,-0.618732f,0.749446f,0.079479f,-0.738488f,0.740507f,0.074426f, --0.738488f,0.740507f,0.074426f,-0.618732f,0.749446f,0.079479f,-0.614352f,0.83969f,0.071886f,-0.730326f,0.826251f,0.067487f, --0.618732f,0.749446f,0.079479f,-0.395094f,0.756465f,0.082561f,-0.39312f,0.849503f,0.074693f,-0.614352f,0.83969f,0.071886f, --0.614352f,0.83969f,0.071886f,-0.39312f,0.849503f,0.074693f,-0.392243f,0.917941f,0.064218f,-0.612405f,0.905582f,0.061789f, --0.730326f,0.826251f,0.067487f,-0.614352f,0.83969f,0.071886f,-0.612405f,0.905582f,0.061789f,-0.726455f,0.887439f,0.058224f, --0.885862f,0.728563f,0.058224f,-0.824221f,0.732405f,0.067487f,-0.809968f,0.812104f,0.061777f,-0.864233f,0.804853f,0.054004f, --0.824221f,0.732405f,0.067487f,-0.738488f,0.740507f,0.074426f,-0.730326f,0.826251f,0.067487f,-0.809968f,0.812104f,0.061777f, --0.809968f,0.812104f,0.061777f,-0.730326f,0.826251f,0.067487f,-0.726455f,0.887439f,0.058224f,-0.802664f,0.865969f,0.054004f, --0.864233f,0.804853f,0.054004f,-0.809968f,0.812104f,0.061777f,-0.802664f,0.865969f,0.054004f,-0.844501f,0.846382f,0.050154f, -}; - -static const float cfGameIconTexCoords[] = { -0.098918f,0.907702f,0.118783f,0.916444f,0.115314f,0.892403f,0.089549f,0.889167f, -0.118783f,0.916444f,0.154967f,0.926026f,0.153129f,0.898717f,0.115314f,0.892403f, -0.115314f,0.892403f,0.153129f,0.898717f,0.149254f,0.859921f,0.108547f,0.856305f, -0.089549f,0.889167f,0.115314f,0.892403f,0.108547f,0.856305f,0.07928f,0.854591f, -0.154967f,0.926026f,0.209119f,0.934124f,0.208194f,0.904715f,0.153129f,0.898717f, -0.209119f,0.934124f,0.313652f,0.93964f,0.313236f,0.909095f,0.208194f,0.904715f, -0.208194f,0.904715f,0.313236f,0.909095f,0.312299f,0.867044f,0.206115f,0.863911f, -0.153129f,0.898717f,0.208194f,0.904715f,0.206115f,0.863911f,0.149254f,0.859921f, -0.149254f,0.859921f,0.206115f,0.863911f,0.203573f,0.806797f,0.144978f,0.804425f, -0.206115f,0.863911f,0.312299f,0.867044f,0.311154f,0.808737f,0.203573f,0.806797f, -0.203573f,0.806797f,0.311154f,0.808737f,0.310217f,0.699784f,0.201493f,0.698917f, -0.144978f,0.804425f,0.203573f,0.806797f,0.201493f,0.698917f,0.141621f,0.697857f, -0.07928f,0.854591f,0.108547f,0.856305f,0.102119f,0.802484f,0.070602f,0.801622f, -0.108547f,0.856305f,0.149254f,0.859921f,0.144978f,0.804425f,0.102119f,0.802484f, -0.102119f,0.802484f,0.144978f,0.804425f,0.141621f,0.697857f,0.097425f,0.69699f, -0.070602f,0.801622f,0.102119f,0.802484f,0.097425f,0.69699f,0.064689f,0.696604f, -0.310217f,0.699784f,0.311154f,0.808737f,0.500971f,0.809384f,0.500967f,0.700073f, -0.311154f,0.808737f,0.312299f,0.867044f,0.500976f,0.868088f,0.500971f,0.809384f, -0.500971f,0.809384f,0.500976f,0.868088f,0.68958f,0.867044f,0.690711f,0.808737f, -0.500967f,0.700073f,0.500971f,0.809384f,0.690711f,0.808737f,0.691637f,0.699784f, -0.312299f,0.867044f,0.313236f,0.909095f,0.50098f,0.910555f,0.500976f,0.868088f, -0.313236f,0.909095f,0.313652f,0.93964f,0.500982f,0.941479f,0.50098f,0.910555f, -0.50098f,0.910555f,0.500982f,0.941479f,0.688243f,0.93964f,0.688654f,0.909095f, -0.500976f,0.868088f,0.50098f,0.910555f,0.688654f,0.909095f,0.68958f,0.867044f, -0.310217f,0.699784f,0.500967f,0.700073f,0.500965f,0.505784f,0.309905f,0.505792f, -0.500967f,0.700073f,0.691637f,0.699784f,0.691946f,0.505792f,0.500965f,0.505784f, -0.500965f,0.505784f,0.691946f,0.505792f,0.691637f,0.311325f,0.500967f,0.311013f, -0.309905f,0.505792f,0.500965f,0.505784f,0.500967f,0.311013f,0.310217f,0.311325f, -0.141621f,0.3134f,0.097425f,0.314333f,0.09586f,0.50587f,0.140502f,0.505846f, -0.097425f,0.314333f,0.064689f,0.314748f,0.062719f,0.505881f,0.09586f,0.50587f, -0.09586f,0.50587f,0.062719f,0.505881f,0.064689f,0.696604f,0.097425f,0.69699f, -0.140502f,0.505846f,0.09586f,0.50587f,0.097425f,0.69699f,0.141621f,0.697857f, -0.141621f,0.3134f,0.140502f,0.505846f,0.2008f,0.505816f,0.201493f,0.312259f, -0.140502f,0.505846f,0.141621f,0.697857f,0.201493f,0.698917f,0.2008f,0.505816f, -0.2008f,0.505816f,0.201493f,0.698917f,0.310217f,0.699784f,0.309905f,0.505792f, -0.201493f,0.312259f,0.2008f,0.505816f,0.309905f,0.505792f,0.310217f,0.311325f, -0.098918f,0.098051f,0.118783f,0.088764f,0.115314f,0.070013f,0.089549f,0.088764f, -0.118783f,0.088764f,0.154967f,0.078585f,0.153129f,0.056238f,0.115314f,0.070013f, -0.115314f,0.070013f,0.153129f,0.056238f,0.14647f,0.030613f,0.104205f,0.048635f, -0.089549f,0.088764f,0.115314f,0.070013f,0.104205f,0.048635f,0.073229f,0.072587f, -0.154967f,0.078585f,0.209119f,0.069983f,0.208194f,0.045626f,0.153129f,0.056238f, -0.209119f,0.069983f,0.313652f,0.064123f,0.313236f,0.038853f,0.208194f,0.045626f, -0.208194f,0.045626f,0.313236f,0.038853f,0.31157f,0.009921f,0.204497f,0.017695f, -0.153129f,0.056238f,0.208194f,0.045626f,0.204497f,0.017695f,0.14647f,0.030613f, -0.204497f,0.017695f,0.31157f,0.009921f,0.269666f,0.0f,0.202648f,0.01068f, -0.14647f,0.030613f,0.204497f,0.017695f,0.202648f,0.01068f,0.135631f,0.02136f, -0.104205f,0.048635f,0.14647f,0.030613f,0.135631f,0.02136f,0.100033f,0.042615f, -0.073229f,0.072587f,0.104205f,0.048635f,0.100033f,0.042615f,0.064435f,0.06387f, -0.269666f,0.0f,0.31157f,0.009921f,0.500973f,0.007329f,0.500969f,0.0f, -0.500973f,0.007329f,0.31157f,0.009921f,0.313236f,0.038853f,0.50098f,0.036595f, -0.6903f,0.009921f,0.500973f,0.007329f,0.50098f,0.036595f,0.688654f,0.038853f, -0.500969f,0.0f,0.500973f,0.007329f,0.6903f,0.009921f,0.732272f,0.0f, -0.313236f,0.038853f,0.313652f,0.064123f,0.500982f,0.062169f,0.50098f,0.036595f, -0.50098f,0.036595f,0.500982f,0.062169f,0.688243f,0.064123f,0.688654f,0.038853f, -0.688243f,0.93964f,0.500982f,0.941479f,0.50098f,0.965553f,0.688654f,0.963427f, -0.500982f,0.941479f,0.313652f,0.93964f,0.313236f,0.963427f,0.50098f,0.965553f, -0.50098f,0.965553f,0.313236f,0.963427f,0.31157f,0.990661f,0.500973f,0.993101f, -0.688654f,0.963427f,0.50098f,0.965553f,0.500973f,0.993101f,0.6903f,0.990661f, -0.31157f,0.990661f,0.269666f,1.0f,0.500969f,1.0f,0.500973f,0.993101f, -0.500973f,0.993101f,0.500969f,1.0f,0.732272f,1.0f,0.6903f,0.990661f, -0.064435f,0.939877f,0.100033f,0.959885f,0.104205f,0.954218f,0.073229f,0.931672f, -0.100033f,0.959885f,0.135631f,0.979893f,0.14647f,0.971183f,0.104205f,0.954218f, -0.104205f,0.954218f,0.14647f,0.971183f,0.153129f,0.947062f,0.115314f,0.934095f, -0.073229f,0.931672f,0.104205f,0.954218f,0.115314f,0.934095f,0.089549f,0.916444f, -0.135631f,0.979893f,0.202648f,0.989946f,0.204497f,0.983343f,0.14647f,0.971183f, -0.202648f,0.989946f,0.269666f,1.0f,0.31157f,0.990661f,0.204497f,0.983343f, -0.204497f,0.983343f,0.31157f,0.990661f,0.313236f,0.963427f,0.208194f,0.957052f, -0.14647f,0.971183f,0.204497f,0.983343f,0.208194f,0.957052f,0.153129f,0.947062f, -0.208194f,0.957052f,0.313236f,0.963427f,0.313652f,0.93964f,0.209119f,0.934124f, -0.153129f,0.947062f,0.208194f,0.957052f,0.209119f,0.934124f,0.154967f,0.926026f, -0.115314f,0.934095f,0.153129f,0.947062f,0.154967f,0.926026f,0.118783f,0.916444f, -0.089549f,0.916444f,0.115314f,0.934095f,0.118783f,0.916444f,0.098918f,0.907702f, -0.902043f,0.907702f,0.91132f,0.916444f,0.930054f,0.892403f,0.91132f,0.889167f, -0.930054f,0.892403f,0.91132f,0.916444f,0.927482f,0.931672f,0.951411f,0.902768f, -0.943816f,0.856305f,0.930054f,0.892403f,0.951411f,0.902768f,0.969416f,0.862518f, -0.91132f,0.889167f,0.930054f,0.892403f,0.943816f,0.856305f,0.92149f,0.854591f, -0.927482f,0.931672f,0.93619f,0.939877f,0.957425f,0.906662f,0.951411f,0.902768f, -0.951411f,0.902768f,0.957425f,0.906662f,0.97866f,0.873446f,0.969416f,0.862518f, -0.943816f,0.856305f,0.969416f,0.862518f,0.982322f,0.805934f,0.954418f,0.802484f, -0.969416f,0.862518f,0.97866f,0.873446f,0.98933f,0.807659f,0.982322f,0.805934f, -0.982322f,0.805934f,0.98933f,0.807659f,1.0f,0.741872f,0.990089f,0.698531f, -0.982322f,0.805934f,0.990089f,0.698531f,0.961185f,0.69699f,0.954418f,0.802484f, -0.92149f,0.854591f,0.943816f,0.856305f,0.954418f,0.802484f,0.930084f,0.801622f, -0.930084f,0.801622f,0.954418f,0.802484f,0.961185f,0.69699f,0.935938f,0.696604f, -0.935938f,0.696604f,0.961185f,0.69699f,0.96344f,0.50587f,0.93789f,0.505881f, -0.96344f,0.50587f,0.961185f,0.69699f,0.990089f,0.698531f,0.992677f,0.505827f, -0.961185f,0.314333f,0.96344f,0.50587f,0.992677f,0.505827f,0.990089f,0.312674f, -0.93789f,0.505881f,0.96344f,0.50587f,0.961185f,0.314333f,0.935938f,0.314748f, -0.990089f,0.698531f,1.0f,0.741872f,1.0f,0.505805f,0.992677f,0.505827f, -0.992677f,0.505827f,1.0f,0.505805f,1.0f,0.269739f,0.990089f,0.312674f, -0.064435f,0.939877f,0.073229f,0.931672f,0.049066f,0.902768f,0.042992f,0.906662f, -0.049066f,0.902768f,0.073229f,0.931672f,0.089549f,0.916444f,0.070633f,0.892403f, -0.030884f,0.862518f,0.049066f,0.902768f,0.070633f,0.892403f,0.056735f,0.856305f, -0.042992f,0.906662f,0.049066f,0.902768f,0.030884f,0.862518f,0.021549f,0.873446f, -0.089549f,0.916444f,0.098918f,0.907702f,0.089549f,0.889167f,0.070633f,0.892403f, -0.070633f,0.892403f,0.089549f,0.889167f,0.07928f,0.854591f,0.056735f,0.856305f, -0.030884f,0.862518f,0.056735f,0.856305f,0.046029f,0.802484f,0.017852f,0.805934f, -0.056735f,0.856305f,0.07928f,0.854591f,0.070602f,0.801622f,0.046029f,0.802484f, -0.046029f,0.802484f,0.070602f,0.801622f,0.064689f,0.696604f,0.039196f,0.69699f, -0.046029f,0.802484f,0.039196f,0.69699f,0.010008f,0.698531f,0.017852f,0.805934f, -0.021549f,0.873446f,0.030884f,0.862518f,0.017852f,0.805934f,0.010774f,0.807659f, -0.010774f,0.807659f,0.017852f,0.805934f,0.010008f,0.698531f,0.0f,0.741872f, -0.0f,0.269739f,0.0f,0.505805f,0.007394f,0.505827f,0.010008f,0.312673f, -0.0f,0.505805f,0.0f,0.741872f,0.010008f,0.698531f,0.007394f,0.505827f, -0.007394f,0.505827f,0.010008f,0.698531f,0.039196f,0.69699f,0.036918f,0.50587f, -0.010008f,0.312673f,0.007394f,0.505827f,0.036918f,0.50587f,0.039196f,0.314333f, -0.039196f,0.69699f,0.064689f,0.696604f,0.062719f,0.505881f,0.036918f,0.50587f, -0.036918f,0.50587f,0.062719f,0.505881f,0.064689f,0.314748f,0.039196f,0.314333f, -0.688243f,0.064123f,0.792572f,0.069983f,0.793487f,0.045626f,0.688654f,0.038853f, -0.792572f,0.069983f,0.846453f,0.078585f,0.848273f,0.056238f,0.793487f,0.045626f, -0.793487f,0.045626f,0.848273f,0.056238f,0.854867f,0.030613f,0.797148f,0.017695f, -0.6903f,0.009921f,0.688654f,0.038853f,0.793487f,0.045626f,0.797148f,0.017695f, -0.846453f,0.078585f,0.882371f,0.088764f,0.885805f,0.070013f,0.848273f,0.056238f, -0.882371f,0.088764f,0.902043f,0.098051f,0.91132f,0.088764f,0.885805f,0.070013f, -0.885805f,0.070013f,0.91132f,0.088764f,0.927482f,0.072587f,0.896806f,0.048635f, -0.848273f,0.056238f,0.885805f,0.070013f,0.896806f,0.048635f,0.854867f,0.030613f, -0.896806f,0.048635f,0.927482f,0.072587f,0.93619f,0.06387f,0.900938f,0.042615f, -0.854867f,0.030613f,0.896806f,0.048635f,0.900938f,0.042615f,0.865686f,0.02136f, -0.797148f,0.017695f,0.854867f,0.030613f,0.865686f,0.02136f,0.798979f,0.01068f, -0.6903f,0.009921f,0.797148f,0.017695f,0.798979f,0.01068f,0.732272f,0.0f, -0.688243f,0.93964f,0.688654f,0.963427f,0.793487f,0.957052f,0.792572f,0.934124f, -0.793487f,0.957052f,0.688654f,0.963427f,0.6903f,0.990661f,0.797148f,0.983343f, -0.848273f,0.947062f,0.793487f,0.957052f,0.797148f,0.983343f,0.854867f,0.971183f, -0.792572f,0.934124f,0.793487f,0.957052f,0.848273f,0.947062f,0.846453f,0.926026f, -0.6903f,0.990661f,0.732272f,1.0f,0.798979f,0.989946f,0.797148f,0.983343f, -0.797148f,0.983343f,0.798979f,0.989946f,0.865686f,0.979893f,0.854867f,0.971183f, -0.848273f,0.947062f,0.854867f,0.971183f,0.896806f,0.954218f,0.885805f,0.934095f, -0.854867f,0.971183f,0.865686f,0.979893f,0.900938f,0.959885f,0.896806f,0.954218f, -0.896806f,0.954218f,0.900938f,0.959885f,0.93619f,0.939877f,0.927482f,0.931672f, -0.896806f,0.954218f,0.927482f,0.931672f,0.91132f,0.916444f,0.885805f,0.934095f, -0.846453f,0.926026f,0.848273f,0.947062f,0.885805f,0.934095f,0.882371f,0.916444f, -0.882371f,0.916444f,0.885805f,0.934095f,0.91132f,0.916444f,0.902043f,0.907702f, -0.691637f,0.699784f,0.690711f,0.808737f,0.798063f,0.806796f,0.800123f,0.698917f, -0.690711f,0.808737f,0.68958f,0.867044f,0.795546f,0.863911f,0.798063f,0.806796f, -0.798063f,0.806796f,0.795546f,0.863911f,0.85211f,0.859921f,0.856345f,0.804425f, -0.800123f,0.698917f,0.798063f,0.806796f,0.856345f,0.804425f,0.859669f,0.697857f, -0.68958f,0.867044f,0.688654f,0.909095f,0.793487f,0.904715f,0.795546f,0.863911f, -0.688654f,0.909095f,0.688243f,0.93964f,0.792572f,0.934124f,0.793487f,0.904715f, -0.793487f,0.904715f,0.792572f,0.934124f,0.846453f,0.926026f,0.848273f,0.898717f, -0.795546f,0.863911f,0.793487f,0.904715f,0.848273f,0.898717f,0.85211f,0.859921f, -0.85211f,0.859921f,0.848273f,0.898717f,0.885805f,0.892403f,0.892507f,0.856305f, -0.848273f,0.898717f,0.846453f,0.926026f,0.882371f,0.916444f,0.885805f,0.892403f, -0.885805f,0.892403f,0.882371f,0.916444f,0.902043f,0.907702f,0.91132f,0.889167f, -0.892507f,0.856305f,0.885805f,0.892403f,0.91132f,0.889167f,0.92149f,0.854591f, -0.859669f,0.697857f,0.856345f,0.804425f,0.898872f,0.802484f,0.903521f,0.69699f, -0.856345f,0.804425f,0.85211f,0.859921f,0.892507f,0.856305f,0.898872f,0.802484f, -0.898872f,0.802484f,0.892507f,0.856305f,0.92149f,0.854591f,0.930084f,0.801622f, -0.903521f,0.69699f,0.898872f,0.802484f,0.930084f,0.801622f,0.935938f,0.696604f, -0.691637f,0.311325f,0.691946f,0.505792f,0.800809f,0.505816f,0.800123f,0.312259f, -0.691946f,0.505792f,0.691637f,0.699784f,0.800123f,0.698917f,0.800809f,0.505816f, -0.800809f,0.505816f,0.800123f,0.698917f,0.859669f,0.697857f,0.860777f,0.505846f, -0.800123f,0.312259f,0.800809f,0.505816f,0.860777f,0.505846f,0.859669f,0.3134f, -0.859669f,0.697857f,0.903521f,0.69699f,0.90507f,0.50587f,0.860777f,0.505846f, -0.903521f,0.69699f,0.935938f,0.696604f,0.93789f,0.505881f,0.90507f,0.50587f, -0.90507f,0.50587f,0.93789f,0.505881f,0.935938f,0.314748f,0.903521f,0.314333f, -0.860777f,0.505846f,0.90507f,0.50587f,0.903521f,0.314333f,0.859669f,0.3134f, -0.0f,0.269739f,0.010008f,0.312673f,0.017852f,0.203923f,0.010774f,0.202091f, -0.017852f,0.203923f,0.010008f,0.312673f,0.039196f,0.314333f,0.046029f,0.207588f, -0.030884f,0.14549f,0.017852f,0.203923f,0.046029f,0.207588f,0.056735f,0.152091f, -0.010774f,0.202091f,0.017852f,0.203923f,0.030884f,0.14549f,0.021549f,0.134442f, -0.039196f,0.314333f,0.064689f,0.314748f,0.070602f,0.208504f,0.046029f,0.207588f, -0.046029f,0.207588f,0.070602f,0.208504f,0.07928f,0.153913f,0.056735f,0.152091f, -0.030884f,0.14549f,0.056735f,0.152091f,0.070632f,0.114303f,0.049066f,0.103292f, -0.056735f,0.152091f,0.07928f,0.153913f,0.089549f,0.117742f,0.070632f,0.114303f, -0.070632f,0.114303f,0.089549f,0.117742f,0.098918f,0.098051f,0.089549f,0.088764f, -0.070632f,0.114303f,0.089549f,0.088764f,0.073229f,0.072587f,0.049066f,0.103292f, -0.021549f,0.134442f,0.030884f,0.14549f,0.049066f,0.103292f,0.042992f,0.099156f, -0.042992f,0.099156f,0.049066f,0.103292f,0.073229f,0.072587f,0.064435f,0.06387f, -0.935938f,0.314748f,0.961185f,0.314333f,0.954418f,0.207588f,0.930084f,0.208504f, -0.954418f,0.207588f,0.961185f,0.314333f,0.990089f,0.312674f,0.982322f,0.203923f, -0.943816f,0.152092f,0.954418f,0.207588f,0.982322f,0.203923f,0.969416f,0.145491f, -0.930084f,0.208504f,0.954418f,0.207588f,0.943816f,0.152092f,0.92149f,0.153913f, -0.990089f,0.312674f,1.0f,0.269739f,0.98933f,0.202091f,0.982322f,0.203923f, -0.982322f,0.203923f,0.98933f,0.202091f,0.97866f,0.134442f,0.969416f,0.145491f, -0.943816f,0.152092f,0.969416f,0.145491f,0.951411f,0.103292f,0.930054f,0.114304f, -0.969416f,0.145491f,0.97866f,0.134442f,0.957425f,0.099156f,0.951411f,0.103292f, -0.951411f,0.103292f,0.957425f,0.099156f,0.93619f,0.06387f,0.927482f,0.072587f, -0.951411f,0.103292f,0.927482f,0.072587f,0.91132f,0.088764f,0.930054f,0.114304f, -0.92149f,0.153913f,0.943816f,0.152092f,0.930054f,0.114304f,0.91132f,0.117742f, -0.91132f,0.117742f,0.930054f,0.114304f,0.91132f,0.088764f,0.902043f,0.098051f, -0.688243f,0.064123f,0.688654f,0.096571f,0.793487f,0.101224f,0.792572f,0.069983f, -0.688654f,0.096571f,0.68958f,0.140684f,0.795546f,0.144012f,0.793487f,0.101224f, -0.793487f,0.101224f,0.795546f,0.144012f,0.85211f,0.14825f,0.848273f,0.107596f, -0.792572f,0.069983f,0.793487f,0.101224f,0.848273f,0.107596f,0.846453f,0.078585f, -0.68958f,0.140684f,0.690711f,0.200945f,0.798063f,0.203007f,0.795546f,0.144012f, -0.690711f,0.200945f,0.691637f,0.311325f,0.800123f,0.312259f,0.798063f,0.203007f, -0.798063f,0.203007f,0.800123f,0.312259f,0.859669f,0.3134f,0.856345f,0.205526f, -0.795546f,0.144012f,0.798063f,0.203007f,0.856345f,0.205526f,0.85211f,0.14825f, -0.85211f,0.14825f,0.856345f,0.205526f,0.898872f,0.207588f,0.892507f,0.152092f, -0.856345f,0.205526f,0.859669f,0.3134f,0.903521f,0.314333f,0.898872f,0.207588f, -0.898872f,0.207588f,0.903521f,0.314333f,0.935938f,0.314748f,0.930084f,0.208504f, -0.892507f,0.152092f,0.898872f,0.207588f,0.930084f,0.208504f,0.92149f,0.153913f, -0.846453f,0.078585f,0.848273f,0.107596f,0.885805f,0.114304f,0.882371f,0.088764f, -0.848273f,0.107596f,0.85211f,0.14825f,0.892507f,0.152092f,0.885805f,0.114304f, -0.885805f,0.114304f,0.892507f,0.152092f,0.92149f,0.153913f,0.91132f,0.117742f, -0.882371f,0.088764f,0.885805f,0.114304f,0.91132f,0.117742f,0.902043f,0.098051f, -0.68958f,0.140684f,0.688654f,0.096571f,0.50098f,0.095021f,0.500976f,0.139575f, -0.688654f,0.096571f,0.688243f,0.064123f,0.500982f,0.062169f,0.50098f,0.095021f, -0.50098f,0.095021f,0.500982f,0.062169f,0.313652f,0.064123f,0.313236f,0.096571f, -0.500976f,0.139575f,0.50098f,0.095021f,0.313236f,0.096571f,0.312299f,0.140684f, -0.68958f,0.140684f,0.500976f,0.139575f,0.500971f,0.200258f,0.690711f,0.200945f, -0.500976f,0.139575f,0.312299f,0.140684f,0.311154f,0.200945f,0.500971f,0.200258f, -0.500971f,0.200258f,0.311154f,0.200945f,0.310217f,0.311325f,0.500967f,0.311013f, -0.690711f,0.200945f,0.500971f,0.200258f,0.500967f,0.311013f,0.691637f,0.311325f, -0.064689f,0.314748f,0.097425f,0.314333f,0.102119f,0.207588f,0.070602f,0.208504f, -0.097425f,0.314333f,0.141621f,0.3134f,0.144978f,0.205526f,0.102119f,0.207588f, -0.102119f,0.207588f,0.144978f,0.205526f,0.149254f,0.14825f,0.108547f,0.152092f, -0.070602f,0.208504f,0.102119f,0.207588f,0.108547f,0.152092f,0.07928f,0.153913f, -0.141621f,0.3134f,0.201493f,0.312259f,0.203573f,0.203007f,0.144978f,0.205526f, -0.201493f,0.312259f,0.310217f,0.311325f,0.311154f,0.200945f,0.203573f,0.203007f, -0.203573f,0.203007f,0.311154f,0.200945f,0.312299f,0.140684f,0.206115f,0.144012f, -0.144978f,0.205526f,0.203573f,0.203007f,0.206115f,0.144012f,0.149254f,0.14825f, -0.149254f,0.14825f,0.206115f,0.144012f,0.208194f,0.101224f,0.153129f,0.107596f, -0.206115f,0.144012f,0.312299f,0.140684f,0.313236f,0.096571f,0.208194f,0.101224f, -0.208194f,0.101224f,0.313236f,0.096571f,0.313652f,0.064123f,0.209119f,0.069983f, -0.153129f,0.107596f,0.208194f,0.101224f,0.209119f,0.069983f,0.154967f,0.078585f, -0.07928f,0.153913f,0.108547f,0.152092f,0.115314f,0.114304f,0.089549f,0.117742f, -0.108547f,0.152092f,0.149254f,0.14825f,0.153129f,0.107596f,0.115314f,0.114304f, -0.115314f,0.114304f,0.153129f,0.107596f,0.154967f,0.078585f,0.118783f,0.088764f, -0.089549f,0.117742f,0.115314f,0.114304f,0.118783f,0.088764f,0.098918f,0.098051f, -}; - -static const float cfGameIconNormals[] = { --0.210457f,-0.226211f,0.951071f,-0.137777f,-0.231234f,0.963093f,-0.113627f,-0.120055f,0.986243f,-0.216181f,-0.146015f,0.965373f, --0.137777f,-0.231234f,0.963093f,-0.083714f,-0.234126f,0.968595f,-0.06603f,-0.119508f,0.990635f,-0.113627f,-0.120055f,0.986243f, --0.113627f,-0.120055f,0.986243f,-0.06603f,-0.119508f,0.990635f,-0.062379f,-0.064577f,0.995961f,-0.113032f,-0.068284f,0.991242f, --0.216181f,-0.146015f,0.965373f,-0.113627f,-0.120055f,0.986243f,-0.113032f,-0.068284f,0.991242f,-0.219508f,-0.086774f,0.971744f, --0.083714f,-0.234126f,0.968595f,-0.036722f,-0.235389f,0.971207f,-0.028482f,-0.119193f,0.992463f,-0.06603f,-0.119508f,0.990635f, --0.036722f,-0.235389f,0.971207f,-0.010823f,-0.235649f,0.971778f,-0.008321f,-0.119124f,0.992845f,-0.028482f,-0.119193f,0.992463f, --0.028482f,-0.119193f,0.992463f,-0.008321f,-0.119124f,0.992845f,-0.007465f,-0.063717f,0.99794f,-0.026099f,-0.06375f,0.997625f, --0.06603f,-0.119508f,0.990635f,-0.028482f,-0.119193f,0.992463f,-0.026099f,-0.06375f,0.997625f,-0.062379f,-0.064577f,0.995961f, --0.062379f,-0.064577f,0.995961f,-0.026099f,-0.06375f,0.997625f,-0.025391f,-0.025563f,0.999351f,-0.061589f,-0.026301f,0.997755f, --0.026099f,-0.06375f,0.997625f,-0.007465f,-0.063717f,0.99794f,-0.007172f,-0.02556f,0.999648f,-0.025391f,-0.025563f,0.999351f, --0.025391f,-0.025563f,0.999351f,-0.007172f,-0.02556f,0.999648f,-0.007161f,-0.00707f,0.999949f,-0.025395f,-0.007088f,0.999652f, --0.061589f,-0.026301f,0.997755f,-0.025391f,-0.025563f,0.999351f,-0.025395f,-0.007088f,0.999652f,-0.061548f,-0.00739f,0.998077f, --0.219508f,-0.086774f,0.971744f,-0.113032f,-0.068284f,0.991242f,-0.112752f,-0.028685f,0.993209f,-0.22077f,-0.037047f,0.974622f, --0.113032f,-0.068284f,0.991242f,-0.062379f,-0.064577f,0.995961f,-0.061589f,-0.026301f,0.997755f,-0.112752f,-0.028685f,0.993209f, --0.112752f,-0.028685f,0.993209f,-0.061589f,-0.026301f,0.997755f,-0.061548f,-0.00739f,0.998077f,-0.112673f,-0.008234f,0.993598f, --0.22077f,-0.037047f,0.974622f,-0.112752f,-0.028685f,0.993209f,-0.112673f,-0.008234f,0.993598f,-0.221f,-0.010721f,0.975215f, --0.007161f,-0.00707f,0.999949f,-0.007172f,-0.02556f,0.999648f,0.0f,-0.025624f,0.999672f,0.0f,-0.007089f,0.999975f, --0.007172f,-0.02556f,0.999648f,-0.007465f,-0.063717f,0.99794f,0.0f,-0.06378f,0.997964f,0.0f,-0.025624f,0.999672f, -0.0f,-0.025624f,0.999672f,0.0f,-0.06378f,0.997964f,0.007472f,-0.063716f,0.99794f,0.007179f,-0.025559f,0.999648f, -0.0f,-0.007089f,0.999975f,0.0f,-0.025624f,0.999672f,0.007179f,-0.025559f,0.999648f,0.007169f,-0.00707f,0.999949f, --0.007465f,-0.063717f,0.99794f,-0.008321f,-0.119124f,0.992845f,0.0f,-0.119133f,0.992878f,0.0f,-0.06378f,0.997964f, --0.008321f,-0.119124f,0.992845f,-0.010823f,-0.235649f,0.971778f,0.0f,-0.235564f,0.971859f,0.0f,-0.119133f,0.992878f, -0.0f,-0.119133f,0.992878f,0.0f,-0.235564f,0.971859f,0.010835f,-0.23565f,0.971778f,0.008329f,-0.119124f,0.992845f, -0.0f,-0.06378f,0.997964f,0.0f,-0.119133f,0.992878f,0.008329f,-0.119124f,0.992845f,0.007472f,-0.063716f,0.99794f, --0.007161f,-0.00707f,0.999949f,0.0f,-0.007089f,0.999975f,0.0f,0.0f,1.0f,-0.007181f,0.0f,0.999974f, -0.0f,-0.007089f,0.999975f,0.007169f,-0.00707f,0.999949f,0.007189f,0.0f,0.999974f,0.0f,0.0f,1.0f, -0.0f,0.0f,1.0f,0.007189f,0.0f,0.999974f,0.00717f,0.007027f,0.99995f,0.0f,0.007045f,0.999975f, --0.007181f,0.0f,0.999974f,0.0f,0.0f,1.0f,0.0f,0.007045f,0.999975f,-0.007163f,0.007027f,0.99995f, --0.061553f,0.007347f,0.998077f,-0.112675f,0.008187f,0.993598f,-0.112665f,0.0f,0.993633f,-0.061598f,0.0f,0.998101f, --0.112675f,0.008187f,0.993598f,-0.220997f,0.010655f,0.975216f,-0.220914f,-1.0E-6f,0.975293f,-0.112665f,0.0f,0.993633f, --0.112665f,0.0f,0.993633f,-0.220914f,-1.0E-6f,0.975293f,-0.221f,-0.010721f,0.975215f,-0.112673f,-0.008234f,0.993598f, --0.061598f,0.0f,0.998101f,-0.112665f,0.0f,0.993633f,-0.112673f,-0.008234f,0.993598f,-0.061548f,-0.00739f,0.998077f, --0.061553f,0.007347f,0.998077f,-0.061598f,0.0f,0.998101f,-0.025456f,0.0f,0.999676f,-0.025398f,0.007046f,0.999653f, --0.061598f,0.0f,0.998101f,-0.061548f,-0.00739f,0.998077f,-0.025395f,-0.007088f,0.999652f,-0.025456f,0.0f,0.999676f, --0.025456f,0.0f,0.999676f,-0.025395f,-0.007088f,0.999652f,-0.007161f,-0.00707f,0.999949f,-0.007181f,0.0f,0.999974f, --0.025398f,0.007046f,0.999653f,-0.025456f,0.0f,0.999676f,-0.007181f,0.0f,0.999974f,-0.007163f,0.007027f,0.99995f, --0.211482f,0.213152f,0.953856f,-0.138447f,0.218126f,0.966051f,-0.198978f,0.347214f,0.916433f,-0.296456f,0.298724f,0.907126f, --0.138447f,0.218126f,0.966051f,-0.084089f,0.221062f,0.971628f,-0.117212f,0.361162f,0.925107f,-0.198978f,0.347214f,0.916433f, --0.198978f,0.347214f,0.916433f,-0.117212f,0.361162f,0.925107f,-0.168084f,0.541107f,0.823985f,-0.282777f,0.494303f,0.822011f, --0.296456f,0.298724f,0.907126f,-0.198978f,0.347214f,0.916433f,-0.282777f,0.494303f,0.822011f,-0.402197f,0.405178f,0.821017f, --0.084089f,0.221062f,0.971628f,-0.036885f,0.222305f,0.974279f,-0.050723f,0.367918f,0.928474f,-0.117212f,0.361162f,0.925107f, --0.036885f,0.222305f,0.974279f,-0.010867f,0.22256f,0.974858f,-0.014805f,0.369601f,0.929073f,-0.050723f,0.367918f,0.928474f, --0.050723f,0.367918f,0.928474f,-0.014805f,0.369601f,0.929073f,-0.020782f,0.568602f,0.822351f,-0.072149f,0.563165f,0.823189f, --0.117212f,0.361162f,0.925107f,-0.050723f,0.367918f,0.928474f,-0.072149f,0.563165f,0.823189f,-0.168084f,0.541107f,0.823985f, --0.072149f,0.563165f,0.823189f,-0.020782f,0.568602f,0.822351f,-0.025372f,0.696348f,0.717256f,-0.088478f,0.684053f,0.724047f, --0.168084f,0.541107f,0.823985f,-0.072149f,0.563165f,0.823189f,-0.088478f,0.684053f,0.724047f,-0.20294f,0.64707f,0.734926f, --0.282777f,0.494303f,0.822011f,-0.168084f,0.541107f,0.823985f,-0.20294f,0.64707f,0.734926f,-0.333245f,0.577074f,0.745609f, --0.402197f,0.405178f,0.821017f,-0.282777f,0.494303f,0.822011f,-0.333245f,0.577074f,0.745609f,-0.466013f,0.469045f,0.75022f, --0.025372f,0.696348f,0.717256f,-0.020782f,0.568602f,0.822351f,0.0f,0.568694f,0.822549f,-2.0E-6f,0.698486f,0.715623f, -0.0f,0.568694f,0.822549f,-0.020782f,0.568602f,0.822351f,-0.014805f,0.369601f,0.929073f,0.0f,0.369504f,0.929229f, -0.020804f,0.568602f,0.82235f,0.0f,0.568694f,0.822549f,0.0f,0.369504f,0.929229f,0.01482f,0.369601f,0.929072f, --2.0E-6f,0.698486f,0.715623f,0.0f,0.568694f,0.822549f,0.020804f,0.568602f,0.82235f,0.025388f,0.696365f,0.717239f, --0.014805f,0.369601f,0.929073f,-0.010867f,0.22256f,0.974858f,0.0f,0.222477f,0.974938f,0.0f,0.369504f,0.929229f, -0.0f,0.369504f,0.929229f,0.0f,0.222477f,0.974938f,0.010878f,0.222561f,0.974858f,0.01482f,0.369601f,0.929072f, -0.010835f,-0.23565f,0.971778f,0.0f,-0.235564f,0.971859f,0.0f,-0.389089f,0.9212f,0.014687f,-0.38921f,0.921032f, -0.0f,-0.235564f,0.971859f,-0.010823f,-0.235649f,0.971778f,-0.014671f,-0.38921f,0.921032f,0.0f,-0.389089f,0.9212f, -0.0f,-0.389089f,0.9212f,-0.014671f,-0.38921f,0.921032f,-0.020367f,-0.591835f,0.805802f,0.0f,-0.591896f,0.806014f, -0.014687f,-0.38921f,0.921032f,0.0f,-0.389089f,0.9212f,0.0f,-0.591896f,0.806014f,0.020387f,-0.591837f,0.8058f, --0.020367f,-0.591835f,0.805802f,-0.024675f,-0.717705f,0.69591f,-2.0E-6f,-0.719788f,0.694194f,0.0f,-0.591896f,0.806014f, -0.0f,-0.591896f,0.806014f,-2.0E-6f,-0.719788f,0.694194f,0.02469f,-0.717725f,0.695889f,0.020387f,-0.591837f,0.8058f, --0.46128f,-0.48965f,0.739908f,-0.32814f,-0.599132f,0.730319f,-0.27855f,-0.517113f,0.809323f,-0.397988f,-0.425903f,0.812534f, --0.32814f,-0.599132f,0.730319f,-0.198659f,-0.669215f,0.716021f,-0.165045f,-0.564346f,0.808872f,-0.27855f,-0.517113f,0.809323f, --0.27855f,-0.517113f,0.809323f,-0.165045f,-0.564346f,0.808872f,-0.116165f,-0.380579f,0.917423f,-0.197289f,-0.366449f,0.909281f, --0.397988f,-0.425903f,0.812534f,-0.27855f,-0.517113f,0.809323f,-0.197289f,-0.366449f,0.909281f,-0.294472f,-0.315809f,0.901971f, --0.198659f,-0.669215f,0.716021f,-0.086339f,-0.705672f,0.703258f,-0.070739f,-0.586438f,0.806899f,-0.165045f,-0.564346f,0.808872f, --0.086339f,-0.705672f,0.703258f,-0.024675f,-0.717705f,0.69591f,-0.020367f,-0.591835f,0.805802f,-0.070739f,-0.586438f,0.806899f, --0.070739f,-0.586438f,0.806899f,-0.020367f,-0.591835f,0.805802f,-0.014671f,-0.38921f,0.921032f,-0.050259f,-0.387507f,0.920496f, --0.165045f,-0.564346f,0.808872f,-0.070739f,-0.586438f,0.806899f,-0.050259f,-0.387507f,0.920496f,-0.116165f,-0.380579f,0.917423f, --0.050259f,-0.387507f,0.920496f,-0.014671f,-0.38921f,0.921032f,-0.010823f,-0.235649f,0.971778f,-0.036722f,-0.235389f,0.971207f, --0.116165f,-0.380579f,0.917423f,-0.050259f,-0.387507f,0.920496f,-0.036722f,-0.235389f,0.971207f,-0.083714f,-0.234126f,0.968595f, --0.197289f,-0.366449f,0.909281f,-0.116165f,-0.380579f,0.917423f,-0.083714f,-0.234126f,0.968595f,-0.137777f,-0.231234f,0.963093f, --0.294472f,-0.315809f,0.901971f,-0.197289f,-0.366449f,0.909281f,-0.137777f,-0.231234f,0.963093f,-0.210457f,-0.226211f,0.951071f, -0.212501f,-0.226048f,0.950655f,0.297154f,-0.315494f,0.901201f,0.347306f,-0.209845f,0.913971f,0.218237f,-0.145906f,0.964927f, -0.347306f,-0.209845f,0.913971f,0.297154f,-0.315494f,0.901201f,0.401261f,-0.425239f,0.811271f,0.493682f,-0.297695f,0.817102f, -0.362206f,-0.121013f,0.924209f,0.347306f,-0.209845f,0.913971f,0.493682f,-0.297695f,0.817102f,0.542487f,-0.173678f,0.821915f, -0.218237f,-0.145906f,0.964927f,0.347306f,-0.209845f,0.913971f,0.362206f,-0.121013f,0.924209f,0.221558f,-0.086713f,0.971284f, -0.401261f,-0.425239f,0.811271f,0.464547f,-0.488911f,0.738351f,0.57643f,-0.348399f,0.739153f,0.493682f,-0.297695f,0.817102f, -0.493682f,-0.297695f,0.817102f,0.57643f,-0.348399f,0.739153f,0.648687f,-0.208869f,0.731832f,0.542487f,-0.173678f,0.821915f, -0.362206f,-0.121013f,0.924209f,0.542487f,-0.173678f,0.821915f,0.564441f,-0.072486f,0.822285f,0.368823f,-0.050932f,0.928103f, -0.542487f,-0.173678f,0.821915f,0.648687f,-0.208869f,0.731832f,0.685633f,-0.08861f,0.722534f,0.564441f,-0.072486f,0.822285f, -0.564441f,-0.072486f,0.822285f,0.685633f,-0.08861f,0.722534f,0.697362f,-0.024953f,0.716285f,0.569527f,-0.020487f,0.821717f, -0.564441f,-0.072486f,0.822285f,0.569527f,-0.020487f,0.821717f,0.370348f,-0.014597f,0.928778f,0.368823f,-0.050932f,0.928103f, -0.221558f,-0.086713f,0.971284f,0.362206f,-0.121013f,0.924209f,0.368823f,-0.050932f,0.928103f,0.222823f,-0.037022f,0.974156f, -0.222823f,-0.037022f,0.974156f,0.368823f,-0.050932f,0.928103f,0.370348f,-0.014597f,0.928778f,0.223053f,-0.010715f,0.974747f, -0.223053f,-0.010715f,0.974747f,0.370348f,-0.014597f,0.928778f,0.37024f,-1.0E-6f,0.928936f,0.222967f,-1.0E-6f,0.974826f, -0.37024f,-1.0E-6f,0.928936f,0.370348f,-0.014597f,0.928778f,0.569527f,-0.020487f,0.821717f,0.569586f,-1.0E-6f,0.821932f, -0.37035f,0.014508f,0.928779f,0.37024f,-1.0E-6f,0.928936f,0.569586f,-1.0E-6f,0.821932f,0.569522f,0.020364f,0.821724f, -0.222967f,-1.0E-6f,0.974826f,0.37024f,-1.0E-6f,0.928936f,0.37035f,0.014508f,0.928779f,0.223051f,0.010649f,0.974749f, -0.569527f,-0.020487f,0.821717f,0.697362f,-0.024953f,0.716285f,0.699353f,1.1E-5f,0.714776f,0.569586f,-1.0E-6f,0.821932f, -0.569586f,-1.0E-6f,0.821932f,0.699353f,1.1E-5f,0.714776f,0.697248f,0.024864f,0.716398f,0.569522f,0.020364f,0.821724f, --0.46128f,-0.48965f,0.739908f,-0.397988f,-0.425903f,0.812534f,-0.490028f,-0.298377f,0.819051f,-0.572885f,-0.349196f,0.741529f, --0.490028f,-0.298377f,0.819051f,-0.397988f,-0.425903f,0.812534f,-0.294472f,-0.315809f,0.901971f,-0.344264f,-0.210118f,0.915059f, --0.538747f,-0.174169f,0.824268f,-0.490028f,-0.298377f,0.819051f,-0.344264f,-0.210118f,0.915059f,-0.359131f,-0.12118f,0.925386f, --0.572885f,-0.349196f,0.741529f,-0.490028f,-0.298377f,0.819051f,-0.538747f,-0.174169f,0.824268f,-0.645088f,-0.209547f,0.734814f, --0.294472f,-0.315809f,0.901971f,-0.210457f,-0.226211f,0.951071f,-0.216181f,-0.146015f,0.965373f,-0.344264f,-0.210118f,0.915059f, --0.344264f,-0.210118f,0.915059f,-0.216181f,-0.146015f,0.965373f,-0.219508f,-0.086774f,0.971744f,-0.359131f,-0.12118f,0.925386f, --0.538747f,-0.174169f,0.824268f,-0.359131f,-0.12118f,0.925386f,-0.365721f,-0.051004f,0.929326f,-0.560687f,-0.072708f,0.82483f, --0.359131f,-0.12118f,0.925386f,-0.219508f,-0.086774f,0.971744f,-0.22077f,-0.037047f,0.974622f,-0.365721f,-0.051004f,0.929326f, --0.365721f,-0.051004f,0.929326f,-0.22077f,-0.037047f,0.974622f,-0.221f,-0.010721f,0.975215f,-0.367244f,-0.014617f,0.93001f, --0.365721f,-0.051004f,0.929326f,-0.367244f,-0.014617f,0.93001f,-0.565774f,-0.020551f,0.824304f,-0.560687f,-0.072708f,0.82483f, --0.645088f,-0.209547f,0.734814f,-0.538747f,-0.174169f,0.824268f,-0.560687f,-0.072708f,0.82483f,-0.682094f,-0.088945f,0.725836f, --0.682094f,-0.088945f,0.725836f,-0.560687f,-0.072708f,0.82483f,-0.565774f,-0.020551f,0.824304f,-0.69385f,-0.025062f,0.719683f, --0.693736f,0.024972f,0.719796f,-0.695847f,1.1E-5f,0.71819f,-0.565837f,-1.0E-6f,0.824517f,-0.565768f,0.020427f,0.824311f, --0.695847f,1.1E-5f,0.71819f,-0.69385f,-0.025062f,0.719683f,-0.565774f,-0.020551f,0.824304f,-0.565837f,-1.0E-6f,0.824517f, --0.565837f,-1.0E-6f,0.824517f,-0.565774f,-0.020551f,0.824304f,-0.367244f,-0.014617f,0.93001f,-0.36714f,-1.0E-6f,0.930166f, --0.565768f,0.020427f,0.824311f,-0.565837f,-1.0E-6f,0.824517f,-0.36714f,-1.0E-6f,0.930166f,-0.367245f,0.014528f,0.930011f, --0.367244f,-0.014617f,0.93001f,-0.221f,-0.010721f,0.975215f,-0.220914f,-1.0E-6f,0.975293f,-0.36714f,-1.0E-6f,0.930166f, --0.36714f,-1.0E-6f,0.930166f,-0.220914f,-1.0E-6f,0.975293f,-0.220997f,0.010655f,0.975216f,-0.367245f,0.014528f,0.930011f, -0.010878f,0.222561f,0.974858f,0.037001f,0.222307f,0.974274f,0.050884f,0.367932f,0.92846f,0.01482f,0.369601f,0.929072f, -0.037001f,0.222307f,0.974274f,0.084603f,0.221056f,0.971585f,0.117939f,0.361173f,0.92501f,0.050884f,0.367932f,0.92846f, -0.050884f,0.367932f,0.92846f,0.117939f,0.361173f,0.92501f,0.169134f,0.541105f,0.823771f,0.072381f,0.563194f,0.823149f, -0.020804f,0.568602f,0.82235f,0.01482f,0.369601f,0.929072f,0.050884f,0.367932f,0.92846f,0.072381f,0.563194f,0.823149f, -0.084603f,0.221056f,0.971585f,0.139597f,0.218066f,0.965898f,0.200629f,0.347092f,0.91612f,0.117939f,0.361173f,0.92501f, -0.139597f,0.218066f,0.965898f,0.213531f,0.212993f,0.953435f,0.299149f,0.298419f,0.906342f,0.200629f,0.347092f,0.91612f, -0.200629f,0.347092f,0.91612f,0.299149f,0.298419f,0.906342f,0.405489f,0.404531f,0.819716f,0.285031f,0.494036f,0.821393f, -0.117939f,0.361173f,0.92501f,0.200629f,0.347092f,0.91612f,0.285031f,0.494036f,0.821393f,0.169134f,0.541105f,0.823771f, -0.285031f,0.494036f,0.821393f,0.405489f,0.404531f,0.819716f,0.4693f,0.468325f,0.748619f,0.335556f,0.576804f,0.744781f, -0.169134f,0.541105f,0.823771f,0.285031f,0.494036f,0.821393f,0.335556f,0.576804f,0.744781f,0.204073f,0.64709f,0.734595f, -0.072381f,0.563194f,0.823149f,0.169134f,0.541105f,0.823771f,0.204073f,0.64709f,0.734595f,0.088715f,0.684119f,0.723955f, -0.020804f,0.568602f,0.82235f,0.072381f,0.563194f,0.823149f,0.088715f,0.684119f,0.723955f,0.025388f,0.696365f,0.717239f, -0.010835f,-0.23565f,0.971778f,0.014687f,-0.38921f,0.921032f,0.050418f,-0.38752f,0.920482f,0.036837f,-0.235391f,0.971203f, -0.050418f,-0.38752f,0.920482f,0.014687f,-0.38921f,0.921032f,0.020387f,-0.591837f,0.8058f,0.070967f,-0.586467f,0.806858f, -0.116885f,-0.380591f,0.917327f,0.050418f,-0.38752f,0.920482f,0.070967f,-0.586467f,0.806858f,0.166076f,-0.564345f,0.808662f, -0.036837f,-0.235391f,0.971203f,0.050418f,-0.38752f,0.920482f,0.116885f,-0.380591f,0.917327f,0.084225f,-0.234121f,0.968552f, -0.020387f,-0.591837f,0.8058f,0.02469f,-0.717725f,0.695889f,0.086571f,-0.705739f,0.703163f,0.070967f,-0.586467f,0.806858f, -0.070967f,-0.586467f,0.806858f,0.086571f,-0.705739f,0.703163f,0.199773f,-0.669232f,0.715695f,0.166076f,-0.564345f,0.808662f, -0.116885f,-0.380591f,0.917327f,0.166076f,-0.564345f,0.808662f,0.280776f,-0.516844f,0.808725f,0.198928f,-0.366325f,0.908974f, -0.166076f,-0.564345f,0.808662f,0.199773f,-0.669232f,0.715695f,0.33043f,-0.598851f,0.729516f,0.280776f,-0.516844f,0.808725f, -0.280776f,-0.516844f,0.808725f,0.33043f,-0.598851f,0.729516f,0.464547f,-0.488911f,0.738351f,0.401261f,-0.425239f,0.811271f, -0.280776f,-0.516844f,0.808725f,0.401261f,-0.425239f,0.811271f,0.297154f,-0.315494f,0.901201f,0.198928f,-0.366325f,0.908974f, -0.084225f,-0.234121f,0.968552f,0.116885f,-0.380591f,0.917327f,0.198928f,-0.366325f,0.908974f,0.138923f,-0.231173f,0.962943f, -0.138923f,-0.231173f,0.962943f,0.198928f,-0.366325f,0.908974f,0.297154f,-0.315494f,0.901201f,0.212501f,-0.226048f,0.950655f, -0.007169f,-0.00707f,0.999949f,0.007179f,-0.025559f,0.999648f,0.025473f,-0.02556f,0.999349f,0.025479f,-0.007087f,0.99965f, -0.007179f,-0.025559f,0.999648f,0.007472f,-0.063716f,0.99794f,0.02618f,-0.063744f,0.997623f,0.025473f,-0.02556f,0.999349f, -0.025473f,-0.02556f,0.999349f,0.02618f,-0.063744f,0.997623f,0.062764f,-0.064559f,0.995938f,0.061979f,-0.026292f,0.997731f, -0.025479f,-0.007087f,0.99965f,0.025473f,-0.02556f,0.999349f,0.061979f,-0.026292f,0.997731f,0.061944f,-0.007387f,0.998052f, -0.007472f,-0.063716f,0.99794f,0.008329f,-0.119124f,0.992845f,0.028568f,-0.119188f,0.992461f,0.02618f,-0.063744f,0.997623f, -0.008329f,-0.119124f,0.992845f,0.010835f,-0.23565f,0.971778f,0.036837f,-0.235391f,0.971203f,0.028568f,-0.119188f,0.992461f, -0.028568f,-0.119188f,0.992461f,0.036837f,-0.235391f,0.971203f,0.084225f,-0.234121f,0.968552f,0.066426f,-0.119489f,0.990611f, -0.02618f,-0.063744f,0.997623f,0.028568f,-0.119188f,0.992461f,0.066426f,-0.119489f,0.990611f,0.062764f,-0.064559f,0.995938f, -0.062764f,-0.064559f,0.995938f,0.066426f,-0.119489f,0.990611f,0.114563f,-0.120018f,0.98614f,0.113981f,-0.068259f,0.991135f, -0.066426f,-0.119489f,0.990611f,0.084225f,-0.234121f,0.968552f,0.138923f,-0.231173f,0.962943f,0.114563f,-0.120018f,0.98614f, -0.114563f,-0.120018f,0.98614f,0.138923f,-0.231173f,0.962943f,0.212501f,-0.226048f,0.950655f,0.218237f,-0.145906f,0.964927f, -0.113981f,-0.068259f,0.991135f,0.114563f,-0.120018f,0.98614f,0.218237f,-0.145906f,0.964927f,0.221558f,-0.086713f,0.971284f, -0.061944f,-0.007387f,0.998052f,0.061979f,-0.026292f,0.997731f,0.113708f,-0.028673f,0.9931f,0.113635f,-0.008231f,0.993489f, -0.061979f,-0.026292f,0.997731f,0.062764f,-0.064559f,0.995938f,0.113981f,-0.068259f,0.991135f,0.113708f,-0.028673f,0.9931f, -0.113708f,-0.028673f,0.9931f,0.113981f,-0.068259f,0.991135f,0.221558f,-0.086713f,0.971284f,0.222823f,-0.037022f,0.974156f, -0.113635f,-0.008231f,0.993489f,0.113708f,-0.028673f,0.9931f,0.222823f,-0.037022f,0.974156f,0.223053f,-0.010715f,0.974747f, -0.00717f,0.007027f,0.99995f,0.007189f,0.0f,0.999974f,0.025542f,0.0f,0.999674f,0.025482f,0.007044f,0.999651f, -0.007189f,0.0f,0.999974f,0.007169f,-0.00707f,0.999949f,0.025479f,-0.007087f,0.99965f,0.025542f,0.0f,0.999674f, -0.025542f,0.0f,0.999674f,0.025479f,-0.007087f,0.99965f,0.061944f,-0.007387f,0.998052f,0.061996f,0.0f,0.998076f, -0.025482f,0.007044f,0.999651f,0.025542f,0.0f,0.999674f,0.061996f,0.0f,0.998076f,0.061948f,0.007344f,0.998052f, -0.061944f,-0.007387f,0.998052f,0.113635f,-0.008231f,0.993489f,0.11363f,0.0f,0.993523f,0.061996f,0.0f,0.998076f, -0.113635f,-0.008231f,0.993489f,0.223053f,-0.010715f,0.974747f,0.222967f,-1.0E-6f,0.974826f,0.11363f,0.0f,0.993523f, -0.11363f,0.0f,0.993523f,0.222967f,-1.0E-6f,0.974826f,0.223051f,0.010649f,0.974749f,0.113637f,0.008184f,0.993489f, -0.061996f,0.0f,0.998076f,0.11363f,0.0f,0.993523f,0.113637f,0.008184f,0.993489f,0.061948f,0.007344f,0.998052f, --0.693736f,0.024972f,0.719796f,-0.565768f,0.020427f,0.824311f,-0.560511f,0.071322f,0.82507f,-0.681667f,0.087549f,0.726406f, --0.560511f,0.071322f,0.82507f,-0.565768f,0.020427f,0.824311f,-0.367245f,0.014528f,0.930011f,-0.365644f,0.050051f,0.929408f, --0.53875f,0.167715f,0.825603f,-0.560511f,0.071322f,0.82507f,-0.365644f,0.050051f,0.929408f,-0.359059f,0.116722f,0.925987f, --0.681667f,0.087549f,0.726406f,-0.560511f,0.071322f,0.82507f,-0.53875f,0.167715f,0.825603f,-0.644943f,0.202621f,0.736881f, --0.367245f,0.014528f,0.930011f,-0.220997f,0.010655f,0.975216f,-0.220758f,0.036362f,0.974651f,-0.365644f,0.050051f,0.929408f, --0.365644f,0.050051f,0.929408f,-0.220758f,0.036362f,0.974651f,-0.219543f,0.083629f,0.972012f,-0.359059f,0.116722f,0.925987f, --0.53875f,0.167715f,0.825603f,-0.359059f,0.116722f,0.925987f,-0.34505f,0.199733f,0.917086f,-0.491757f,0.284219f,0.82304f, --0.359059f,0.116722f,0.925987f,-0.219543f,0.083629f,0.972012f,-0.216564f,0.138788f,0.966353f,-0.34505f,0.199733f,0.917086f, --0.34505f,0.199733f,0.917086f,-0.216564f,0.138788f,0.966353f,-0.211482f,0.213152f,0.953856f,-0.296456f,0.298724f,0.907126f, --0.34505f,0.199733f,0.917086f,-0.296456f,0.298724f,0.907126f,-0.402197f,0.405178f,0.821017f,-0.491757f,0.284219f,0.82304f, --0.644943f,0.202621f,0.736881f,-0.53875f,0.167715f,0.825603f,-0.491757f,0.284219f,0.82304f,-0.574618f,0.33479f,0.746813f, --0.574618f,0.33479f,0.746813f,-0.491757f,0.284219f,0.82304f,-0.402197f,0.405178f,0.821017f,-0.466013f,0.469045f,0.75022f, -0.223051f,0.010649f,0.974749f,0.37035f,0.014508f,0.928779f,0.368745f,0.04998f,0.928186f,0.222811f,0.036337f,0.974184f, -0.368745f,0.04998f,0.928186f,0.37035f,0.014508f,0.928779f,0.569522f,0.020364f,0.821724f,0.564266f,0.071105f,0.822525f, -0.362133f,0.116561f,0.92481f,0.368745f,0.04998f,0.928186f,0.564266f,0.071105f,0.822525f,0.54249f,0.167243f,0.823246f, -0.222811f,0.036337f,0.974184f,0.368745f,0.04998f,0.928186f,0.362133f,0.116561f,0.92481f,0.221593f,0.083571f,0.971552f, -0.569522f,0.020364f,0.821724f,0.697248f,0.024864f,0.716398f,0.685209f,0.08722f,0.723105f,0.564266f,0.071105f,0.822525f, -0.564266f,0.071105f,0.822525f,0.685209f,0.08722f,0.723105f,0.648546f,0.20196f,0.733894f,0.54249f,0.167243f,0.823246f, -0.362133f,0.116561f,0.92481f,0.54249f,0.167243f,0.823246f,0.495412f,0.283564f,0.821071f,0.348093f,0.199473f,0.915992f, -0.54249f,0.167243f,0.823246f,0.648546f,0.20196f,0.733894f,0.578173f,0.334012f,0.744414f,0.495412f,0.283564f,0.821071f, -0.495412f,0.283564f,0.821071f,0.578173f,0.334012f,0.744414f,0.4693f,0.468325f,0.748619f,0.405489f,0.404531f,0.819716f, -0.495412f,0.283564f,0.821071f,0.405489f,0.404531f,0.819716f,0.299149f,0.298419f,0.906342f,0.348093f,0.199473f,0.915992f, -0.221593f,0.083571f,0.971552f,0.362133f,0.116561f,0.92481f,0.348093f,0.199473f,0.915992f,0.218621f,0.138683f,0.965905f, -0.218621f,0.138683f,0.965905f,0.348093f,0.199473f,0.915992f,0.299149f,0.298419f,0.906342f,0.213531f,0.212993f,0.953435f, -0.010878f,0.222561f,0.974858f,0.008351f,0.113056f,0.993554f,0.028645f,0.113157f,0.993164f,0.037001f,0.222307f,0.974274f, -0.008351f,0.113056f,0.993554f,0.007491f,0.061287f,0.998092f,0.026239f,0.061352f,0.997771f,0.028645f,0.113157f,0.993164f, -0.028645f,0.113157f,0.993164f,0.026239f,0.061352f,0.997771f,0.062873f,0.062197f,0.996082f,0.066588f,0.113508f,0.991303f, -0.037001f,0.222307f,0.974274f,0.028645f,0.113157f,0.993164f,0.066588f,0.113508f,0.991303f,0.084603f,0.221056f,0.971585f, -0.007491f,0.061287f,0.998092f,0.007187f,0.025058f,0.99966f,0.025494f,0.025072f,0.999361f,0.026239f,0.061352f,0.997771f, -0.007187f,0.025058f,0.99966f,0.00717f,0.007027f,0.99995f,0.025482f,0.007044f,0.999651f,0.025494f,0.025072f,0.999361f, -0.025494f,0.025072f,0.999361f,0.025482f,0.007044f,0.999651f,0.061948f,0.007344f,0.998052f,0.062015f,0.025807f,0.997742f, -0.026239f,0.061352f,0.997771f,0.025494f,0.025072f,0.999361f,0.062015f,0.025807f,0.997742f,0.062873f,0.062197f,0.996082f, -0.062873f,0.062197f,0.996082f,0.062015f,0.025807f,0.997742f,0.113738f,0.028159f,0.993112f,0.114097f,0.065833f,0.991286f, -0.062015f,0.025807f,0.997742f,0.061948f,0.007344f,0.998052f,0.113637f,0.008184f,0.993489f,0.113738f,0.028159f,0.993112f, -0.113738f,0.028159f,0.993112f,0.113637f,0.008184f,0.993489f,0.223051f,0.010649f,0.974749f,0.222811f,0.036337f,0.974184f, -0.114097f,0.065833f,0.991286f,0.113738f,0.028159f,0.993112f,0.222811f,0.036337f,0.974184f,0.221593f,0.083571f,0.971552f, -0.084603f,0.221056f,0.971585f,0.066588f,0.113508f,0.991303f,0.114794f,0.114134f,0.986811f,0.139597f,0.218066f,0.965898f, -0.066588f,0.113508f,0.991303f,0.062873f,0.062197f,0.996082f,0.114097f,0.065833f,0.991286f,0.114794f,0.114134f,0.986811f, -0.114794f,0.114134f,0.986811f,0.114097f,0.065833f,0.991286f,0.221593f,0.083571f,0.971552f,0.218621f,0.138683f,0.965905f, -0.139597f,0.218066f,0.965898f,0.114794f,0.114134f,0.986811f,0.218621f,0.138683f,0.965905f,0.213531f,0.212993f,0.953435f, -0.007491f,0.061287f,0.998092f,0.008351f,0.113056f,0.993554f,0.0f,0.113048f,0.99359f,0.0f,0.061335f,0.998117f, -0.008351f,0.113056f,0.993554f,0.010878f,0.222561f,0.974858f,0.0f,0.222477f,0.974938f,0.0f,0.113048f,0.99359f, -0.0f,0.113048f,0.99359f,0.0f,0.222477f,0.974938f,-0.010867f,0.22256f,0.974858f,-0.008343f,0.113057f,0.993554f, -0.0f,0.061335f,0.998117f,0.0f,0.113048f,0.99359f,-0.008343f,0.113057f,0.993554f,-0.007484f,0.061287f,0.998092f, -0.007491f,0.061287f,0.998092f,0.0f,0.061335f,0.998117f,0.0f,0.025116f,0.999685f,0.007187f,0.025058f,0.99966f, -0.0f,0.061335f,0.998117f,-0.007484f,0.061287f,0.998092f,-0.00718f,0.025059f,0.99966f,0.0f,0.025116f,0.999685f, -0.0f,0.025116f,0.999685f,-0.00718f,0.025059f,0.99966f,-0.007163f,0.007027f,0.99995f,0.0f,0.007045f,0.999975f, -0.007187f,0.025058f,0.99966f,0.0f,0.025116f,0.999685f,0.0f,0.007045f,0.999975f,0.00717f,0.007027f,0.99995f, --0.220997f,0.010655f,0.975216f,-0.112675f,0.008187f,0.993598f,-0.112781f,0.02817f,0.993221f,-0.220758f,0.036362f,0.974651f, --0.112675f,0.008187f,0.993598f,-0.061553f,0.007347f,0.998077f,-0.061625f,0.025816f,0.997765f,-0.112781f,0.02817f,0.993221f, --0.112781f,0.02817f,0.993221f,-0.061625f,0.025816f,0.997765f,-0.062487f,0.062214f,0.996105f,-0.113147f,0.065858f,0.991393f, --0.220758f,0.036362f,0.974651f,-0.112781f,0.02817f,0.993221f,-0.113147f,0.065858f,0.991393f,-0.219543f,0.083629f,0.972012f, --0.061553f,0.007347f,0.998077f,-0.025398f,0.007046f,0.999653f,-0.025412f,0.025076f,0.999363f,-0.061625f,0.025816f,0.997765f, --0.025398f,0.007046f,0.999653f,-0.007163f,0.007027f,0.99995f,-0.00718f,0.025059f,0.99966f,-0.025412f,0.025076f,0.999363f, --0.025412f,0.025076f,0.999363f,-0.00718f,0.025059f,0.99966f,-0.007484f,0.061287f,0.998092f,-0.026157f,0.061358f,0.997773f, --0.061625f,0.025816f,0.997765f,-0.025412f,0.025076f,0.999363f,-0.026157f,0.061358f,0.997773f,-0.062487f,0.062214f,0.996105f, --0.062487f,0.062214f,0.996105f,-0.026157f,0.061358f,0.997773f,-0.028558f,0.113162f,0.993166f,-0.066192f,0.113526f,0.991328f, --0.026157f,0.061358f,0.997773f,-0.007484f,0.061287f,0.998092f,-0.008343f,0.113057f,0.993554f,-0.028558f,0.113162f,0.993166f, --0.028558f,0.113162f,0.993166f,-0.008343f,0.113057f,0.993554f,-0.010867f,0.22256f,0.974858f,-0.036885f,0.222305f,0.974279f, --0.066192f,0.113526f,0.991328f,-0.028558f,0.113162f,0.993166f,-0.036885f,0.222305f,0.974279f,-0.084089f,0.221062f,0.971628f, --0.219543f,0.083629f,0.972012f,-0.113147f,0.065858f,0.991393f,-0.113857f,0.11417f,0.986915f,-0.216564f,0.138788f,0.966353f, --0.113147f,0.065858f,0.991393f,-0.062487f,0.062214f,0.996105f,-0.066192f,0.113526f,0.991328f,-0.113857f,0.11417f,0.986915f, --0.113857f,0.11417f,0.986915f,-0.066192f,0.113526f,0.991328f,-0.084089f,0.221062f,0.971628f,-0.138447f,0.218126f,0.966051f, --0.216564f,0.138788f,0.966353f,-0.113857f,0.11417f,0.986915f,-0.138447f,0.218126f,0.966051f,-0.211482f,0.213152f,0.953856f, -}; - -const float cfGameIconStrokeVtxs[] = -{ --0.376756459475,1.046143651009f,0.0f, --0.512206375599f,1.039104461670f,0.0f, --0.613150417805f,1.029256582260f,0.0f, --0.688333272934f,1.016606807709f,0.0f, --0.746499598026f,1.001162052155f,0.0f, --0.796394228935f,0.982929229736,0.0f, --0.839153468609,0.961680650711,0.0f, --0.875913500786,0.93718868494,0.0f, --0.907810747623,0.909225344658,0.0f, --0.93598151207,0.877562940121,0.0f, --0.960655272007,0.840993285179,0.0f, --0.982061386108,0.79830801487,0.0f, --1.00042927265,0.748299062252,0.0f, --1.015988588333,0.689758002758,0.0f, --1.028732180595,0.613717556,0.0f, --1.038653135300,0.511210441589,0.0f, --1.045744538307,0.373269081116,0.0f, --1.049999356270,0.190926194191,0.0f, --1.051417708397,-1.349482312799E-002,0.0f, --1.049999356270,-0.217670500278,0.0f, --1.04574441910,-0.399277359247,0.0f, --1.038653135300,-0.535992026329,0.0f, --1.028732180595,-0.636890649796,0.0f, --1.015988588333,-0.711049556732,0.0f, --1.00042927265,-0.767545044422,0.0f, --0.982061386108,-0.815453350544,0.0f, --0.960655212402,-0.856050789356,0.0f, --0.93598151207,-0.890613555908,0.0f, --0.907810747623,-0.920418143272,0.0f, --0.875913500786,-0.946740865707,0.0f, --0.839153468609,-0.969795942307,0.0f, --0.796394228935,-0.989797830582,0.0f, --0.746499598026,-1.006960868835,0.0f, --0.688333272934,-1.021499633789,0.0f, --0.613150477409,-1.033407211304,0.0f, --0.512206375599,-1.042677521706,0.0f, --0.376756429672,-1.049303770065,0.0f, --0.19805586338,-1.053279519081,0.0f, -2.249561250210E-003,-1.054604768753,0.0f, -0.202514111996,-1.053279519081,0.0f, -0.381092041731,-1.049303770065,0.0f, -0.516337633133,-1.042677521706,0.0f, -0.617013633251,-1.033407211304,0.0f, -0.691882967949,-1.021499633789,0.0f, -0.749708354473,-1.006960868835,0.0f, -0.79925262928,-0.989797830582,0.0f, -0.841663658619,-0.969795942307,0.0f, -0.87808907032,-0.946740865707,0.0f, -0.909676492214,-0.920418143272,0.0f, -0.93757379055,-0.890613555908,0.0f, -0.962008118629,-0.856050789356,0.0f, -0.983206510544,-0.815453350544,0.0f, -1.001396179199,-0.767545044422,0.0f, -1.016804218292,-0.711049556732,0.0f, -1.029423952103,-0.636890649796,0.0f, -1.039248347282,-0.535992026329,0.0f, -1.046270728111,-0.399277359247,0.0f, -1.050484061241,-0.217670500278,0.0f, -1.051888465881,-1.349482685328E-002,0.0f, -1.050484061241,0.190926194191,0.0f, -1.046270728111,0.373269081116,0.0f, -1.039248347282,0.511210441589,0.0f, -1.029423952103,0.613717556,0.0f, -1.016804218292,0.689758002758,0.0f, -1.001396059990,0.748299002647,0.0f, -0.983206450939,0.79830801487,0.0f, -0.962008118629,0.840993225574,0.0f, -0.93757379055,0.877562940121,0.0f, -0.909676492214,0.909225344658,0.0f, -0.87808907032,0.93718868494,0.0f, -0.841663658619,0.961680650711,0.0f, -0.79925262928,0.982929229736,0.0f, -0.749708354473,1.001162052155,0.0f, -0.691882967949,1.016606807709,0.0f, -0.617013692856,1.029256582260,0.0f, -0.516337633133,1.039104580879,0.0f, -0.381092071533,1.046143770218,0.0f, -0.202514111996,1.050367355347,0.0f, -2.249561250210E-003,1.051775097847,0.0f, --0.19805586338,1.050367236137,0.0f, --0.376756459475,1.046143651009,0.0f -}; - -const unsigned int cuGameIconStrokeVtxCount = sizeof(cfGameIconStrokeVtxs) / (sizeof(float) * 3); - -#endif diff --git a/src/gui/GridBackground.cpp b/src/gui/GridBackground.cpp deleted file mode 100644 index 64f7c7e..0000000 --- a/src/gui/GridBackground.cpp +++ /dev/null @@ -1,100 +0,0 @@ -#include "GridBackground.h" -#include "video/CVideo.h" -#include "video/shaders/Shader3D.h" - -static const float bgRepeat = 1000.0f; -static const float bgTexRotate = 39.0f; - -GridBackground::GridBackground(GuiImageData *img) - : GuiImage(img) -{ - colorIntensity = glm::vec4(1.0f, 1.0f, 1.0f, 0.9f); - alphaFadeOut = glm::vec4(0.0f); - distanceFadeOut = 0.15f; - - vtxCount = 4; - - //! texture and vertex coordinates - f32 *m_posVtxs = (f32*)memalign(GX2_VERTEX_BUFFER_ALIGNMENT, vtxCount * Shader3D::cuVertexAttrSize); - f32 *m_texCoords = (f32*)memalign(GX2_VERTEX_BUFFER_ALIGNMENT, vtxCount * Shader3D::cuTexCoordAttrSize); - - if(m_posVtxs) - { - int i = 0; - m_posVtxs[i++] = -1.0f; m_posVtxs[i++] = 0.0f; m_posVtxs[i++] = 1.0f; - m_posVtxs[i++] = 1.0f; m_posVtxs[i++] = 0.0f; m_posVtxs[i++] = 1.0f; - m_posVtxs[i++] = 1.0f; m_posVtxs[i++] = 0.0f; m_posVtxs[i++] = -1.0f; - m_posVtxs[i++] = -1.0f; m_posVtxs[i++] = 0.0f; m_posVtxs[i++] = -1.0f; - GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, m_posVtxs, vtxCount * Shader3D::cuVertexAttrSize); - } - - if(m_texCoords) - { - glm::vec2 texCoordVec[4]; - texCoordVec[0][0] = -0.5f * bgRepeat; texCoordVec[0][1] = 0.5f * bgRepeat; - texCoordVec[1][0] = 0.5f * bgRepeat; texCoordVec[1][1] = 0.5f * bgRepeat; - texCoordVec[2][0] = 0.5f * bgRepeat; texCoordVec[2][1] = -0.5f * bgRepeat; - texCoordVec[3][0] = -0.5f * bgRepeat; texCoordVec[3][1] = -0.5f * bgRepeat; - - const float cosRot = cosf(DegToRad(bgTexRotate)); - const float sinRot = sinf(DegToRad(bgTexRotate)); - - glm::mat2 texRotateMtx({ - cosRot, -sinRot, - sinRot, cosRot - }); - - for(int i = 0; i < 4; i++) { - texCoordVec[i] = texRotateMtx * texCoordVec[i]; - m_texCoords[i*2 + 0] = texCoordVec[i][0]; - m_texCoords[i*2 + 1] = texCoordVec[i][1]; - } - - GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, m_texCoords, vtxCount * Shader3D::cuTexCoordAttrSize); - } - - //! assign to internal variables which are const but oh well - posVtxs = m_posVtxs; - texCoords = m_texCoords; -} - -GridBackground::~GridBackground() -{ - //! remove image so it can not be drawn anymore from this point on - imageData = NULL; - - //! main image vertexes - if(posVtxs) - { - free((void*)posVtxs); - posVtxs = NULL; - } - if(texCoords) - { - free((void*)texCoords); - texCoords = NULL; - } -} - -void GridBackground::draw(CVideo *pVideo, const glm::mat4 & modelView) -{ - //! first setup 2D GUI positions - f32 currScaleX = bgRepeat * scaleX * (f32)getWidth() * pVideo->getWidthScaleFactor(); - f32 currScaleY = 1.0f; - f32 currScaleZ = bgRepeat * scaleZ * (f32)getHeight() * pVideo->getDepthScaleFactor(); - - m_modelView = glm::scale(modelView, glm::vec3(currScaleX, currScaleY, currScaleZ)); - - colorIntensity[3] = getAlpha(); - - Shader3D::instance()->setShaders(); - Shader3D::instance()->setTextureAndSampler(imageData->getTexture(), imageData->getSampler()); - Shader3D::instance()->setProjectionMtx(pVideo->getProjectionMtx()); - Shader3D::instance()->setViewMtx(pVideo->getViewMtx()); - Shader3D::instance()->setModelViewMtx(m_modelView); - Shader3D::instance()->setDistanceFadeOut(distanceFadeOut); - Shader3D::instance()->setAlphaFadeOut(alphaFadeOut); - Shader3D::instance()->setColorIntensity(colorIntensity); - Shader3D::instance()->setAttributeBuffer(vtxCount, posVtxs, texCoords); - Shader3D::instance()->draw(GX2_PRIMITIVE_MODE_QUADS, vtxCount); -} diff --git a/src/gui/GridBackground.h b/src/gui/GridBackground.h deleted file mode 100644 index 198506a..0000000 --- a/src/gui/GridBackground.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef _GRID_BACKGROUND_H_ -#define _GRID_BACKGROUND_H_ - -#include "GuiImage.h" -#include "video/shaders/Shader.h" - -class GridBackground : public GuiImage -{ -public: - GridBackground(GuiImageData *imgData); - virtual ~GridBackground(); - - void setColorIntensity(const glm::vec4 & color) { - colorIntensity = color; - } - const glm::vec4 & getColorIntensity() const { - return colorIntensity; - } - void setDistanceFadeOut(const float & a) { - distanceFadeOut = a; - } - void draw(CVideo *pVideo, const glm::mat4 & modelView); -private: - glm::mat4 m_modelView; - glm::vec4 colorIntensity; - glm::vec4 alphaFadeOut; - float distanceFadeOut; -}; - -#endif // _GRID_BACKGROUND_H_ diff --git a/src/gui/Gui.h b/src/gui/Gui.h deleted file mode 100644 index fb841c5..0000000 --- a/src/gui/Gui.h +++ /dev/null @@ -1,30 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#ifndef __GUI_H -#define __GUI_H - -#include "GuiElement.h" -#include "GuiImageData.h" -#include "GuiImage.h" -#include "GuiFrame.h" -#include "GuiController.h" -#include "GuiText.h" -#include "GuiSound.h" -#include "GuiButton.h" -#include "GuiTrigger.h" - -#endif diff --git a/src/gui/GuiButton.cpp b/src/gui/GuiButton.cpp deleted file mode 100644 index bd5c6ee..0000000 --- a/src/gui/GuiButton.cpp +++ /dev/null @@ -1,290 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#include "GuiButton.h" -#include "GuiController.h" - -/** - * Constructor for the GuiButton class. - */ - -GuiButton::GuiButton(f32 w, f32 h) -{ - width = w; - height = h; - image = NULL; - imageOver = NULL; - imageHold = NULL; - imageClick = NULL; - icon = NULL; - iconOver = NULL; - - for(int i = 0; i < 4; i++) - { - label[i] = NULL; - labelOver[i] = NULL; - labelHold[i] = NULL; - labelClick[i] = NULL; - } - for(int i = 0; i < iMaxGuiTriggers; i++) - { - trigger[i] = NULL; - } - - soundOver = NULL; - soundHold = NULL; - soundClick = NULL; - clickedTrigger = NULL; - heldTrigger = NULL; - selectable = true; - holdable = false; - clickable = true; -} - -/** - * Destructor for the GuiButton class. - */ -GuiButton::~GuiButton() -{ -} - -void GuiButton::setImage(GuiImage* img) -{ - image = img; - if(img) img->setParent(this); -} -void GuiButton::setImageOver(GuiImage* img) -{ - imageOver = img; - if(img) img->setParent(this); -} -void GuiButton::setImageHold(GuiImage* img) -{ - imageHold = img; - if(img) img->setParent(this); -} -void GuiButton::setImageClick(GuiImage* img) -{ - imageClick = img; - if(img) img->setParent(this); -} -void GuiButton::setIcon(GuiImage* img) -{ - icon = img; - if(img) img->setParent(this); -} -void GuiButton::setIconOver(GuiImage* img) -{ - iconOver = img; - if(img) img->setParent(this); -} - -void GuiButton::setLabel(GuiText* txt, int n) -{ - label[n] = txt; - if(txt) txt->setParent(this); -} -void GuiButton::setLabelOver(GuiText* txt, int n) -{ - labelOver[n] = txt; - if(txt) txt->setParent(this); -} -void GuiButton::setLabelHold(GuiText* txt, int n) -{ - labelHold[n] = txt; - if(txt) txt->setParent(this); -} -void GuiButton::setLabelClick(GuiText* txt, int n) -{ - labelClick[n] = txt; - if(txt) txt->setParent(this); -} -void GuiButton::setSoundOver(GuiSound * snd) -{ - soundOver = snd; -} -void GuiButton::setSoundHold(GuiSound * snd) -{ - soundHold = snd; -} - -void GuiButton::setSoundClick(GuiSound * snd) -{ - soundClick = snd; -} - -void GuiButton::setTrigger(GuiTrigger * t, int idx) -{ - if(idx >= 0 && idx < iMaxGuiTriggers) - { - trigger[idx] = t; - } - else - { - for(int i = 0; i < iMaxGuiTriggers; i++) - { - if(!trigger[i]) - { - trigger[i] = t; - break; - } - } - } -} - -void GuiButton::resetState(void) -{ - clickedTrigger = NULL; - heldTrigger = NULL; - GuiElement::resetState(); -} - -/** - * Draw the button on screen - */ -void GuiButton::draw(CVideo *v) -{ - if(!this->isVisible()) - return; - - // draw image - if(isStateSet(STATE_OVER | STATE_SELECTED | STATE_CLICKED | STATE_HELD) && imageOver) - imageOver->draw(v); - else if(image) - image->draw(v); - - if(isStateSet(STATE_OVER | STATE_SELECTED | STATE_CLICKED | STATE_HELD) && iconOver) - iconOver->draw(v); - else if(icon) - icon->draw(v); - - // draw text - for(int i = 0; i < 4; i++) - { - if(isStateSet(STATE_OVER | STATE_SELECTED | STATE_CLICKED | STATE_HELD) && labelOver[i]) - labelOver[i]->draw(v); - else if(label[i]) - label[i]->draw(v); - } -} - -void GuiButton::update(GuiController * c) -{ - if(!c || isStateSet(STATE_DISABLED, c->chan) || isStateSet(STATE_HIDDEN, c->chan)) - return; - else if(parentElement && (parentElement->isStateSet(STATE_DISABLED, c->chan) || parentElement->isStateSet(STATE_HIDDEN, c->chan))) - return; - - if(selectable) - { - if(c->data.validPointer && this->isInside(c->data.x, c->data.y)) - { - if(!isStateSet(STATE_OVER, c->chan)) - { - setState(STATE_OVER, c->chan); - - //if(this->isRumbleActive()) - // this->rumble(t->chan); - - if(soundOver) - soundOver->Play(); - - if(effectsOver && !effects) - { - // initiate effects - effects = effectsOver; - effectAmount = effectAmountOver; - effectTarget = effectTargetOver; - } - - pointedOn(this, c); - } - } - else if(isStateSet(STATE_OVER, c->chan)) - { - this->clearState(STATE_OVER, c->chan); - pointedOff(this, c); - - if(effectTarget == effectTargetOver && effectAmount == effectAmountOver) - { - // initiate effects (in reverse) - effects = effectsOver; - effectAmount = -effectAmountOver; - effectTarget = 100; - } - } - } - - for(int i = 0; i < iMaxGuiTriggers; i++) - { - if(!trigger[i]) - continue; - - // button triggers - if(clickable) - { - bool isClicked = trigger[i]->clicked(c); - - if( !clickedTrigger && isClicked - && (trigger[i]->isClickEverywhere() || (isStateSet(STATE_SELECTED | STATE_OVER, c->chan) && trigger[i]->isSelectionClickEverywhere()) || this->isInside(c->data.x, c->data.y))) - { - if(soundClick) - soundClick->Play(); - - clickedTrigger = trigger[i]; - - if(!isStateSet(STATE_CLICKED, c->chan)) - setState(STATE_CLICKED, c->chan); - - clicked(this, c, trigger[i]); - } - else if(isStateSet(STATE_CLICKED, c->chan) && (clickedTrigger == trigger[i]) && !isStateSet(STATE_HELD, c->chan) && !trigger[i]->held(c) && (!isClicked || trigger[i]->released(c))) - { - clickedTrigger = NULL; - clearState(STATE_CLICKED, c->chan); - released(this, c, trigger[i]); - } - } - - if(holdable) - { - bool isHeld = trigger[i]->held(c); - - if( (!heldTrigger || heldTrigger == trigger[i]) && isHeld - && (trigger[i]->isHoldEverywhere() || (isStateSet(STATE_SELECTED | STATE_OVER, c->chan) && trigger[i]->isSelectionClickEverywhere()) || this->isInside(c->data.x, c->data.y))) - { - heldTrigger = trigger[i]; - - if(!isStateSet(STATE_HELD, c->chan)) - setState(STATE_HELD, c->chan); - - held(this, c, trigger[i]); - } - else if(isStateSet(STATE_HELD, c->chan) && (heldTrigger == trigger[i]) && (!isHeld || trigger[i]->released(c))) - { - //! click is removed at this point and converted to held - if(clickedTrigger == trigger[i]) - { - clickedTrigger = NULL; - clearState(STATE_CLICKED, c->chan); - } - heldTrigger = NULL; - clearState(STATE_HELD, c->chan); - released(this, c, trigger[i]); - } - } - } -} diff --git a/src/gui/GuiButton.h b/src/gui/GuiButton.h deleted file mode 100644 index 7755812..0000000 --- a/src/gui/GuiButton.h +++ /dev/null @@ -1,117 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#ifndef GUI_BUTTON_H_ -#define GUI_BUTTON_H_ - -#include "GuiElement.h" -#include "GuiText.h" -#include "GuiController.h" -#include "GuiImage.h" -#include "GuiSound.h" -#include "GuiTrigger.h" - -//!Display, manage, and manipulate buttons in the GUI. Buttons can have images, icons, text, and sound set (all of which are optional) -class GuiButton : public GuiElement -{ - public: - //!Constructor - //!\param w Width - //!\param h Height - GuiButton(f32 w, f32 h); - //!Destructor - virtual ~GuiButton(); - //!Sets the button's image - //!\param i Pointer to GuiImage object - void setImage(GuiImage* i); - //!Sets the button's image on over - //!\param i Pointer to GuiImage object - void setImageOver(GuiImage* i); - - void setIcon(GuiImage* i); - void setIconOver(GuiImage* i); - //!Sets the button's image on hold - //!\param i Pointer to GuiImage object - void setImageHold(GuiImage* i); - //!Sets the button's image on click - //!\param i Pointer to GuiImage object - void setImageClick(GuiImage* i); - //!Sets the button's label - //!\param t Pointer to GuiText object - //!\param n Index of label to set (optional, default is 0) - void setLabel(GuiText* t, int n = 0); - //!Sets the button's label on over (eg: different colored text) - //!\param t Pointer to GuiText object - //!\param n Index of label to set (optional, default is 0) - void setLabelOver(GuiText* t, int n = 0); - //!Sets the button's label on hold - //!\param t Pointer to GuiText object - //!\param n Index of label to set (optional, default is 0) - void setLabelHold(GuiText* t, int n = 0); - //!Sets the button's label on click - //!\param t Pointer to GuiText object - //!\param n Index of label to set (optional, default is 0) - void setLabelClick(GuiText* t, int n = 0); - //!Sets the sound to play on over - //!\param s Pointer to GuiSound object - void setSoundOver(GuiSound * s); - //!Sets the sound to play on hold - //!\param s Pointer to GuiSound object - void setSoundHold(GuiSound * s); - //!Sets the sound to play on click - //!\param s Pointer to GuiSound object - void setSoundClick(GuiSound * s); - //!Set a new GuiTrigger for the element - //!\param i Index of trigger array to set - //!\param t Pointer to GuiTrigger - void setTrigger(GuiTrigger * t, int idx = -1); - //! - void resetState(void); - //!Constantly called to draw the GuiButton - void draw(CVideo *video); - //!Constantly called to allow the GuiButton to respond to updated input data - //!\param t Pointer to a GuiTrigger, containing the current input data from PAD/WPAD - void update(GuiController * c); - - sigslot::signal2 selected; - sigslot::signal2 deSelected; - sigslot::signal2 pointedOn; - sigslot::signal2 pointedOff; - sigslot::signal3 clicked; - sigslot::signal3 held; - sigslot::signal3 released; - protected: - static const int iMaxGuiTriggers = 7; - - GuiImage * image; //!< Button image (default) - GuiImage * imageOver; //!< Button image for STATE_SELECTED - GuiImage * imageHold; //!< Button image for STATE_HELD - GuiImage * imageClick; //!< Button image for STATE_CLICKED - GuiImage * icon; - GuiImage * iconOver; - GuiText * label[4]; //!< Label(s) to display (default) - GuiText * labelOver[4]; //!< Label(s) to display for STATE_SELECTED - GuiText * labelHold[4]; //!< Label(s) to display for STATE_HELD - GuiText * labelClick[4]; //!< Label(s) to display for STATE_CLICKED - GuiSound * soundOver; //!< Sound to play for STATE_SELECTED - GuiSound * soundHold; //!< Sound to play for STATE_HELD - GuiSound * soundClick; //!< Sound to play for STATE_CLICKED - GuiTrigger * trigger[iMaxGuiTriggers]; //!< GuiTriggers (input actions) that this element responds to - GuiTrigger * clickedTrigger; - GuiTrigger * heldTrigger; -}; - -#endif diff --git a/src/gui/GuiCheckBox.cpp b/src/gui/GuiCheckBox.cpp deleted file mode 100644 index 73654ea..0000000 --- a/src/gui/GuiCheckBox.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2016 Maschell - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#include "GuiCheckBox.h" -#include "GuiImage.h" -#include "GuiImageData.h" -/** - * Constructor for the GuiCheckBox class. - */ - -GuiCheckBox::GuiCheckBox(bool checked) - : GuiToggle(checked,50,50) - ,checkbox_imgdata(Resources::GetImageData("checkbox.png")) - ,checkbox_img(checkbox_imgdata) - ,checkbox_selected_imgdata(Resources::GetImageData("checkbox_selected.png")) - ,checkbox_selected_img(checkbox_selected_imgdata) - ,highlighted_imgdata(Resources::GetImageData("checkbox_highlighted.png")) - ,highlighted_img(highlighted_imgdata) -{ - checkbox_selected_img.setScale(height/checkbox_selected_img.getHeight()); - checkbox_img.setScale(height/checkbox_img.getHeight()); - highlighted_img.setScale(height/highlighted_img.getHeight()); - - setImage(&checkbox_img); - setIconOver(&highlighted_img); -} - -/** - * Destructor for the GuiButton class. - */ -GuiCheckBox::~GuiCheckBox() -{ - Resources::RemoveImageData(checkbox_imgdata); - Resources::RemoveImageData(checkbox_selected_imgdata); - Resources::RemoveImageData(highlighted_imgdata); -} - - -void GuiCheckBox::update(GuiController * c){ - if(bChanged){ - if(selected){ - GuiButton::setImage(&checkbox_selected_img); - }else{ - GuiButton::setImage(&checkbox_img); - } - bChanged = false; - } - GuiToggle::update(c); -} - diff --git a/src/gui/GuiCheckBox.h b/src/gui/GuiCheckBox.h deleted file mode 100644 index f5683fc..0000000 --- a/src/gui/GuiCheckBox.h +++ /dev/null @@ -1,47 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2016 Maschell - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#ifndef GUI_CHECKBOX_H_ -#define GUI_CHECKBOX_H_ - -#include "GuiToggle.h" -#include "GuiImage.h" -#include "GuiImageData.h" - -//!A simple CheckBox -class GuiCheckBox : public GuiToggle -{ - public: - //!Constructor - //!\param checked Checked - GuiCheckBox(bool checked); - //!Destructor - virtual ~GuiCheckBox(); - protected: - - GuiImageData * checkbox_imgdata; - GuiImage checkbox_img; - - GuiImageData * checkbox_selected_imgdata; - GuiImage checkbox_selected_img; - - GuiImageData * highlighted_imgdata; - GuiImage highlighted_img; - - void update(GuiController * c); -}; - -#endif diff --git a/src/gui/GuiController.h b/src/gui/GuiController.h deleted file mode 100644 index c9cc443..0000000 --- a/src/gui/GuiController.h +++ /dev/null @@ -1,78 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#ifndef GUI_CONTROLLER_H_ -#define GUI_CONTROLLER_H_ - -#include -#include "GuiTrigger.h" - -class GuiController -{ -public: - //!Constructor - GuiController(int channel) - : chan(channel) - { - memset(&lastData, 0, sizeof(lastData)); - memset(&data, 0, sizeof(data)); - - switch(chan) - { - default: - case GuiTrigger::CHANNEL_1: - chanIdx = 0; - break; - case GuiTrigger::CHANNEL_2: - chanIdx = 1; - break; - case GuiTrigger::CHANNEL_3: - chanIdx = 2; - break; - case GuiTrigger::CHANNEL_4: - chanIdx = 3; - break; - case GuiTrigger::CHANNEL_5: - chanIdx = 4; - break; - } - } - - //!Destructor - virtual ~GuiController() {} - - virtual bool update(int width, int height) = 0; - - typedef struct - { - unsigned int buttons_h; - unsigned int buttons_d; - unsigned int buttons_r; - bool validPointer; - bool touched; - float pointerAngle; - int x; - int y; - } PadData; - - int chan; - int chanIdx; - PadData data; - PadData lastData; - -}; - -#endif diff --git a/src/gui/GuiDragListener.cpp b/src/gui/GuiDragListener.cpp deleted file mode 100644 index 796d8f2..0000000 --- a/src/gui/GuiDragListener.cpp +++ /dev/null @@ -1,82 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2016 Maschell - * based on GuiButton by dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#include "GuiDragListener.h" -#include "GuiController.h" -#include "utils/logger.h" - -/** - * Constructor for the GuiDragListener class. - */ - -GuiDragListener::GuiDragListener(f32 w,f32 h){ - width = w; - height = h; - for(int i = 0; i < iMaxGuiTriggers; i++) - { - trigger[i] = NULL; - } -} - -/** - * Destructor for the GuiDragListener class. - */ -GuiDragListener::~GuiDragListener(){ -} - -void GuiDragListener::setTrigger(GuiTrigger * t, int idx){ - if(idx >= 0 && idx < iMaxGuiTriggers) - { - trigger[idx] = t; - } - else - { - for(int i = 0; i < iMaxGuiTriggers; i++) - { - if(!trigger[i]) - { - trigger[i] = t; - break; - } - } - } -} - -void GuiDragListener::update(GuiController * c){ - if(!c || isStateSet(STATE_DISABLED|STATE_HIDDEN|STATE_DISABLE_INPUT, c->chan)) - return; - else if(parentElement && (parentElement->isStateSet(STATE_DISABLED|STATE_HIDDEN|STATE_DISABLE_INPUT, c->chan))) - return; - - for(int i = 0; i < iMaxGuiTriggers; i++){ - if(!trigger[i]){ - continue; - } - - bool isHeld = trigger[i]->held(c); - - - if(isHeld && this->isInside(c->data.x, c->data.y)){ - int dx = c->data.x - c->lastData.x; - int dy = c->data.y - c->lastData.y; - - if(dx == 0 && dy == 0) continue; - - dragged(this, c, trigger[i],dx,dy); - } - } -} diff --git a/src/gui/GuiDragListener.h b/src/gui/GuiDragListener.h deleted file mode 100644 index e0750e0..0000000 --- a/src/gui/GuiDragListener.h +++ /dev/null @@ -1,50 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2016 Maschell - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#ifndef GUI_DRAG_LISTENER_H_ -#define GUI_DRAG_LISTENER_H_ - -#include "GuiElement.h" -#include "GuiController.h" -#include "GuiTrigger.h" -#include "GuiButton.h" - -class GuiDragListener : public GuiElement -{ - public: - //!Constructor - //!\param w Width - //!\param h Height - GuiDragListener(f32 w,f32 h); - //!Destructor - virtual ~GuiDragListener(); - //!Set a new GuiTrigger for the element - //!\param i Index of trigger array to set - //!\param t Pointer to GuiTrigger - void setTrigger(GuiTrigger * t, int idx = -1); - - //!Constantly called to allow the GuiDragListener to respond to updated input data - //!\param t Pointer to a GuiTrigger, containing the current input data from PAD/WPAD - void update(GuiController * c); - - sigslot::signal5 dragged; - protected: - static const int iMaxGuiTriggers = 10; - - GuiTrigger * trigger[iMaxGuiTriggers]; //!< GuiTriggers (input actions) that this element responds to -}; - -#endif diff --git a/src/gui/GuiElement.cpp b/src/gui/GuiElement.cpp deleted file mode 100644 index e1061d9..0000000 --- a/src/gui/GuiElement.cpp +++ /dev/null @@ -1,342 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#include "GuiElement.h" - -//! TODO remove this! -static int screenwidth = 1280; -static int screenheight = 720; - -/** - * Constructor for the Object class. - */ -GuiElement::GuiElement() -{ - xoffset = 0.0f; - yoffset = 0.0f; - zoffset = 0.0f; - width = 0.0f; - height = 0.0f; - alpha = 1.0f; - scaleX = 1.0f; - scaleY = 1.0f; - scaleZ = 1.0f; - for(int i = 0; i < 4; i++) - state[i] = STATE_DEFAULT; - stateChan = -1; - parentElement = NULL; - rumble = true; - selectable = false; - clickable = false; - holdable = false; - visible = true; - yoffsetDyn = 0; - xoffsetDyn = 0; - alphaDyn = -1; - scaleDyn = 1; - effects = EFFECT_NONE; - effectAmount = 0; - effectTarget = 0; - effectsOver = EFFECT_NONE; - effectAmountOver = 0; - effectTargetOver = 0; - angle = 0.0f; - - // default alignment - align to top left - alignment = (ALIGN_CENTER | ALIGN_MIDDLE); -} - -/** - * Get the left position of the GuiElement. - * @see SetLeft() - * @return Left position in pixel. - */ -f32 GuiElement::getLeft() -{ - f32 pWidth = 0; - f32 pLeft = 0; - f32 pScaleX = 1.0f; - - if(parentElement) - { - pWidth = parentElement->getWidth(); - pLeft = parentElement->getLeft(); - pScaleX = parentElement->getScaleX(); - } - - pLeft += xoffsetDyn; - - f32 x = pLeft; - - //! TODO: the conversion from int to float and back to int is bad for performance, change that - if(alignment & ALIGN_CENTER) - { - x = pLeft + pWidth * 0.5f * pScaleX - width * 0.5f * getScaleX(); - } - else if(alignment & ALIGN_RIGHT) - { - x = pLeft + pWidth * pScaleX - width * getScaleX(); - } - - return x + xoffset; -} - -/** - * Get the top position of the GuiElement. - * @see SetTop() - * @return Top position in pixel. - */ -f32 GuiElement::getTop() -{ - f32 pHeight = 0; - f32 pTop = 0; - f32 pScaleY = 1.0f; - - if(parentElement) - { - pHeight = parentElement->getHeight(); - pTop = parentElement->getTop(); - pScaleY = parentElement->getScaleY(); - } - - pTop += yoffsetDyn; - - f32 y = pTop; - - //! TODO: the conversion from int to float and back to int is bad for performance, change that - if(alignment & ALIGN_MIDDLE) - { - y = pTop + pHeight * 0.5f * pScaleY - height * 0.5f * getScaleY(); - } - else if(alignment & ALIGN_BOTTOM) - { - y = pTop + pHeight * pScaleY - height * getScaleY(); - } - - return y + yoffset; -} - -void GuiElement::setEffect(int eff, int amount, int target) -{ - if(eff & EFFECT_SLIDE_IN) - { - // these calculations overcompensate a little - if(eff & EFFECT_SLIDE_TOP) - { - if(eff & EFFECT_SLIDE_FROM) - yoffsetDyn = (int) -getHeight()*scaleY; - else - yoffsetDyn = -screenheight; - } - else if(eff & EFFECT_SLIDE_LEFT) - { - if(eff & EFFECT_SLIDE_FROM) - xoffsetDyn = (int) -getWidth()*scaleX; - else - xoffsetDyn = -screenwidth; - } - else if(eff & EFFECT_SLIDE_BOTTOM) - { - if(eff & EFFECT_SLIDE_FROM) - yoffsetDyn = (int) getHeight()*scaleY; - else - yoffsetDyn = screenheight; - } - else if(eff & EFFECT_SLIDE_RIGHT) - { - if(eff & EFFECT_SLIDE_FROM) - xoffsetDyn = (int) getWidth()*scaleX; - else - xoffsetDyn = screenwidth; - } - } - if((eff & EFFECT_FADE) && amount > 0) - { - alphaDyn = 0; - } - else if((eff & EFFECT_FADE) && amount < 0) - { - alphaDyn = alpha; - } - effects |= eff; - effectAmount = amount; - effectTarget = target; -} - -//!Sets an effect to be enabled on wiimote cursor over -//!\param e Effect to enable -//!\param a Amount of the effect (usage varies on effect) -//!\param t Target amount of the effect (usage varies on effect) -void GuiElement::setEffectOnOver(int e, int a, int t) -{ - effectsOver |= e; - effectAmountOver = a; - effectTargetOver = t; -} - -void GuiElement::resetEffects() -{ - yoffsetDyn = 0; - xoffsetDyn = 0; - alphaDyn = -1; - scaleDyn = 1; - effects = EFFECT_NONE; - effectAmount = 0; - effectTarget = 0; - effectsOver = EFFECT_NONE; - effectAmountOver = 0; - effectTargetOver = 0; -} -void GuiElement::updateEffects() -{ - if(!this->isVisible() && parentElement) - return; - - if(effects & (EFFECT_SLIDE_IN | EFFECT_SLIDE_OUT | EFFECT_SLIDE_FROM)) - { - if(effects & EFFECT_SLIDE_IN) - { - if(effects & EFFECT_SLIDE_LEFT) - { - xoffsetDyn += effectAmount; - - if(xoffsetDyn >= 0) - { - xoffsetDyn = 0; - effects = 0; - effectFinished(this); - } - } - else if(effects & EFFECT_SLIDE_RIGHT) - { - xoffsetDyn -= effectAmount; - - if(xoffsetDyn <= 0) - { - xoffsetDyn = 0; - effects = 0; - effectFinished(this); - } - } - else if(effects & EFFECT_SLIDE_TOP) - { - yoffsetDyn += effectAmount; - - if(yoffsetDyn >= 0) - { - yoffsetDyn = 0; - effects = 0; - effectFinished(this); - } - } - else if(effects & EFFECT_SLIDE_BOTTOM) - { - yoffsetDyn -= effectAmount; - - if(yoffsetDyn <= 0) - { - yoffsetDyn = 0; - effects = 0; - effectFinished(this); - } - } - } - else - { - if(effects & EFFECT_SLIDE_LEFT) - { - xoffsetDyn -= effectAmount; - - if(xoffsetDyn <= -screenwidth) { - effects = 0; // shut off effect - effectFinished(this); - } - else if((effects & EFFECT_SLIDE_FROM) && xoffsetDyn <= -getWidth()) { - effects = 0; // shut off effect - effectFinished(this); - } - } - else if(effects & EFFECT_SLIDE_RIGHT) - { - xoffsetDyn += effectAmount; - - if(xoffsetDyn >= screenwidth) { - effects = 0; // shut off effect - effectFinished(this); - } - else if((effects & EFFECT_SLIDE_FROM) && xoffsetDyn >= getWidth()*scaleX) { - effects = 0; // shut off effect - effectFinished(this); - } - } - else if(effects & EFFECT_SLIDE_TOP) - { - yoffsetDyn -= effectAmount; - - if(yoffsetDyn <= -screenheight) { - effects = 0; // shut off effect - effectFinished(this); - } - else if((effects & EFFECT_SLIDE_FROM) && yoffsetDyn <= -getHeight()) { - effects = 0; // shut off effect - effectFinished(this); - } - } - else if(effects & EFFECT_SLIDE_BOTTOM) - { - yoffsetDyn += effectAmount; - - if(yoffsetDyn >= screenheight) { - effects = 0; // shut off effect - effectFinished(this); - } - else if((effects & EFFECT_SLIDE_FROM) && yoffsetDyn >= getHeight()) { - effects = 0; // shut off effect - effectFinished(this); - } - } - } - } - else if(effects & EFFECT_FADE) - { - alphaDyn += effectAmount * (1.0f / 255.0f); - - if(effectAmount < 0 && alphaDyn <= 0) - { - alphaDyn = 0; - effects = 0; // shut off effect - effectFinished(this); - } - else if(effectAmount > 0 && alphaDyn >= alpha) - { - alphaDyn = alpha; - effects = 0; // shut off effect - effectFinished(this); - } - } - else if(effects & EFFECT_SCALE) - { - scaleDyn += effectAmount * 0.01f; - - if((effectAmount < 0 && scaleDyn <= (effectTarget * 0.01f)) - || (effectAmount > 0 && scaleDyn >= (effectTarget * 0.01f))) - { - scaleDyn = effectTarget * 0.01f; - effects = 0; // shut off effect - effectFinished(this); - } - } -} diff --git a/src/gui/GuiElement.h b/src/gui/GuiElement.h deleted file mode 100644 index 941818a..0000000 --- a/src/gui/GuiElement.h +++ /dev/null @@ -1,528 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#ifndef GUI_ELEMENT_H_ -#define GUI_ELEMENT_H_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "common/types.h" -#include "sigslot.h" -#include "glm/glm.hpp" -#include "glm/gtc/matrix_transform.hpp" - -#include "resources/Resources.h" -#include "system/AsyncDeleter.h" -#include "utils/logger.h" - -enum -{ - EFFECT_NONE = 0x00, - EFFECT_SLIDE_TOP = 0x01, - EFFECT_SLIDE_BOTTOM = 0x02, - EFFECT_SLIDE_RIGHT = 0x04, - EFFECT_SLIDE_LEFT = 0x08, - EFFECT_SLIDE_IN = 0x10, - EFFECT_SLIDE_OUT = 0x20, - EFFECT_SLIDE_FROM = 0x40, - EFFECT_FADE = 0x80, - EFFECT_SCALE = 0x100, - EFFECT_COLOR_TRANSITION = 0x200 -}; - -enum -{ - ALIGN_LEFT = 0x01, - ALIGN_CENTER = 0x02, - ALIGN_RIGHT = 0x04, - ALIGN_TOP = 0x10, - ALIGN_MIDDLE = 0x20, - ALIGN_BOTTOM = 0x40, - ALIGN_TOP_LEFT = ALIGN_LEFT | ALIGN_TOP, - ALIGN_TOP_CENTER = ALIGN_CENTER | ALIGN_TOP, - ALIGN_TOP_RIGHT = ALIGN_RIGHT | ALIGN_TOP, - ALIGN_CENTERED = ALIGN_CENTER | ALIGN_MIDDLE, -}; - -//!Forward declaration -class GuiController; -class CVideo; - -//!Primary GUI class. Most other classes inherit from this class. -class GuiElement : public AsyncDeleter::Element -{ - public: - //!Constructor - GuiElement(); - //!Destructor - virtual ~GuiElement() {} - //!Set the element's parent - //!\param e Pointer to parent element - virtual void setParent(GuiElement * e) { parentElement = e; } - //!Gets the element's parent - //!\return Pointer to parent element - virtual GuiElement * getParent() { return parentElement; } - //!Gets the current leftmost coordinate of the element - //!Considers horizontal alignment, x offset, width, and parent element's GetLeft() / GetWidth() values - //!\return left coordinate - virtual f32 getLeft(); - //!Gets the current topmost coordinate of the element - //!Considers vertical alignment, y offset, height, and parent element's GetTop() / GetHeight() values - //!\return top coordinate - virtual f32 getTop(); - //!Gets the current Z coordinate of the element - //!\return Z coordinate - virtual f32 getDepth() - { - f32 zParent = 0.0f; - - if(parentElement) - zParent = parentElement->getDepth(); - - return zParent+zoffset; - } - - virtual f32 getCenterX(void) - { - f32 pCenterX = 0.0f; - - if(parentElement) - pCenterX = parentElement->getCenterX(); - - pCenterX += xoffset + xoffsetDyn; - - if(alignment & ALIGN_LEFT) - { - f32 pWidth = 0.0f; - f32 pScale = 0.0f; - - if(parentElement) - { - pWidth = parentElement->getWidth(); - pScale = parentElement->getScaleX(); - } - - pCenterX -= pWidth * 0.5f * pScale - width * 0.5f * getScaleX(); - } - else if(alignment & ALIGN_RIGHT) - { - f32 pWidth = 0.0f; - f32 pScale = 0.0f; - - if(parentElement) - { - pWidth = parentElement->getWidth(); - pScale = parentElement->getScaleX(); - } - - pCenterX += pWidth * 0.5f * pScale - width * 0.5f * getScaleX(); - } - return pCenterX; - } - - virtual f32 getCenterY(void) - { - f32 pCenterY = 0.0f; - - if(parentElement) - pCenterY = parentElement->getCenterY(); - - pCenterY += yoffset + yoffsetDyn; - - if(alignment & ALIGN_TOP) - { - f32 pHeight = 0.0f; - f32 pScale = 0.0f; - - if(parentElement) - { - pHeight = parentElement->getHeight(); - pScale = parentElement->getScaleY(); - } - - pCenterY += pHeight * 0.5f * pScale - height * 0.5f * getScaleY(); - } - else if(alignment & ALIGN_BOTTOM) - { - f32 pHeight = 0.0f; - f32 pScale = 0.0f; - - if(parentElement) - { - pHeight = parentElement->getHeight(); - pScale = parentElement->getScaleY(); - } - - pCenterY -= pHeight * 0.5f * pScale - height * 0.5f * getScaleY(); - } - return pCenterY; - } - //!Gets elements xoffset - virtual f32 getOffsetX() { return xoffset; } - //!Gets elements yoffset - virtual f32 getOffsetY() { return yoffset; } - //!Gets the current width of the element. Does not currently consider the scale - //!\return width - virtual f32 getWidth() { return width; }; - //!Gets the height of the element. Does not currently consider the scale - //!\return height - virtual f32 getHeight() { return height; } - //!Sets the size (width/height) of the element - //!\param w Width of element - //!\param h Height of element - virtual void setSize(f32 w, f32 h) - { - width = w; - height = h; - } - //!Sets the element's visibility - //!\param v Visibility (true = visible) - virtual void setVisible(bool v) - { - visible = v; - visibleChanged(this, v); - } - //!Checks whether or not the element is visible - //!\return true if visible, false otherwise - virtual bool isVisible() const { return !isStateSet(STATE_HIDDEN) && visible; }; - //!Checks whether or not the element is selectable - //!\return true if selectable, false otherwise - virtual bool isSelectable() - { - return !isStateSet(STATE_DISABLED) && selectable; - } - virtual bool isDrawOverOnlyWhenSelected() - { - return drawOverOnlyWhenSelected; - } - virtual void setdrawOverOnlyWhenSelected(bool s) { drawOverOnlyWhenSelected = s; } - //!Checks whether or not the element is clickable - //!\return true if clickable, false otherwise - virtual bool isClickable() - { - return !isStateSet(STATE_DISABLED) && clickable; - } - //!Checks whether or not the element is holdable - //!\return true if holdable, false otherwise - virtual bool isHoldable() { return !isStateSet(STATE_DISABLED) && holdable; } - //!Sets whether or not the element is selectable - //!\param s Selectable - virtual void setSelectable(bool s) { selectable = s; } - //!Sets whether or not the element is clickable - //!\param c Clickable - virtual void setClickable(bool c) { clickable = c; } - //!Sets whether or not the element is holdable - //!\param c Holdable - virtual void setHoldable(bool d) { holdable = d; } - //!Sets the element's state - //!\param s State (STATE_DEFAULT, STATE_SELECTED, STATE_CLICKED, STATE_DISABLED) - //!\param c Controller channel (0-3, -1 = none) - virtual void setState(int s, int c = -1) - { - if(c >= 0 && c < 4) - { - state[c] |= s; - } - else - { - for(int i = 0; i < 4; i++) - state[i] |= s; - } - stateChan = c; - stateChanged(this, s, c); - } - virtual void clearState(int s, int c = -1) - { - if(c >= 0 && c < 4) - { - state[c] &= ~s; - } - else - { - for(int i = 0; i < 4; i++) - state[i] &= ~s; - } - stateChan = c; - stateChanged(this, s, c); - } - virtual bool isStateSet(int s, int c = -1) const - { - if(c >= 0 && c < 4) - { - return (state[c] & s) != 0; - } - else - { - for(int i = 0; i < 4; i++) - if((state[i] & s) != 0) - return true; - - return false; - } - } - //!Gets the element's current state - //!\return state - virtual int getState(int c = 0) { return state[c]; }; - //!Gets the controller channel that last changed the element's state - //!\return Channel number (0-3, -1 = no channel) - virtual int getStateChan() { return stateChan; }; - //!Resets the element's state to STATE_DEFAULT - virtual void resetState() - { - for(int i = 0; i < 4; i++) - state[i] = STATE_DEFAULT; - stateChan = -1; - } - //!Sets the element's alpha value - //!\param a alpha value - virtual void setAlpha(f32 a) { alpha = a; } - //!Gets the element's alpha value - //!Considers alpha, alphaDyn, and the parent element's getAlpha() value - //!\return alpha - virtual f32 getAlpha() - { - f32 a; - - if(alphaDyn >= 0) - a = alphaDyn; - else - a = alpha; - - if(parentElement) - a = (a * parentElement->getAlpha()); - - return a; - } - //!Sets the element's scale - //!\param s scale (1 is 100%) - virtual void setScale(float s) - { - scaleX = s; - scaleY = s; - scaleZ = s; - } - //!Sets the element's scale - //!\param s scale (1 is 100%) - virtual void setScaleX(float s) { scaleX = s; } - //!Sets the element's scale - //!\param s scale (1 is 100%) - virtual void setScaleY(float s) { scaleY = s; } - //!Sets the element's scale - //!\param s scale (1 is 100%) - virtual void setScaleZ(float s) { scaleZ = s; } - //!Gets the element's current scale - //!Considers scale, scaleDyn, and the parent element's getScale() value - virtual float getScale() - { - float s = 0.5f * (scaleX+scaleY) * scaleDyn; - - if(parentElement) - s *= parentElement->getScale(); - - return s; - } - //!Gets the element's current scale - //!Considers scale, scaleDyn, and the parent element's getScale() value - virtual float getScaleX() - { - float s = scaleX * scaleDyn; - - if(parentElement) - s *= parentElement->getScaleX(); - - return s; - } - //!Gets the element's current scale - //!Considers scale, scaleDyn, and the parent element's getScale() value - virtual float getScaleY() - { - float s = scaleY * scaleDyn; - - if(parentElement) - s *= parentElement->getScaleY(); - - return s; - } - //!Gets the element's current scale - //!Considers scale, scaleDyn, and the parent element's getScale() value - virtual float getScaleZ() - { - float s = scaleZ; - - if(parentElement) - s *= parentElement->getScaleZ(); - - return s; - } - //!Checks whether rumble was requested by the element - //!\return true is rumble was requested, false otherwise - virtual bool isRumbleActive() { return rumble; } - //!Sets whether or not the element is requesting a rumble event - //!\param r true if requesting rumble, false if not - virtual void setRumble(bool r) { rumble = r; } - //!Set an effect for the element - //!\param e Effect to enable - //!\param a Amount of the effect (usage varies on effect) - //!\param t Target amount of the effect (usage varies on effect) - virtual void setEffect(int e, int a, int t=0); - //!Sets an effect to be enabled on wiimote cursor over - //!\param e Effect to enable - //!\param a Amount of the effect (usage varies on effect) - //!\param t Target amount of the effect (usage varies on effect) - virtual void setEffectOnOver(int e, int a, int t=0); - //!Shortcut to SetEffectOnOver(EFFECT_SCALE, 4, 110) - virtual void setEffectGrow() { setEffectOnOver(EFFECT_SCALE, 4, 110); } - //!Reset all applied effects - virtual void resetEffects(); - //!Gets the current element effects - //!\return element effects - virtual int getEffect() const { return effects; } - //!\return true if element animation is on going - virtual bool isAnimated() const { return (parentElement != 0) && (getEffect() > 0); } - //!Checks whether the specified coordinates are within the element's boundaries - //!\param x X coordinate - //!\param y Y coordinate - //!\return true if contained within, false otherwise - virtual bool isInside(f32 x, f32 y) - { - return ( x > (this->getCenterX() - getScaleX() * getWidth() * 0.5f) - && x < (this->getCenterX() + getScaleX() * getWidth() * 0.5f) - && y > (this->getCenterY() - getScaleY() * getHeight() * 0.5f) - && y < (this->getCenterY() + getScaleY() * getHeight() * 0.5f)); - } - //!Sets the element's position - //!\param x X coordinate - //!\param y Y coordinate - virtual void setPosition(f32 x, f32 y) - { - xoffset = x; - yoffset = y; - } - //!Sets the element's position - //!\param x X coordinate - //!\param y Y coordinate - //!\param z Z coordinate - virtual void setPosition(f32 x, f32 y, f32 z) - { - xoffset = x; - yoffset = y; - zoffset = z; - } - //!Gets whether or not the element is in STATE_SELECTED - //!\return true if selected, false otherwise - virtual int getSelected() { return -1; } - //!Sets the element's alignment respective to its parent element - //!Bitwise ALIGN_LEFT | ALIGN_RIGHT | ALIGN_CENTRE, ALIGN_TOP, ALIGN_BOTTOM, ALIGN_MIDDLE) - //!\param align Alignment - virtual void setAlignment(int a) { alignment = a; } - //!Gets the element's alignment - virtual int getAlignment() const { return alignment; } - //!Angle of the object - virtual void setAngle(f32 a) { angle = a; } - //!Angle of the object - virtual f32 getAngle() const { f32 r_angle = angle; if(parentElement) r_angle += parentElement->getAngle(); return r_angle; } - //!Called constantly to allow the element to respond to the current input data - //!\param t Pointer to a GuiController, containing the current input data from PAD/WPAD/VPAD - virtual void update(GuiController * t) { } - //!Called constantly to redraw the element - virtual void draw(CVideo * v) { } - //!Called constantly to process stuff in the element - virtual void process() { } - - //!Updates the element's effects (dynamic values) - //!Called by Draw(), used for animation purposes - virtual void updateEffects(); - - typedef struct _POINT { - s32 x; - s32 y; - } POINT; - - enum - { - STATE_DEFAULT = 0, - STATE_SELECTED = 0x01, - STATE_CLICKED = 0x02, - STATE_HELD = 0x04, - STATE_OVER = 0x08, - STATE_HIDDEN = 0x10, - STATE_DISABLE_INPUT = 0x20, - STATE_CLICKED_TOUCH = 0x40, - STATE_DISABLED = 0x80 - }; - - //! Switch pointer from control to screen position - POINT PtrToScreen(POINT p) - { - //! TODO for 3D - //POINT r = { p.x + getLeft(), p.y + getTop() }; - return p; - } - //! Switch pointer screen to control position - POINT PtrToControl(POINT p) - { - //! TODO for 3D - //POINT r = { p.x - getLeft(), p.y - getTop() }; - return p; - } - //! Signals - sigslot::signal2 visibleChanged; - sigslot::signal3 stateChanged; - sigslot::signal1 effectFinished; - protected: - f32 xoffset; //!< Element X offset - f32 yoffset; //!< Element Y offset - bool rumble; //!< Wiimote rumble (on/off) - set to on when this element requests a rumble event - bool visible; //!< Visibility of the element. If false, Draw() is skipped - bool selectable; //!< Whether or not this element selectable (can change to SELECTED state) - bool clickable; //!< Whether or not this element is clickable (can change to CLICKED state) - bool holdable; //!< Whether or not this element is holdable (can change to HELD state) - bool drawOverOnlyWhenSelected; //!< Whether or not this element is holdable (can change to HELD state) - f32 width; //!< Element width - f32 height; //!< Element height - f32 zoffset; //!< Element Z offset - f32 alpha; //!< Element alpha value (0-255) - f32 angle; //!< Angle of the object (0-360) - f32 scaleX; //!< Element scale (1 = 100%) - f32 scaleY; //!< Element scale (1 = 100%) - f32 scaleZ; //!< Element scale (1 = 100%) - int alignment; //!< Horizontal element alignment, respective to parent element - int state[4]; //!< Element state (DEFAULT, SELECTED, CLICKED, DISABLED) - int stateChan; //!< Which controller channel is responsible for the last change in state - GuiElement * parentElement; //!< Parent element - - //! TODO: Move me to some Animator class - int xoffsetDyn; //!< Element X offset, dynamic (added to xoffset value for animation effects) - int yoffsetDyn; //!< Element Y offset, dynamic (added to yoffset value for animation effects) - f32 alphaDyn; //!< Element alpha, dynamic (multiplied by alpha value for blending/fading effects) - f32 scaleDyn; //!< Element scale, dynamic (multiplied by alpha value for blending/fading effects) - int effects; //!< Currently enabled effect(s). 0 when no effects are enabled - int effectAmount; //!< Effect amount. Used by different effects for different purposes - int effectTarget; //!< Effect target amount. Used by different effects for different purposes - int effectsOver; //!< Effects to enable when wiimote cursor is over this element. Copied to effects variable on over event - int effectAmountOver; //!< EffectAmount to set when wiimote cursor is over this element - int effectTargetOver; //!< EffectTarget to set when wiimote cursor is over this element -}; - -#endif diff --git a/src/gui/GuiFrame.cpp b/src/gui/GuiFrame.cpp deleted file mode 100644 index 77552c8..0000000 --- a/src/gui/GuiFrame.cpp +++ /dev/null @@ -1,267 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#include "GuiFrame.h" - -GuiFrame::GuiFrame(GuiFrame *p) -{ - parent = p; - width = 0; - height = 0; - dim = false; - - if(parent) - parent->append(this); -} - -GuiFrame::GuiFrame(f32 w, f32 h, GuiFrame *p) -{ - parent = p; - width = w; - height = h; - dim = false; - - if(parent) - parent->append(this); -} - -GuiFrame::~GuiFrame() -{ - closing(this); - - if(parent) - parent->remove(this); -} - -void GuiFrame::append(GuiElement* e) -{ - if (e == NULL) - return; - - e->setParent(this); - - ListChangeElement elem; - elem.addElement = true; - elem.position = -1; - elem.element = e; - - queueMutex.lock(); - listChangeQueue.push(elem); - queueMutex.unlock(); -} - -void GuiFrame::insert(GuiElement* e, u32 index) -{ - if (e == NULL || (index >= elements.size())) - return; - - e->setParent(this); - - ListChangeElement elem; - elem.addElement = true; - elem.position = index; - elem.element = e; - - queueMutex.lock(); - listChangeQueue.push(elem); - queueMutex.unlock(); -} - -void GuiFrame::remove(GuiElement* e) -{ - if (e == NULL) - return; - - ListChangeElement elem; - elem.addElement = false; - elem.position = -1; - elem.element = e; - - queueMutex.lock(); - listChangeQueue.push(elem); - queueMutex.unlock(); -} - -void GuiFrame::removeAll() -{ - elements.clear(); -} - -void GuiFrame::close() -{ - //Application::instance()->pushForDelete(this); -} - -void GuiFrame::dimBackground(bool d) -{ - dim = d; -} - -GuiElement* GuiFrame::getGuiElementAt(u32 index) const -{ - if (index >= elements.size()) - return NULL; - return elements[index]; -} - -u32 GuiFrame::getSize() -{ - return elements.size(); -} - -void GuiFrame::resetState() -{ - GuiElement::resetState(); - - for (u32 i = 0; i < elements.size(); ++i) - { - elements[i]->resetState(); - } -} - -void GuiFrame::setState(int s, int c) -{ - GuiElement::setState(s, c); - - for (u32 i = 0; i < elements.size(); ++i) - { - elements[i]->setState(s, c); - } -} - -void GuiFrame::clearState(int s, int c) -{ - GuiElement::clearState(s, c); - - for (u32 i = 0; i < elements.size(); ++i) - { - elements[i]->clearState(s, c); - } -} - -void GuiFrame::setVisible(bool v) -{ - visible = v; - - for (u32 i = 0; i < elements.size(); ++i) - { - elements[i]->setVisible(v); - } -} - -int GuiFrame::getSelected() -{ - // find selected element - int found = -1; - for (u32 i = 0; i < elements.size(); ++i) - { - if(elements[i]->isStateSet(STATE_SELECTED | STATE_OVER)) - { - found = i; - break; - } - } - return found; -} - -void GuiFrame::draw(CVideo * v) -{ - if(!this->isVisible() && parentElement) - return; - - if(parentElement && dim == true) - { - //GXColor dimColor = (GXColor){0, 0, 0, 0x70}; - //Menu_DrawRectangle(0, 0, GetZPosition(), screenwidth,screenheight, &dimColor, false, true); - } - - //! render appended items next frame but allow stop of render if size is reached - u32 size = elements.size(); - - for (u32 i = 0; i < size && i < elements.size(); ++i) - { - elements[i]->draw(v); - } -} - -void GuiFrame::updateEffects() -{ - if(this->isVisible() || parentElement) - { - GuiElement::updateEffects(); - - //! render appended items next frame but allow stop of render if size is reached - u32 size = elements.size(); - - for (u32 i = 0; i < size && i < elements.size(); ++i) - { - elements[i]->updateEffects(); - } - } - - //! at the end of main loop which this function represents append pending elements - updateElementList(); -} - -void GuiFrame::update(GuiController * c) -{ - if(isStateSet(STATE_DISABLED) && parentElement) - return; - - //! update appended items next frame - u32 size = elements.size(); - - for (u32 i = 0; i < size && i < elements.size(); ++i) - { - elements[i]->update(c); - } -} - -void GuiFrame::updateElementList(void) -{ - if(listChangeQueue.empty() == false) - { - queueMutex.lock(); - while(!listChangeQueue.empty()) - { - ListChangeElement & listChange = listChangeQueue.front(); - - for (u32 i = 0; i < elements.size(); ++i) - { - if(listChange.element == elements[i]) - { - elements.erase(elements.begin()+i); - break; - } - } - - if(listChange.addElement) - { - if(listChange.position >= 0) - { - elements.insert(elements.begin()+listChange.position, listChange.element); - } - else - { - elements.push_back(listChange.element); - } - } - listChangeQueue.pop(); - } - queueMutex.unlock(); - } - -} diff --git a/src/gui/GuiFrame.h b/src/gui/GuiFrame.h deleted file mode 100644 index 2a1eeee..0000000 --- a/src/gui/GuiFrame.h +++ /dev/null @@ -1,107 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#ifndef GUI_FRAME_H_ -#define GUI_FRAME_H_ - -#include -#include "GuiElement.h" -#include "sigslot.h" - -//!Allows GuiElements to be grouped together into a "window" -class GuiFrame : public GuiElement -{ - public: - //!Constructor - GuiFrame(GuiFrame *parent = 0); - //!\overload - //!\param w Width of window - //!\param h Height of window - GuiFrame(f32 w, f32 h, GuiFrame *parent = 0); - //!Destructor - virtual ~GuiFrame(); - //!Appends a GuiElement to the GuiFrame - //!\param e The GuiElement to append. If it is already in the GuiFrame, it is removed first - void append(GuiElement* e); - //!Inserts a GuiElement into the GuiFrame at the specified index - //!\param e The GuiElement to insert. If it is already in the GuiFrame, it is removed first - //!\param i Index in which to insert the element - void insert(GuiElement* e, u32 i); - //!Removes the specified GuiElement from the GuiFrame - //!\param e GuiElement to be removed - void remove(GuiElement* e); - //!Removes all GuiElements - void removeAll(); - //!Bring element to front of the window - void bringToFront(GuiElement *e) { remove(e); append(e); } - //!Returns the GuiElement at the specified index - //!\param index The index of the element - //!\return A pointer to the element at the index, NULL on error (eg: out of bounds) - GuiElement* getGuiElementAt(u32 index) const; - //!Returns the size of the list of elements - //!\return The size of the current element list - u32 getSize(); - //!Sets the visibility of the window - //!\param v visibility (true = visible) - void setVisible(bool v); - //!Resets the window's state to STATE_DEFAULT - void resetState(); - //!Sets the window's state - //!\param s State - void setState(int s, int c = -1); - void clearState(int s, int c = -1); - //!Gets the index of the GuiElement inside the window that is currently selected - //!\return index of selected GuiElement - int getSelected(); - //!Dim the Window's background - void dimBackground(bool d); - //!Draws all the elements in this GuiFrame - void draw(CVideo * v); - //!Updates the window and all elements contains within - //!Allows the GuiFrame and all elements to respond to the input data specified - //!\param t Pointer to a GuiTrigger, containing the current input data from PAD/WPAD - void update(GuiController * t); - //!virtual Close Window - this will put the object on the delete queue in MainWindow - virtual void close(); - //!virtual show window function - virtual void show() {} - //!virtual hide window function - virtual void hide() {} - //!virtual enter main loop function (blocking) - virtual void exec() {} - //!virtual updateEffects which is called by the main loop - virtual void updateEffects(); - //! Signals - //! On Closing - sigslot::signal1 closing; - protected: - bool dim; //! Enable/disable dim of a window only - GuiFrame *parent; //!< Parent Window - std::vector elements; //!< Contains all elements within the GuiFrame - - void updateElementList(void); - - struct ListChangeElement - { - bool addElement; - int position; - GuiElement *element; - }; - std::queue listChangeQueue; - CMutex queueMutex; -}; - -#endif diff --git a/src/gui/GuiImage.cpp b/src/gui/GuiImage.cpp deleted file mode 100644 index d80001d..0000000 --- a/src/gui/GuiImage.cpp +++ /dev/null @@ -1,289 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#include "GuiImage.h" -#include "video/CVideo.h" -#include "video/shaders/Texture2DShader.h" -#include "video/shaders/ColorShader.h" - -static const f32 fPiDiv180 = ((f32)M_PI / 180.0f); - -GuiImage::GuiImage(GuiImageData * img) -{ - if(img && img->getTexture()) - { - width = img->getWidth(); - height = img->getHeight(); - } - - internalInit(width, height); - imageData = img; -} - -GuiImage::GuiImage(int w, int h, const GX2Color & c, int type) -{ - internalInit(w, h); - imgType = type; - colorCount = ColorShader::cuColorVtxsSize / ColorShader::cuColorAttrSize; - - colorVtxs = (u8 *) memalign(GX2_VERTEX_BUFFER_ALIGNMENT, colorCount * ColorShader::cuColorAttrSize); - if(colorVtxs) - { - for(u32 i = 0; i < colorCount; i++) - setImageColor(c, i); - } -} - -GuiImage::GuiImage(int w, int h, const GX2Color *c, u32 color_count, int type) -{ - internalInit(w, h); - imgType = type; - colorCount = ColorShader::cuColorVtxsSize / ColorShader::cuColorAttrSize; - if(colorCount < color_count) - colorCount = color_count; - - colorVtxs = (u8 *) memalign(GX2_VERTEX_BUFFER_ALIGNMENT, colorCount * ColorShader::cuColorAttrSize); - if(colorVtxs) - { - for(u32 i = 0; i < colorCount; i++) - { - // take the last as reference if not enough colors defined - int idx = (i < color_count) ? i : (color_count - 1); - setImageColor(c[idx], i); - } - } -} - -/** - * Destructor for the GuiImage class. - */ -GuiImage::~GuiImage() -{ - if(colorVtxs) { - free(colorVtxs); - colorVtxs = NULL; - } -} - -void GuiImage::internalInit(int w, int h) -{ - imageData = NULL; - width = w; - height = h; - tileHorizontal = -1; - tileVertical = -1; - imgType = IMAGE_TEXTURE; - colorVtxsDirty = false; - colorVtxs = NULL; - colorCount = 0; - posVtxs = NULL; - texCoords = NULL; - vtxCount = 4; - primitive = GX2_PRIMITIVE_MODE_QUADS; - - imageAngle = 0.0f; - blurDirection = glm::vec3(0.0f); - positionOffsets = glm::vec3(0.0f); - scaleFactor = glm::vec3(1.0f); - colorIntensity = glm::vec4(1.0f); -} - -void GuiImage::setImageData(GuiImageData * img) -{ - imageData = img; - width = 0; - height = 0; - if(img && img->getTexture()) - { - width = img->getWidth(); - height = img->getHeight(); - } - imgType = IMAGE_TEXTURE; -} - -GX2Color GuiImage::getPixel(int x, int y) -{ - if(!imageData || this->getWidth() <= 0 || x < 0 || y < 0 || x >= this->getWidth() || y >= this->getHeight()) - return (GX2Color){0, 0, 0, 0}; - - u32 pitch = imageData->getTexture()->surface.pitch; - u32 *imagePtr = (u32*)imageData->getTexture()->surface.image; - - u32 color_u32 = imagePtr[y * pitch + x]; - GX2Color color; - color.r = (color_u32 >> 24) & 0xFF; - color.g = (color_u32 >> 16) & 0xFF; - color.b = (color_u32 >> 8) & 0xFF; - color.a = (color_u32 >> 0) & 0xFF; - return color; -} - -void GuiImage::setPixel(int x, int y, const GX2Color & color) -{ - if(!imageData || this->getWidth() <= 0 || x < 0 || y < 0 || x >= this->getWidth() || y >= this->getHeight()) - return; - - - u32 pitch = imageData->getTexture()->surface.pitch; - u32 *imagePtr = (u32*)imageData->getTexture()->surface.image; - imagePtr[y * pitch + x] = (color.r << 24) | (color.g << 16) | (color.b << 8) | (color.a << 0); -} - -void GuiImage::setImageColor(const GX2Color & c, int idx) -{ - if(!colorVtxs) { - return; - } - - if(idx >= 0 && idx < (int)colorCount) - { - colorVtxs[(idx << 2) + 0] = c.r; - colorVtxs[(idx << 2) + 1] = c.g; - colorVtxs[(idx << 2) + 2] = c.b; - colorVtxs[(idx << 2) + 3] = c.a; - colorVtxsDirty = true; - } - else if(colorVtxs) - { - for(u32 i = 0; i < (ColorShader::cuColorVtxsSize / sizeof(u8)); i += 4) - { - colorVtxs[i + 0] = c.r; - colorVtxs[i + 1] = c.g; - colorVtxs[i + 2] = c.b; - colorVtxs[i + 3] = c.a; - } - colorVtxsDirty = true; - } -} - -void GuiImage::setSize(int w, int h) -{ - width = w; - height = h; -} - -void GuiImage::setPrimitiveVertex(s32 prim, const f32 *posVtx, const f32 *texCoord, u32 vtxcount) -{ - primitive = prim; - vtxCount = vtxcount; - posVtxs = posVtx; - texCoords = texCoord; - - if(imgType == IMAGE_COLOR) - { - u8 * newColorVtxs = (u8 *) memalign(0x40, ColorShader::cuColorAttrSize * vtxCount); - - for(u32 i = 0; i < vtxCount; i++) - { - int newColorIdx = (i << 2); - int colorIdx = (i < colorCount) ? (newColorIdx) : ((colorCount - 1) << 2); - - newColorVtxs[newColorIdx + 0] = colorVtxs[colorIdx + 0]; - newColorVtxs[newColorIdx + 1] = colorVtxs[colorIdx + 1]; - newColorVtxs[newColorIdx + 2] = colorVtxs[colorIdx + 2]; - newColorVtxs[newColorIdx + 3] = colorVtxs[colorIdx + 3]; - } - - free(colorVtxs); - colorVtxs = newColorVtxs; - colorCount = vtxCount; - colorVtxsDirty = true; - } -} - -void GuiImage::draw(CVideo *pVideo) -{ - if(!this->isVisible() || tileVertical == 0 || tileHorizontal == 0) - return; - - f32 currScaleX = getScaleX(); - f32 currScaleY = getScaleY(); - - positionOffsets[0] = getCenterX() * pVideo->getWidthScaleFactor() * 2.0f; - positionOffsets[1] = getCenterY() * pVideo->getHeightScaleFactor() * 2.0f; - positionOffsets[2] = getDepth() * pVideo->getDepthScaleFactor() * 2.0f; - - scaleFactor[0] = currScaleX * getWidth() * pVideo->getWidthScaleFactor(); - scaleFactor[1] = currScaleY * getHeight() * pVideo->getHeightScaleFactor(); - scaleFactor[2] = getScaleZ(); - - //! add other colors intensities parameters - colorIntensity[3] = getAlpha(); - - //! angle of the object - imageAngle = DegToRad(getAngle()); - -// if(image && tileHorizontal > 0 && tileVertical > 0) -// { -// for(int n=0; n 0) -// { -// for(int i=0; i 0) -// { -// for(int i=0; isetShaders(); - ColorShader::instance()->setAttributeBuffer(colorVtxs, posVtxs, vtxCount); - ColorShader::instance()->setAngle(imageAngle); - ColorShader::instance()->setOffset(positionOffsets); - ColorShader::instance()->setScale(scaleFactor); - ColorShader::instance()->setColorIntensity(colorIntensity); - ColorShader::instance()->draw(primitive, vtxCount); - } - else if(imageData) - { - Texture2DShader::instance()->setShaders(); - Texture2DShader::instance()->setAttributeBuffer(texCoords, posVtxs, vtxCount); - Texture2DShader::instance()->setAngle(imageAngle); - Texture2DShader::instance()->setOffset(positionOffsets); - Texture2DShader::instance()->setScale(scaleFactor); - Texture2DShader::instance()->setColorIntensity(colorIntensity); - Texture2DShader::instance()->setBlurring(blurDirection); - Texture2DShader::instance()->setTextureAndSampler(imageData->getTexture(), imageData->getSampler()); - Texture2DShader::instance()->draw(primitive, vtxCount); - } -} diff --git a/src/gui/GuiImage.h b/src/gui/GuiImage.h deleted file mode 100644 index 88f7fbe..0000000 --- a/src/gui/GuiImage.h +++ /dev/null @@ -1,110 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#ifndef GUI_IMAGE_H_ -#define GUI_IMAGE_H_ - -#include "video/shaders/Shader.h" -#include "GuiElement.h" -#include "GuiImageData.h" - -//!Display, manage, and manipulate images in the GUI -class GuiImage : public GuiElement -{ -public: - enum ImageTypes - { - IMAGE_TEXTURE, - IMAGE_COLOR - }; - - //!\overload - //!\param img Pointer to GuiImageData element - GuiImage(GuiImageData * img); - //!\overload - //!Creates an image filled with the specified color - //!\param w Image width - //!\param h Image height - //!\param c Array with 4 x image color (BL, BR, TL, TR) - GuiImage(int w, int h, const GX2Color & c, int imgType = IMAGE_COLOR); - GuiImage(int w, int h, const GX2Color * c, u32 colorCount = 1, int imgType = IMAGE_COLOR); - //!Destructor - virtual ~GuiImage(); - //!Sets the number of times to draw the image horizontally - //!\param t Number of times to draw the image - void setTileHorizontal(int t) { tileHorizontal = t; } - //!Sets the number of times to draw the image vertically - //!\param t Number of times to draw the image - void setTileVertical(int t) { tileVertical = t; } - //!Constantly called to draw the image - void draw(CVideo *pVideo); - //!Gets the image data - //!\return pointer to image data - GuiImageData * getImageData() const { return imageData; } - //!Sets up a new image using the GuiImageData object specified - //!\param img Pointer to GuiImageData object - void setImageData(GuiImageData * img); - //!Gets the pixel color at the specified coordinates of the image - //!\param x X coordinate - //!\param y Y coordinate - GX2Color getPixel(int x, int y); - //!Sets the pixel color at the specified coordinates of the image - //!\param x X coordinate - //!\param y Y coordinate - //!\param color Pixel color - void setPixel(int x, int y, const GX2Color & color); - //!Change ImageColor - void setImageColor(const GX2Color & c, int idx = -1); - //!Change ImageColor - void setSize(int w, int h); - - void setPrimitiveVertex(s32 prim, const f32 *pos, const f32 *tex, u32 count); - - void setBlurDirection(u8 dir, f32 value) - { - if(dir < 2) { - blurDirection[dir] = value; - } - } - void setColorIntensity(const glm::vec4 & col) - { - colorIntensity = col; - } -protected: - void internalInit(int w, int h); - - int imgType; //!< Type of image data (IMAGE_TEXTURE, IMAGE_COLOR, IMAGE_DATA) - GuiImageData * imageData; //!< Poiner to image data. May be shared with GuiImageData data - int tileHorizontal; //!< Number of times to draw (tile) the image horizontally - int tileVertical; //!< Number of times to draw (tile) the image vertically - - //! Internally used variables for rendering - u8 *colorVtxs; - u32 colorCount; - bool colorVtxsDirty; - glm::vec3 positionOffsets; - glm::vec3 scaleFactor; - glm::vec4 colorIntensity; - f32 imageAngle; - glm::vec3 blurDirection; - - const f32 * posVtxs; - const f32 * texCoords; - u32 vtxCount; - s32 primitive; -}; - -#endif diff --git a/src/gui/GuiImageAsync.cpp b/src/gui/GuiImageAsync.cpp deleted file mode 100644 index 78208b9..0000000 --- a/src/gui/GuiImageAsync.cpp +++ /dev/null @@ -1,172 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#include -#include "GuiImageAsync.h" -#include "fs/fs_utils.h" - -std::vector GuiImageAsync::imageQueue; -CThread * GuiImageAsync::pThread = NULL; -CMutex * GuiImageAsync::pMutex = NULL; -u32 GuiImageAsync::threadRefCounter = 0; -bool GuiImageAsync::bExitRequested = false; -GuiImageAsync * GuiImageAsync::pInUse = NULL; - -GuiImageAsync::GuiImageAsync(const u8 *imageBuffer, const u32 & imageBufferSize, GuiImageData * preloadImg) - : GuiImage(preloadImg) - , imgData(NULL) - , imgBuffer(imageBuffer) - , imgBufferSize(imageBufferSize) -{ - threadInit(); - threadAddImage(this); -} - -GuiImageAsync::GuiImageAsync(const std::string & file, GuiImageData * preloadImg) - : GuiImage(preloadImg) - , imgData(NULL) - , filename(file) - , imgBuffer(NULL) - , imgBufferSize(0) -{ - threadInit(); - threadAddImage(this); -} - -GuiImageAsync::~GuiImageAsync() -{ - threadRemoveImage(this); - while(pInUse == this) - usleep(1000); - - if (imgData) - delete imgData; - - threadExit(); -} - -void GuiImageAsync::threadAddImage(GuiImageAsync *Image) -{ - pMutex->lock(); - imageQueue.push_back(Image); - pMutex->unlock(); - pThread->resumeThread(); -} - -void GuiImageAsync::threadRemoveImage(GuiImageAsync *image) -{ - pMutex->lock(); - for(u32 i = 0; i < imageQueue.size(); ++i) - { - if(imageQueue[i] == image) - { - imageQueue.erase(imageQueue.begin() + i); - break; - } - } - pMutex->unlock(); -} - -void GuiImageAsync::clearQueue() -{ - pMutex->lock(); - imageQueue.clear(); - pMutex->unlock(); -} - -void GuiImageAsync::guiImageAsyncThread(CThread *thread, void *arg) -{ - while(!bExitRequested) - { - if(imageQueue.empty() && !bExitRequested) - pThread->suspendThread(); - - if(!imageQueue.empty() && !bExitRequested) - { - pMutex->lock(); - pInUse = imageQueue.front(); - imageQueue.erase(imageQueue.begin()); - pMutex->unlock(); - - if (!pInUse) - continue; - - - if(pInUse->imgBuffer && pInUse->imgBufferSize) - { - pInUse->imgData = new GuiImageData(pInUse->imgBuffer, pInUse->imgBufferSize); - } - else - { - u8 *buffer = NULL; - u32 bufferSize = 0; - - int iResult = LoadFileToMem(pInUse->filename.c_str(), &buffer, &bufferSize); - if(iResult > 0) - { - pInUse->imgData = new GuiImageData(buffer, bufferSize, GX2_TEX_CLAMP_MODE_MIRROR); - - //! free original image buffer which is converted to texture now and not needed anymore - free(buffer); - } - } - - if(pInUse->imgData) - { - if(pInUse->imgData->getTexture()) - { - pInUse->width = pInUse->imgData->getWidth(); - pInUse->height = pInUse->imgData->getHeight(); - pInUse->imageData = pInUse->imgData; - } - else - { - delete pInUse->imgData; - pInUse->imgData = NULL; - } - } - - pInUse = NULL; - } - } -} - -void GuiImageAsync::threadInit() -{ - if (pThread == NULL) - { - bExitRequested = false; - pMutex = new CMutex(); - pThread = CThread::create(GuiImageAsync::guiImageAsyncThread, NULL, CThread::eAttributeAffCore1 | CThread::eAttributePinnedAff, 10); - pThread->resumeThread(); - } - - ++threadRefCounter; -} - -void GuiImageAsync::threadExit() -{ - --threadRefCounter; - - if((threadRefCounter == 0) && (pThread != NULL)) - { - bExitRequested = true; - delete pThread; - delete pMutex; - pThread = NULL; - pMutex = NULL; - } -} diff --git a/src/gui/GuiImageAsync.h b/src/gui/GuiImageAsync.h deleted file mode 100644 index 939a2c6..0000000 --- a/src/gui/GuiImageAsync.h +++ /dev/null @@ -1,57 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#ifndef _GUIIMAGEASYNC_H_ -#define _GUIIMAGEASYNC_H_ - -#include -#include "GuiImage.h" -#include "system/CThread.h" -#include "system/CMutex.h" - -class GuiImageAsync : public GuiImage -{ - public: - GuiImageAsync(const u8 *imageBuffer, const u32 & imageBufferSize, GuiImageData * preloadImg); - GuiImageAsync(const std::string & filename, GuiImageData * preloadImg); - virtual ~GuiImageAsync(); - - static void clearQueue(); - static void removeFromQueue(GuiImageAsync * image) { - threadRemoveImage(image); - } - private: - static void threadInit(); - static void threadExit(); - - GuiImageData *imgData; - std::string filename; - const u8 *imgBuffer; - const u32 imgBufferSize; - - static void guiImageAsyncThread(CThread *thread, void *arg); - static void threadAddImage(GuiImageAsync* Image); - static void threadRemoveImage(GuiImageAsync* Image); - - static std::vector imageQueue; - static CThread *pThread; - static CMutex * pMutex; - static u32 threadRefCounter; - static GuiImageAsync * pInUse; - static bool bExitRequested; -}; - -#endif /*_GUIIMAGEASYNC_H_*/ diff --git a/src/gui/GuiImageData.cpp b/src/gui/GuiImageData.cpp deleted file mode 100644 index b0c51af..0000000 --- a/src/gui/GuiImageData.cpp +++ /dev/null @@ -1,209 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#include -#include -#include "GuiImageData.h" -#include "system/memory.h" -#include "video/CVideo.h" -#include "common/gx2_ext.h" -/** - * Constructor for the GuiImageData class. - */ -GuiImageData::GuiImageData() -{ - texture = NULL; - sampler = NULL; - memoryType = eMemTypeMEM2; -} - -/** - * Constructor for the GuiImageData class. - */ -GuiImageData::GuiImageData(const u8 * img, int imgSize, GX2TexClampMode textureClamp, GX2SurfaceFormat textureFormat) -{ - texture = NULL; - sampler = NULL; - loadImage(img, imgSize, textureClamp, textureFormat); -} - -/** - * Destructor for the GuiImageData class. - */ -GuiImageData::~GuiImageData() -{ - releaseData(); -} - -void GuiImageData::releaseData(void) -{ - if(texture) { - if(texture->surface.image) - { - switch(memoryType) - { - default: - case eMemTypeMEM2: - free(texture->surface.image); - break; - case eMemTypeMEM1: - MEM1_free(texture->surface.image); - break; - case eMemTypeMEMBucket: - MEMBucket_free(texture->surface.image); - break; - } - } - delete texture; - texture = NULL; - } - if(sampler) { - delete sampler; - sampler = NULL; - } -} - -void GuiImageData::loadImage(const u8 *img, int imgSize, GX2TexClampMode textureClamp, GX2SurfaceFormat textureFormat) -{ - if(!img || (imgSize < 8)) - return; - - releaseData(); - gdImagePtr gdImg = 0; - - if (img[0] == 0xFF && img[1] == 0xD8) - { - //! not needed for now therefore comment out to safe ELF size - //! if needed uncomment, adds 200 kb to the ELF size - // IMAGE_JPEG - //gdImg = gdImageCreateFromJpegPtr(imgSize, (u8*) img); - } - else if (img[0] == 'B' && img[1] == 'M') - { - // IMAGE_BMP - //gdImg = gdImageCreateFromBmpPtr(imgSize, (u8*) img); - } - else if (img[0] == 0x89 && img[1] == 'P' && img[2] == 'N' && img[3] == 'G') - { - // IMAGE_PNG - gdImg = gdImageCreateFromPngPtr(imgSize, (u8*) img); - } - //!This must be last since it can also intefere with outher formats - else if(img[0] == 0x00) - { - // Try loading TGA image - //gdImg = gdImageCreateFromTgaPtr(imgSize, (u8*) img); - } - - if(gdImg == 0) - return; - - u32 width = (gdImageSX(gdImg)); - u32 height = (gdImageSY(gdImg)); - - //! Initialize texture - texture = new GX2Texture; - GX2InitTexture(texture, width, height, 1, 0, textureFormat, GX2_SURFACE_DIM_TEXTURE_2D, GX2_TILE_MODE_LINEAR_ALIGNED); - - //! if this fails something went horribly wrong - if(texture->surface.imageSize == 0) { - delete texture; - texture = NULL; - gdImageDestroy(gdImg); - return; - } - - //! allocate memory for the surface - memoryType = eMemTypeMEM2; - texture->surface.image = memalign(texture->surface.alignment, texture->surface.imageSize); - //! try MEM1 on failure - if(!texture->surface.image) { - memoryType = eMemTypeMEM1; - texture->surface.image = MEM1_alloc(texture->surface.imageSize, texture->surface.alignment); - } - //! try MEM bucket on failure - if(!texture->surface.image) { - memoryType = eMemTypeMEMBucket; - texture->surface.image = MEMBucket_alloc(texture->surface.imageSize, texture->surface.alignment); - } - //! check if memory is available for image - if(!texture->surface.image) { - gdImageDestroy(gdImg); - delete texture; - texture = NULL; - return; - } - //! set mip map data pointer - texture->surface.mipmaps = NULL; - //! convert image to texture - switch(textureFormat) - { - default: - case GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8: - gdImageToUnormR8G8B8A8(gdImg, (u32*)texture->surface.image, texture->surface.width, texture->surface.height, texture->surface.pitch); - break; - case GX2_SURFACE_FORMAT_UNORM_R5_G6_B5: - gdImageToUnormR5G6B5(gdImg, (u16*)texture->surface.image, texture->surface.width, texture->surface.height, texture->surface.pitch); - break; - } - - //! free memory of image as its not needed anymore - gdImageDestroy(gdImg); - - //! invalidate the memory - GX2Invalidate(GX2_INVALIDATE_MODE_CPU_TEXTURE, texture->surface.image, texture->surface.imageSize); - //! initialize the sampler - sampler = new GX2Sampler; - GX2InitSampler(sampler, textureClamp, GX2_TEX_XY_FILTER_MODE_LINEAR); -} - -void GuiImageData::gdImageToUnormR8G8B8A8(gdImagePtr gdImg, u32 *imgBuffer, u32 width, u32 height, u32 pitch) -{ - for(u32 y = 0; y < height; ++y) - { - for(u32 x = 0; x < width; ++x) - { - u32 pixel = gdImageGetPixel(gdImg, x, y); - - u8 a = 254 - 2*((u8)gdImageAlpha(gdImg, pixel)); - if(a == 254) a++; - - u8 r = gdImageRed(gdImg, pixel); - u8 g = gdImageGreen(gdImg, pixel); - u8 b = gdImageBlue(gdImg, pixel); - - imgBuffer[y * pitch + x] = (r << 24) | (g << 16) | (b << 8) | (a); - } - } -} - -//! TODO: figure out why this seems to not work correct yet -void GuiImageData::gdImageToUnormR5G6B5(gdImagePtr gdImg, u16 *imgBuffer, u32 width, u32 height, u32 pitch) -{ - for(u32 y = 0; y < height; ++y) - { - for(u32 x = 0; x < width; ++x) - { - u32 pixel = gdImageGetPixel(gdImg, x, y); - - u8 r = gdImageRed(gdImg, pixel); - u8 g = gdImageGreen(gdImg, pixel); - u8 b = gdImageBlue(gdImg, pixel); - - imgBuffer[y * pitch + x] = ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3); - } - } -} diff --git a/src/gui/GuiImageData.h b/src/gui/GuiImageData.h deleted file mode 100644 index 78781ca..0000000 --- a/src/gui/GuiImageData.h +++ /dev/null @@ -1,68 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#ifndef GUI_IMAGEDATA_H_ -#define GUI_IMAGEDATA_H_ - -#include -#include -#include -#include -#include "system/AsyncDeleter.h" - -class GuiImageData : public AsyncDeleter::Element -{ -public: - //!Constructor - GuiImageData(); - //!\param img Image data - //!\param imgSize The image size - GuiImageData(const u8 * img, int imgSize, GX2TexClampMode textureClamp = GX2_TEX_CLAMP_MODE_CLAMP, GX2SurfaceFormat textureFormat = GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8); - //!Destructor - virtual ~GuiImageData(); - //!Load image from buffer - //!\param img Image data - //!\param imgSize The image size - void loadImage(const u8 * img, int imgSize, GX2TexClampMode textureClamp = GX2_TEX_CLAMP_MODE_CLAMP, GX2SurfaceFormat textureFormat = GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8); - //! getter functions - const GX2Texture * getTexture() const { return texture; }; - const GX2Sampler * getSampler() const { return sampler; }; - //!Gets the image width - //!\return image width - int getWidth() const { if(texture) return texture->surface.width; else return 0; }; - //!Gets the image height - //!\return image height - int getHeight() const { if(texture) return texture->surface.height; else return 0; }; - //! release memory of the image data - void releaseData(void); -private: - void gdImageToUnormR8G8B8A8(gdImagePtr gdImg, u32 *imgBuffer, u32 width, u32 height, u32 pitch); - void gdImageToUnormR5G6B5(gdImagePtr gdImg, u16 *imgBuffer, u32 width, u32 height, u32 pitch); - - GX2Texture *texture; - GX2Sampler *sampler; - - enum eMemoryTypes - { - eMemTypeMEM2, - eMemTypeMEM1, - eMemTypeMEMBucket - }; - - u8 memoryType; -}; - -#endif diff --git a/src/gui/GuiMainWindowScreen.h b/src/gui/GuiMainWindowScreen.h index 0047b33..f3b3a7b 100644 --- a/src/gui/GuiMainWindowScreen.h +++ b/src/gui/GuiMainWindowScreen.h @@ -17,8 +17,7 @@ #ifndef GUI_MAIN_WINDOW_SCREEN_H_ #define GUI_MAIN_WINDOW_SCREEN_H_ -#include "Gui.h" -#include "sigslot.h" +#include class GuiMainWindowScreen : public GuiFrame { diff --git a/src/gui/GuiParticleImage.cpp b/src/gui/GuiParticleImage.cpp deleted file mode 100644 index 2cfe527..0000000 --- a/src/gui/GuiParticleImage.cpp +++ /dev/null @@ -1,128 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#include "GuiParticleImage.h" -#include "video/CVideo.h" -#include "video/shaders/ColorShader.h" - -#define CIRCLE_VERTEX_COUNT 36 - -static inline f32 getRandZeroToOneF32() -{ - return (rand() % 10000) * 0.0001f; -} - -static inline f32 getRandMinusOneToOneF32() -{ - return getRandZeroToOneF32() * 2.0f - 1.0f; -} - -GuiParticleImage::GuiParticleImage(int w, int h, u32 particleCount) - : GuiImage(NULL) -{ - width = w; - height = h; - imgType = IMAGE_COLOR; - - posVertexs = (f32 *) memalign(GX2_VERTEX_BUFFER_ALIGNMENT, ColorShader::cuVertexAttrSize * CIRCLE_VERTEX_COUNT); - colorVertexs = (u8 *) memalign(GX2_VERTEX_BUFFER_ALIGNMENT, ColorShader::cuColorAttrSize * CIRCLE_VERTEX_COUNT); - - for(u32 i = 0; i < CIRCLE_VERTEX_COUNT; i++) - { - posVertexs[i * 3 + 0] = cosf(DegToRad(i * 360.0f / CIRCLE_VERTEX_COUNT)); - posVertexs[i * 3 + 1] = sinf(DegToRad(i * 360.0f / CIRCLE_VERTEX_COUNT)); - posVertexs[i * 3 + 2] = 0.0f; - - colorVertexs[i * 4 + 0] = 0xff; - colorVertexs[i * 4 + 1] = 0xff; - colorVertexs[i * 4 + 2] = 0xff; - colorVertexs[i * 4 + 3] = 0xff; - } - GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, posVertexs, ColorShader::cuVertexAttrSize * CIRCLE_VERTEX_COUNT); - GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, colorVertexs, ColorShader::cuColorAttrSize * CIRCLE_VERTEX_COUNT); - - particles.resize(particleCount); - - for(u32 i = 0; i < particleCount; i++) - { - particles[i].position.x = getRandMinusOneToOneF32() * getWidth() * 0.5f; - particles[i].position.y = getRandMinusOneToOneF32() * getHeight() * 0.5f; - particles[i].position.z = 0.0f; - particles[i].colors = glm::vec4(1.0f, 1.0f, 1.0f, (getRandZeroToOneF32() * 0.6f) + 0.05f); - particles[i].radius = getRandZeroToOneF32() * 30.0f; - particles[i].speed = (getRandZeroToOneF32() * 0.6f) + 0.2f; - particles[i].direction = getRandMinusOneToOneF32(); - } -} - -GuiParticleImage::~GuiParticleImage() -{ - free(posVertexs); - free(colorVertexs); -} - -void GuiParticleImage::draw(CVideo *pVideo) -{ - if(!this->isVisible()) - return; - - - f32 currScaleX = getScaleX(); - f32 currScaleY = getScaleY(); - - positionOffsets[2] = getDepth() * pVideo->getDepthScaleFactor() * 2.0f; - - scaleFactor[2] = getScaleZ(); - - //! add other colors intensities parameters - colorIntensity[3] = getAlpha(); - - for(u32 i = 0; i < particles.size(); ++i) - { - if(particles[i].position.y > (getHeight() * 0.5f + 30.0f)) - { - particles[i].position.x = getRandMinusOneToOneF32() * getWidth() * 0.5f; - particles[i].position.y = -getHeight() * 0.5f - 30.0f; - particles[i].colors = glm::vec4(1.0f, 1.0f, 1.0f, (getRandZeroToOneF32() * 0.6f) + 0.05f); - particles[i].radius = getRandZeroToOneF32() * 30.0f; - particles[i].speed = (getRandZeroToOneF32() * 0.6f) + 0.2f; - particles[i].direction = getRandMinusOneToOneF32(); - } - if(particles[i].position.x < (-getWidth() * 0.5f - 50.0f)) - { - particles[i].position.x = -particles[i].position.x; - } - - - particles[i].direction += getRandMinusOneToOneF32() * 0.03f; - particles[i].position.x += particles[i].speed * particles[i].direction; - particles[i].position.y += particles[i].speed; - - positionOffsets[0] = (getCenterX() + particles[i].position.x) * pVideo->getWidthScaleFactor() * 2.0f; - positionOffsets[1] = (getCenterY() + particles[i].position.y) * pVideo->getHeightScaleFactor() * 2.0f; - - scaleFactor[0] = currScaleX * particles[i].radius * pVideo->getWidthScaleFactor(); - scaleFactor[1] = currScaleY * particles[i].radius * pVideo->getHeightScaleFactor(); - - ColorShader::instance()->setShaders(); - ColorShader::instance()->setAttributeBuffer(colorVertexs, posVertexs, CIRCLE_VERTEX_COUNT); - ColorShader::instance()->setAngle(0.0f); - ColorShader::instance()->setOffset(positionOffsets); - ColorShader::instance()->setScale(scaleFactor); - ColorShader::instance()->setColorIntensity(colorIntensity * particles[i].colors); - ColorShader::instance()->draw(GX2_PRIMITIVE_MODE_TRIANGLE_FAN, CIRCLE_VERTEX_COUNT); - } -} diff --git a/src/gui/GuiParticleImage.h b/src/gui/GuiParticleImage.h deleted file mode 100644 index eb7565b..0000000 --- a/src/gui/GuiParticleImage.h +++ /dev/null @@ -1,45 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#ifndef _GUI_PARTICLE_IMAGE_H_ -#define _GUI_PARTICLE_IMAGE_H_ - -#include "GuiImage.h" - -class GuiParticleImage : public GuiImage, public sigslot::has_slots<> -{ -public: - GuiParticleImage(int w, int h, u32 particleCount); - virtual ~GuiParticleImage(); - - void draw(CVideo *pVideo); -private: - f32 *posVertexs; - u8 *colorVertexs; - - typedef struct - { - glm::vec3 position; - glm::vec4 colors; - f32 radius; - f32 speed; - f32 direction; - } Particle; - - std::vector particles; -}; - -#endif // _GUI_ICON_GRID_H_ diff --git a/src/gui/GuiSelectBox.cpp b/src/gui/GuiSelectBox.cpp deleted file mode 100644 index 827dc61..0000000 --- a/src/gui/GuiSelectBox.cpp +++ /dev/null @@ -1,303 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2016 Maschell - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#include -#include -#include "GuiSelectBox.h" -#include "GuiImage.h" -#include "GuiTrigger.h" -#include "GuiImageData.h" -#include "utils/StringTools.h" -/** - * Constructor for the GuiCheckBox class. - */ - -GuiSelectBox::GuiSelectBox(std::string caption,GuiFrame *parent) - : GuiFrame(300,300,parent) - ,selected(0) - ,captionText(caption) - ,topValueImageData(Resources::GetImageData("gameSettingsButton.png")) - ,topValueImage(topValueImageData) - ,topValueImageSelectedData(Resources::GetImageData("gameSettingsButtonSelected.png")) - ,topValueImageSelected(topValueImageSelectedData) - ,topValueButton(topValueImage.getWidth(),topValueImage.getHeight()) - ,valueImageData(Resources::GetImageData("gameSettingsButtonEx.png")) - ,valueSelectedImageData(Resources::GetImageData("gameSettingsButtonExSelected.png")) - ,valueHighlightedImageData(Resources::GetImageData("gameSettingsButtonExHighlighted.png")) - ,touchTrigger(GuiTrigger::CHANNEL_1, GuiTrigger::VPAD_TOUCH) - ,wpadTouchTrigger(GuiTrigger::CHANNEL_2 | GuiTrigger::CHANNEL_3 | GuiTrigger::CHANNEL_4 | GuiTrigger::CHANNEL_5, GuiTrigger::BUTTON_A) - ,buttonATrigger(GuiTrigger::CHANNEL_ALL, GuiTrigger::BUTTON_A, true) - ,buttonBTrigger(GuiTrigger::CHANNEL_ALL, GuiTrigger::BUTTON_B, true) - ,buttonUpTrigger(GuiTrigger::CHANNEL_ALL, GuiTrigger::BUTTON_UP | GuiTrigger::STICK_L_UP, true) - ,buttonDownTrigger(GuiTrigger::CHANNEL_ALL, GuiTrigger::BUTTON_DOWN | GuiTrigger::STICK_L_DOWN, true) - ,DPADButtons(5,5) - ,buttonClickSound(Resources::GetSound("settings_click_2.mp3")) - { - showValues = false; - bChanged = false; - bSelectedChanged = false; - opened = false; - topValueText.setFontSize(32); - topValueText.setAlignment(ALIGN_LEFT); - topValueText.setPosition(10,-7); - topValueButton.setLabel(&topValueText); - topValueButton.setImage(&topValueImage); - topValueButton.setIconOver(&topValueImageSelected); - topValueButton.setTrigger(&touchTrigger); - topValueButton.setTrigger(&wpadTouchTrigger); - topValueButton.setSoundClick(buttonClickSound); - topValueButton.clicked.connect(this, &GuiSelectBox::OnTopValueClicked); - - valuesFrame.setState(STATE_HIDDEN); - - DPADButtons.setTrigger(&buttonBTrigger); - DPADButtons.setTrigger(&buttonATrigger); - DPADButtons.setTrigger(&buttonDownTrigger); - DPADButtons.setTrigger(&buttonUpTrigger); - DPADButtons.clicked.connect(this, &GuiSelectBox::OnDPADClick); - DPADButtons.setState(STATE_DISABLE_INPUT); - - append(&DPADButtons); - append(&valuesFrame); - append(&topValueButton); - - showValues = false; - bChanged = true; -} - -void GuiSelectBox::OnValueClicked(GuiButton *button, const GuiController *controller, GuiTrigger *trigger) -{ - for(u32 i = 0; i < valueButtons.size(); ++i){ - if(valueButtons[i].valueButton == button){ - selected = i; - SelectValue(i); - break; - } - } -} - -void GuiSelectBox::SelectValue(u32 value){ - if(value < valueButtons.size()){ - const wchar_t* w_text = valueButtons[value].valueButtonText->getText(); - std::wstring ws(w_text); - std::string text(ws.begin(), ws.end()); - topValueText.setText(getCaptionWithValue(text).c_str()); - - std::string real_value = buttonToValue[valueButtons[value].valueButton]; - if(real_value.compare(std::string()) == 0) real_value = ""; - - valueChanged(this,real_value); - ShowHideValues(false); - } -} -std::string GuiSelectBox::getCaptionWithValue(std::string value){ - u32 pad = (38 - captionText.size() -2); - if(pad > value.size()) - value.insert(0, pad - value.size(), ' '); - return strfmt("%s: %s",captionText.c_str(),value.c_str()); -} - -void GuiSelectBox::OnTopValueClicked(GuiButton *button, const GuiController *controller, GuiTrigger *trigger) -{ - ShowHideValues(!showValues); -} - -void GuiSelectBox::ShowHideValues(bool showhide) -{ - showValues = showhide; - bChanged = true; -} - -void GuiSelectBox::OnDPADClick(GuiButton *button, const GuiController *controller, GuiTrigger *trigger) -{ - if(opened == true){ - if(trigger == &buttonATrigger) - { - //! do not auto launch when wiimote is pointing to screen and presses A - if((controller->chan & (GuiTrigger::CHANNEL_2 | GuiTrigger::CHANNEL_3 | GuiTrigger::CHANNEL_4 | GuiTrigger::CHANNEL_5)) && controller->data.validPointer) - { - return; - } - SelectValue(selected); - } - else if(trigger == &buttonBTrigger) - { - if(button == &DPADButtons){ - ShowHideValues(false); - }else{ - } - }else if(trigger == &buttonUpTrigger){ - if(selected > 0 ) selected--; - bSelectedChanged = true; - } - else if(trigger == &buttonDownTrigger){ - selected++; - if(selected >= valueButtons.size()) selected = valueButtons.size() - 1; - bSelectedChanged = true; - } - } -} - -void GuiSelectBox::Init(std::map values, int valueID) -{ - if((u32)valueID >= values.size()){ - valueID = 0; - } - - selected = valueID; - bSelectedChanged = true; - - DeleteValueData(); - - valueButtons.resize(values.size()); - - int i = 0; - f32 imgScale = 1.0f; - std::map::iterator itr; - for(itr = values.begin(); itr != values.end(); itr++) { - if(i == valueID){ - topValueText.setText(getCaptionWithValue(itr->first).c_str()); - } - - valueButtons[i].valueButtonImg = new GuiImage(valueImageData); - - valueButtons[i].valueButtonCheckedImg = new GuiImage(valueSelectedImageData); - valueButtons[i].valueButtonHighlightedImg = new GuiImage(valueHighlightedImageData); - valueButtons[i].valueButton = new GuiButton(valueButtons[i].valueButtonImg->getWidth() * imgScale, valueButtons[i].valueButtonImg->getHeight() * imgScale); - valueButtons[i].valueButtonText = new GuiText(itr->first.c_str(),32,glm::vec4(1.0f, 1.0f, 1.0f, 1.0f)); - - valueButtons[i].valueButtonText->setMaxWidth(valueButtons[i].valueButtonImg->getWidth() * imgScale - 20.0f, GuiText::WRAP); - valueButtons[i].valueButtonText->setPosition(0, 0); - - valueButtons[i].valueButtonImg->setScale(imgScale); - valueButtons[i].valueButtonCheckedImg->setScale(imgScale); - - valueButtons[i].valueButton->setImage(valueButtons[i].valueButtonImg); - valueButtons[i].valueButton->setIconOver(valueButtons[i].valueButtonHighlightedImg); - valueButtons[i].valueButton->setTrigger(&touchTrigger); - valueButtons[i].valueButton->setTrigger(&wpadTouchTrigger); - valueButtons[i].valueButton->clicked.connect(this,&GuiSelectBox::OnValueClicked); - valueButtons[i].valueButton->setSoundClick(buttonClickSound); - valueButtons[i].valueButton->setLabel(valueButtons[i].valueButtonText); - - //valueButtons[i].valueButton->setState(STATE_HIDDEN); //Wont get disabled soon enough - - buttonToValue[valueButtons[i].valueButton] = itr->second; - - valueButtons[i].valueButton->setPosition(0, (((valueButtons[i].valueButtonImg->getHeight()*getScale()) * (i))+ (topValueImage.getHeight()-5)*getScale())*-1.0f); - valuesFrame.append(valueButtons[i].valueButton); - - i++; - } - //Collapse the thing! - showValues = false; - bChanged = true; -} - -void GuiSelectBox::DeleteValueData() -{ - for(u32 i = 0; i < valueButtons.size(); ++i) - { - valuesFrame.remove(valueButtons[i].valueButton); - delete valueButtons[i].valueButtonImg; - delete valueButtons[i].valueButtonCheckedImg; - delete valueButtons[i].valueButtonHighlightedImg; - delete valueButtons[i].valueButton; - delete valueButtons[i].valueButtonText; - } - buttonToValue.clear(); - valueButtons.clear(); -} - -/** - * Destructor for the GuiButton class. - */ -GuiSelectBox::~GuiSelectBox() -{ - DeleteValueData(); - bChanged = false; - selected = 0; - showValues = false; - Resources::RemoveSound(buttonClickSound); - Resources::RemoveImageData(topValueImageData); - Resources::RemoveImageData(topValueImageSelectedData); - Resources::RemoveImageData(valueImageData); - Resources::RemoveImageData(valueHighlightedImageData); - Resources::RemoveImageData(valueSelectedImageData); -} - - -void GuiSelectBox::setState(int s, int c) -{ - GuiElement::setState(s, c); -} - -void GuiSelectBox::OnValueCloseEffectFinish(GuiElement *element) -{ - valuesFrame.effectFinished.disconnect(this); -} - -f32 GuiSelectBox::getTopValueHeight() { - return topValueImage.getHeight(); -} - -f32 GuiSelectBox::getTopValueWidth() { - return topValueImage.getWidth(); -} - -void GuiSelectBox::OnValueOpenEffectFinish(GuiElement *element) -{ - valuesFrame.effectFinished.disconnect(this); - opened = true; -} - -void GuiSelectBox::update(GuiController * c){ - if(bChanged){ - showhide(this,showValues); - if(showValues){ - for(u32 i = 0; i < valueButtons.size(); ++i){ //TODO: only set when it really changed - if(i == selected){ - valueButtons[i].valueButton->setImage(valueButtons[i].valueButtonCheckedImg); - }else{ - valueButtons[i].valueButton->setImage(valueButtons[i].valueButtonImg); - } - } - valuesFrame.clearState(STATE_HIDDEN); - DPADButtons.clearState(STATE_DISABLE_INPUT); - valuesFrame.setEffect(EFFECT_FADE, 10, 255); - valuesFrame.effectFinished.connect(this, &GuiSelectBox::OnValueCloseEffectFinish); - }else{ - opened = false; - valuesFrame.setState(STATE_HIDDEN); - DPADButtons.setState(STATE_DISABLE_INPUT); - valuesFrame.setEffect(EFFECT_FADE, -10, 0); - valuesFrame.effectFinished.connect(this, &GuiSelectBox::OnValueOpenEffectFinish); - } - - bChanged = false; - } - if(bSelectedChanged){ - for(u32 i = 0; i < valueButtons.size(); ++i){ - if(i == selected){ - valueButtons[i].valueButton->setState(STATE_SELECTED); - }else{ - valueButtons[i].valueButton->clearState(STATE_SELECTED); - } - } - } - topValueButton.setState(getState()); - GuiFrame::update(c); -} diff --git a/src/gui/GuiSelectBox.h b/src/gui/GuiSelectBox.h deleted file mode 100644 index 1e8557e..0000000 --- a/src/gui/GuiSelectBox.h +++ /dev/null @@ -1,104 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2016 Maschell - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#ifndef GUI_SELECTBOX_H_ -#define GUI_SELECTBOX_H_ - -#include "Gui.h" -#include "GuiImage.h" -#include "GuiImageData.h" - -//!A simple CheckBox -class GuiSelectBox : public GuiFrame, public sigslot::has_slots<> - -{ - public: - //!Constructor - //!\param checked Checked - GuiSelectBox(std::string caption,GuiFrame *parent = 0); - //!Destructor - virtual ~GuiSelectBox(); - - sigslot::signal2 valueChanged; - sigslot::signal2 showhide; - void OnTopValueClicked(GuiButton *button, const GuiController *controller, GuiTrigger *trigger); - void Init(std::map values, int valueID); - - void setState(int s, int c = -1); - - virtual f32 getTopValueHeight(); - virtual f32 getTopValueWidth(); - - protected: - void DeleteValueData(); - void update(GuiController * c); - - void OnValueClicked(GuiButton *button, const GuiController *controller, GuiTrigger *trigger); - - void OnDPADClick(GuiButton *button, const GuiController *controller, GuiTrigger *trigger); - void OnValueOpenEffectFinish(GuiElement *element); - void OnValueCloseEffectFinish(GuiElement *element); - void ShowHideValues(bool showhide); - void SelectValue(u32 value); - - u32 selected; - bool bChanged; - bool bSelectedChanged; - bool showValues; - bool opened; - std::string captionText; - GuiFrame valuesFrame; - GuiImageData *topValueImageData; - GuiImage topValueImage; - GuiImageData *topValueImageSelectedData; - GuiImage topValueImageSelected; - - GuiButton topValueButton; - GuiImageData * valueImageData; - GuiImageData * valueSelectedImageData; - GuiImageData * valueHighlightedImageData; - GuiText topValueText; - - GuiTrigger touchTrigger; - GuiTrigger wpadTouchTrigger; - - GuiTrigger buttonATrigger; - GuiTrigger buttonBTrigger; - GuiTrigger buttonLeftTrigger; - GuiTrigger buttonRightTrigger; - GuiTrigger buttonUpTrigger; - GuiTrigger buttonDownTrigger; - - GuiButton DPADButtons; - - GuiSound* buttonClickSound; - - std::string getCaptionWithValue(std::string value); - typedef struct - { - GuiImage *valueButtonImg; - GuiImage *valueButtonCheckedImg; - GuiImage *valueButtonHighlightedImg; - GuiButton *valueButton; - GuiText *valueButtonText; - } SelectBoxValueButton; - - std::map buttonToValue; - std::vector valueButtons; - -}; - -#endif diff --git a/src/gui/GuiSound.cpp b/src/gui/GuiSound.cpp deleted file mode 100644 index 90fa9dd..0000000 --- a/src/gui/GuiSound.cpp +++ /dev/null @@ -1,192 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#include "GuiSound.h" -#include "sounds/SoundHandler.hpp" - -GuiSound::GuiSound(const char * filepath) -{ - voice = -1; - Load(filepath); -} - -GuiSound::GuiSound(const u8 * snd, s32 length) -{ - voice = -1; - Load(snd, length); -} - -GuiSound::~GuiSound() -{ - if(voice >= 0) - { - SoundHandler::instance()->RemoveDecoder(voice); - } -} - - -bool GuiSound::Load(const char * filepath) -{ - if(voice >= 0) - { - SoundHandler::instance()->RemoveDecoder(voice); - voice = -1; - } - - //! find next free decoder - for(int i = 0; i < MAX_DECODERS; i++) - { - SoundDecoder * decoder = SoundHandler::instance()->getDecoder(i); - if(decoder == NULL) - { - SoundHandler::instance()->AddDecoder(i, filepath); - decoder = SoundHandler::instance()->getDecoder(i); - if(decoder) - { - voice = i; - SoundHandler::instance()->ThreadSignal(); - } - break; - } - } - - if(voice < 0) - return false; - - return true; -} - -bool GuiSound::Load(const u8 * snd, s32 len) -{ - if(voice >= 0) - { - SoundHandler::instance()->RemoveDecoder(voice); - voice = -1; - } - - if(!snd) - return false; - - //! find next free decoder - for(int i = 0; i < MAX_DECODERS; i++) - { - SoundDecoder * decoder = SoundHandler::instance()->getDecoder(i); - if(decoder == NULL) - { - SoundHandler::instance()->AddDecoder(i, snd, len); - decoder = SoundHandler::instance()->getDecoder(i); - if(decoder) - { - voice = i; - SoundHandler::instance()->ThreadSignal(); - } - break; - } - } - - if(voice < 0) - return false; - - return true; -} - -void GuiSound::Play() -{ - Stop(); - - Voice * v = SoundHandler::instance()->getVoice(voice); - if(v) - v->setState(Voice::STATE_START); - - -} - -void GuiSound::Stop() -{ - Voice * v = SoundHandler::instance()->getVoice(voice); - if(v) - { - if((v->getState() != Voice::STATE_STOP) && (v->getState() != Voice::STATE_STOPPED)) - v->setState(Voice::STATE_STOP); - - while(v->getState() != Voice::STATE_STOPPED) - usleep(1000); - } - - SoundDecoder * decoder = SoundHandler::instance()->getDecoder(voice); - if(decoder) - { - decoder->Lock(); - decoder->Rewind(); - decoder->ClearBuffer(); - SoundHandler::instance()->ThreadSignal(); - decoder->Unlock(); - } -} - -void GuiSound::Pause() -{ - if(!IsPlaying()) - return; - - Voice * v = SoundHandler::instance()->getVoice(voice); - if(v) - v->setState(Voice::STATE_STOP); -} - -void GuiSound::Resume() -{ - if(IsPlaying()) - return; - - Voice * v = SoundHandler::instance()->getVoice(voice); - if(v) - v->setState(Voice::STATE_START); -} - -bool GuiSound::IsPlaying() -{ - Voice * v = SoundHandler::instance()->getVoice(voice); - if(v) - return v->getState() == Voice::STATE_PLAYING; - - return false; - -} - -void GuiSound::SetVolume(u32 vol) -{ - if(vol > 100) - vol = 100; - - u32 volumeConv = ( (0x8000 * vol) / 100 ) << 16; - - Voice * v = SoundHandler::instance()->getVoice(voice); - if(v) - v->setVolume(volumeConv); -} - -void GuiSound::SetLoop(bool l) -{ - SoundDecoder * decoder = SoundHandler::instance()->getDecoder(voice); - if(decoder) - decoder->SetLoop(l); -} - -void GuiSound::Rewind() -{ - Stop(); -} diff --git a/src/gui/GuiSound.h b/src/gui/GuiSound.h deleted file mode 100644 index b63e40f..0000000 --- a/src/gui/GuiSound.h +++ /dev/null @@ -1,60 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#ifndef GUI_SOUND_H_ -#define GUI_SOUND_H_ - -#include "common/types.h" -#include "system/AsyncDeleter.h" - -//!Sound conversion and playback. A wrapper for other sound libraries - ASND, libmad, ltremor, etc -class GuiSound : public AsyncDeleter::Element -{ - public: - //!Constructor - //!\param sound Pointer to the sound data - //!\param filesize Length of sound data - GuiSound(const char * filepath); - GuiSound(const u8 * sound, s32 length); - //!Destructor - virtual ~GuiSound(); - //!Load a file and replace the old one - bool Load(const char * filepath); - //!Load a file and replace the old one - bool Load(const u8 * snd, s32 len); - //!Start sound playback - void Play(); - //!Stop sound playback - void Stop(); - //!Pause sound playback - void Pause(); - //!Resume sound playback - void Resume(); - //!Checks if the sound is currently playing - //!\return true if sound is playing, false otherwise - bool IsPlaying(); - //!Rewind the music - void Rewind(); - //!Set sound volume - //!\param v Sound volume (0-100) - void SetVolume(u32 v); - //!\param l Loop (true to loop) - void SetLoop(bool l); - protected: - s32 voice; //!< Currently assigned ASND voice channel -}; - -#endif diff --git a/src/gui/GuiSwitch.cpp b/src/gui/GuiSwitch.cpp deleted file mode 100644 index 206a456..0000000 --- a/src/gui/GuiSwitch.cpp +++ /dev/null @@ -1,72 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2016 Maschell - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#include "GuiSwitch.h" -#include "GuiImage.h" -#include "GuiImageData.h" -/** - * Constructor for the GuiSwitch class. - */ - -GuiSwitch::GuiSwitch(bool checked,f32 switchscale) - : GuiToggle(checked,90*switchscale,38*switchscale) - ,switchbase_imgdata(Resources::GetImageData("switchIconBase.png")) - ,switchbase_img(switchbase_imgdata) - ,switchbase_highlighted_imgdata(Resources::GetImageData("switchIconBaseHighlighted.png")) - ,switchbase_highlighted_img(switchbase_highlighted_imgdata) - ,switchOn_imgdata(Resources::GetImageData("switchIconOn.png")) - ,switchOn_img(switchOn_imgdata) - ,switchOff_imgdata(Resources::GetImageData("switchIconOff.png")) - ,switchOff_img(switchOff_imgdata) -{ - f32 scale = 0.0; - if(switchbase_img.getHeight() > switchbase_img.getWidth()){ - scale = height*switchscale/switchbase_img.getHeight(); - }else{ - scale = width/switchbase_img.getWidth(); - } - - switchbase_img.setScale(scale); - switchbase_highlighted_img.setScale(scale); - switchOn_img.setScale(scale); - switchOff_img.setScale(scale); - - switchOn_img.setParent(this); - switchOn_img.setPosition((width/4.0),0); - switchOff_img.setParent(this); - switchOff_img.setPosition(-((width/4.0)),0); - setImage(&switchbase_img); - setIconOver(&switchbase_highlighted_img); -} -/** - * Destructor for the GuiButton class. - */ -GuiSwitch::~GuiSwitch() -{ - Resources::RemoveImageData(switchbase_imgdata); - Resources::RemoveImageData(switchbase_highlighted_imgdata); - Resources::RemoveImageData(switchOn_imgdata); - Resources::RemoveImageData(switchOff_imgdata); -} - -void GuiSwitch::draw(CVideo *v){ - GuiToggle::draw(v); - if(getValue()){ - switchOn_img.draw(v); - }else{ - switchOff_img.draw(v); - } -} diff --git a/src/gui/GuiSwitch.h b/src/gui/GuiSwitch.h deleted file mode 100644 index 4988d2d..0000000 --- a/src/gui/GuiSwitch.h +++ /dev/null @@ -1,51 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2016 Maschell - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#ifndef GUI_SWTICH_H_ -#define GUI_SWTICH_H_ - -#include "GuiToggle.h" -#include "GuiImage.h" -#include "GuiImageData.h" - -//!A simple switch -class GuiSwitch : public GuiToggle -{ - public: - //!Constructor - //!\param checked Checked - GuiSwitch(bool checked,f32 switchscale = 1.0f); - //!Destructor - virtual ~GuiSwitch(); - - protected: - - GuiImageData * switchbase_imgdata; - GuiImage switchbase_img; - - GuiImageData * switchbase_highlighted_imgdata; - GuiImage switchbase_highlighted_img; - - GuiImageData * switchOn_imgdata; - GuiImage switchOn_img; - - GuiImageData * switchOff_imgdata; - GuiImage switchOff_img; - - void draw(CVideo * v); -}; - -#endif diff --git a/src/gui/GuiText.cpp b/src/gui/GuiText.cpp deleted file mode 100644 index f9efaec..0000000 --- a/src/gui/GuiText.cpp +++ /dev/null @@ -1,615 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#include "video/CVideo.h" -#include "FreeTypeGX.h" -#include "GuiText.h" - -FreeTypeGX * GuiText::presentFont = NULL; -int GuiText::presetSize = 28; -int GuiText::presetInternalRenderingScale = 2.0f; //Lets render the font at the doubled size. This make it even smoother! -int GuiText::presetMaxWidth = 0xFFFF; -int GuiText::presetAlignment = ALIGN_CENTER | ALIGN_MIDDLE; -GX2ColorF32 GuiText::presetColor = (GX2ColorF32){ 1.0f, 1.0f, 1.0f, 1.0f }; - -#define TEXT_SCROLL_DELAY 6 -#define TEXT_SCROLL_INITIAL_DELAY 10 -#define MAX_LINES_TO_DRAW 10 - -/** - * Constructor for the GuiText class. - */ - -GuiText::GuiText() -{ - text = NULL; - size = presetSize; - currentSize = size; - color = glm::vec4(presetColor.r, presetColor.g, presetColor.b, presetColor.a); - alpha = presetColor.a; - alignment = presetAlignment; - maxWidth = presetMaxWidth; - wrapMode = 0; - textWidth = 0; - font = presentFont; - linestodraw = MAX_LINES_TO_DRAW; - textScrollPos = 0; - textScrollInitialDelay = TEXT_SCROLL_INITIAL_DELAY; - textScrollDelay = TEXT_SCROLL_DELAY; - defaultBlur = 4.0f; - blurGlowIntensity = 0.0f; - blurAlpha = 0.0f; - blurGlowColor = glm::vec4(0.0f); - internalRenderingScale = presetInternalRenderingScale; -} - -GuiText::GuiText(const char * t, int s, const glm::vec4 & c) -{ - text = NULL; - size = s; - currentSize = size; - color = c; - alpha = c[3]; - alignment = ALIGN_CENTER | ALIGN_MIDDLE; - maxWidth = presetMaxWidth; - wrapMode = 0; - textWidth = 0; - font = presentFont; - linestodraw = MAX_LINES_TO_DRAW; - textScrollPos = 0; - textScrollInitialDelay = TEXT_SCROLL_INITIAL_DELAY; - textScrollDelay = TEXT_SCROLL_DELAY; - defaultBlur = 4.0f; - blurGlowIntensity = 0.0f; - blurAlpha = 0.0f; - blurGlowColor = glm::vec4(0.0f); - internalRenderingScale = presetInternalRenderingScale; - - if(t) - { - text = FreeTypeGX::charToWideChar(t); - if(!text) - return; - - textWidth = font->getWidth(text, currentSize); - } -} - -GuiText::GuiText(const wchar_t * t, int s, const glm::vec4 & c) -{ - text = NULL; - size = s; - currentSize = size; - color = c; - alpha = c[3]; - alignment = ALIGN_CENTER | ALIGN_MIDDLE; - maxWidth = presetMaxWidth; - wrapMode = 0; - textWidth = 0; - font = presentFont; - linestodraw = MAX_LINES_TO_DRAW; - textScrollPos = 0; - textScrollInitialDelay = TEXT_SCROLL_INITIAL_DELAY; - textScrollDelay = TEXT_SCROLL_DELAY; - defaultBlur = 4.0f; - blurGlowIntensity = 0.0f; - blurAlpha = 0.0f; - blurGlowColor = glm::vec4(0.0f); - internalRenderingScale = presetInternalRenderingScale; - - if(t) - { - text = new (std::nothrow) wchar_t[wcslen(t)+1]; - if(!text) - return; - - wcscpy(text, t); - - textWidth = font->getWidth(text, currentSize); - } -} - -/** - * Constructor for the GuiText class, uses presets - */ -GuiText::GuiText(const char * t) -{ - text = NULL; - size = presetSize; - currentSize = size; - color = glm::vec4(presetColor.r, presetColor.g, presetColor.b, presetColor.a); - alpha = presetColor.a; - alignment = presetAlignment; - maxWidth = presetMaxWidth; - wrapMode = 0; - textWidth = 0; - font = presentFont; - linestodraw = MAX_LINES_TO_DRAW; - textScrollPos = 0; - textScrollInitialDelay = TEXT_SCROLL_INITIAL_DELAY; - textScrollDelay = TEXT_SCROLL_DELAY; - defaultBlur = 4.0f; - blurGlowIntensity = 0.0f; - blurAlpha = 0.0f; - blurGlowColor = glm::vec4(0.0f); - internalRenderingScale = presetInternalRenderingScale; - - if(t) - { - text = FreeTypeGX::charToWideChar(t); - if(!text) - return; - - textWidth = font->getWidth(text, currentSize); - } -} - - -/** - * Destructor for the GuiText class. - */ -GuiText::~GuiText() -{ - if(text) - delete [] text; - text = NULL; - - clearDynamicText(); -} - -void GuiText::setText(const char * t) -{ - if(text) - delete [] text; - text = NULL; - - clearDynamicText(); - - textScrollPos = 0; - textScrollInitialDelay = TEXT_SCROLL_INITIAL_DELAY; - - if(t) - { - text = FreeTypeGX::charToWideChar(t); - if(!text) - return; - - textWidth = font->getWidth(text, currentSize); - } -} - -void GuiText::setTextf(const char *format, ...) -{ - if(!format) - { - setText((char *) NULL); - return; - } - - int max_len = strlen(format) + 8192; - char *tmp = new char[max_len]; - va_list va; - va_start(va, format); - if((vsnprintf(tmp, max_len, format, va) >= 0) && tmp) - { - setText(tmp); - } - va_end(va); - - if(tmp) - delete [] tmp; -} - - -void GuiText::setText(const wchar_t * t) -{ - if(text) - delete [] text; - text = NULL; - - clearDynamicText(); - - textScrollPos = 0; - textScrollInitialDelay = TEXT_SCROLL_INITIAL_DELAY; - - if(t) - { - text = new (std::nothrow) wchar_t[wcslen(t)+1]; - if(!text) - return; - - wcscpy(text, t); - - textWidth = font->getWidth(text, currentSize); - } -} - -void GuiText::clearDynamicText() -{ - for(u32 i = 0; i < textDyn.size(); i++) - { - if(textDyn[i]) - delete [] textDyn[i]; - } - textDyn.clear(); - textDynWidth.clear(); -} - -void GuiText::setPresets(int sz, const glm::vec4 & c, int w, int a) -{ - presetSize = sz; - presetColor = (GX2ColorF32) { (f32)c.r / 255.0f, (f32)c.g / 255.0f, (f32)c.b / 255.0f, (f32)c.a / 255.0f }; - presetMaxWidth = w; - presetAlignment = a; -} - -void GuiText::setPresetFont(FreeTypeGX *f) -{ - presentFont = f; -} - -void GuiText::setFontSize(int s) -{ - size = s; -} - -void GuiText::setMaxWidth(int width, int w) -{ - maxWidth = width; - wrapMode = w; - - if(w == SCROLL_HORIZONTAL) - { - textScrollPos = 0; - textScrollInitialDelay = TEXT_SCROLL_INITIAL_DELAY; - textScrollDelay = TEXT_SCROLL_DELAY; - } - - clearDynamicText(); -} - -void GuiText::setColor(const glm::vec4 & c) -{ - color = c; - alpha = c[3]; -} - -void GuiText::setBlurGlowColor(float blur, const glm::vec4 & c) -{ - blurGlowColor = c; - blurGlowIntensity = blur; - blurAlpha = c[3]; -} - -int GuiText::getTextWidth(int ind) -{ - if(ind < 0 || ind >= (int) textDyn.size()) - return this->getTextWidth(); - - return font->getWidth(textDyn[ind], currentSize); -} - -const wchar_t * GuiText::getDynText(int ind) -{ - if(ind < 0 || ind >= (int) textDyn.size()) - return text; - - return textDyn[ind]; -} - -/** - * Change font - */ -bool GuiText::setFont(FreeTypeGX *f) -{ - if(!f) - return false; - - font = f; - textWidth = font->getWidth(text, currentSize); - return true; -} - -std::string GuiText::toUTF8(void) const -{ - if(!text) - return std::string(); - - char *pUtf8 = FreeTypeGX::wideCharToUTF8(text); - if(!pUtf8) - return std::string(); - - std::string strOutput(pUtf8); - - delete [] pUtf8; - - return strOutput; -} - -void GuiText::makeDottedText() -{ - int pos = textDyn.size(); - textDyn.resize(pos + 1); - - int i = 0, currentWidth = 0; - textDyn[pos] = new (std::nothrow) wchar_t[maxWidth]; - if(!textDyn[pos]) { - textDyn.resize(pos); - return; - } - - while (text[i]) - { - currentWidth += font->getCharWidth(text[i], currentSize, i > 0 ? text[i - 1] : 0); - if (currentWidth >= maxWidth && i > 2) - { - textDyn[pos][i - 2] = '.'; - textDyn[pos][i - 1] = '.'; - textDyn[pos][i] = '.'; - i++; - break; - } - - textDyn[pos][i] = text[i]; - - i++; - } - textDyn[pos][i] = 0; -} - -void GuiText::scrollText(u32 frameCount) -{ - if (textDyn.size() == 0) - { - int pos = textDyn.size(); - int i = 0, currentWidth = 0; - textDyn.resize(pos + 1); - - textDyn[pos] = new (std::nothrow) wchar_t[maxWidth]; - if(!textDyn[pos]) { - textDyn.resize(pos); - return; - } - - while (text[i] && currentWidth < maxWidth) - { - textDyn[pos][i] = text[i]; - - currentWidth += font->getCharWidth(text[i], currentSize, i > 0 ? text[i - 1] : 0); - - ++i; - } - textDyn[pos][i] = 0; - - return; - } - - if (frameCount % textScrollDelay != 0) - { - return; - } - - if (textScrollInitialDelay) - { - --textScrollInitialDelay; - return; - } - - int stringlen = wcslen(text); - - ++textScrollPos; - if (textScrollPos > stringlen) - { - textScrollPos = 0; - textScrollInitialDelay = TEXT_SCROLL_INITIAL_DELAY; - } - - int ch = textScrollPos; - int pos = textDyn.size() - 1; - - if (!textDyn[pos]) - textDyn[pos] = new (std::nothrow) wchar_t[maxWidth]; - - if(!textDyn[pos]) { - textDyn.resize(pos); - return; - } - - int i = 0, currentWidth = 0; - - while (currentWidth < maxWidth) - { - if (ch > stringlen - 1) - { - textDyn[pos][i++] = ' '; - currentWidth += font->getCharWidth(L' ', currentSize, ch > 0 ? text[ch - 1] : 0); - textDyn[pos][i++] = ' '; - currentWidth += font->getCharWidth(L' ', currentSize, L' '); - textDyn[pos][i++] = ' '; - currentWidth += font->getCharWidth(L' ', currentSize, L' '); - ch = 0; - - if(currentWidth >= maxWidth) - break; - } - - textDyn[pos][i] = text[ch]; - currentWidth += font->getCharWidth(text[ch], currentSize, ch > 0 ? text[ch - 1] : 0); - ++ch; - ++i; - } - textDyn[pos][i] = 0; -} - -void GuiText::wrapText() -{ - if (textDyn.size() > 0) return; - - int i = 0; - int ch = 0; - int linenum = 0; - int lastSpace = -1; - int lastSpaceIndex = -1; - int currentWidth = 0; - - while (text[ch] && linenum < linestodraw) - { - if (linenum >= (int) textDyn.size()) - { - textDyn.resize(linenum + 1); - textDyn[linenum] = new (std::nothrow) wchar_t[maxWidth]; - if(!textDyn[linenum]) { - textDyn.resize(linenum); - break; - } - } - - textDyn[linenum][i] = text[ch]; - textDyn[linenum][i + 1] = 0; - - currentWidth += font->getCharWidth(text[ch], currentSize, ch > 0 ? text[ch - 1] : 0x0000); - - if (currentWidth >= maxWidth || (text[ch] == '\n')) - { - if(text[ch] == '\n') - { - lastSpace = -1; - lastSpaceIndex = -1; - } - else if (lastSpace >= 0) - { - textDyn[linenum][lastSpaceIndex] = 0; // discard space, and everything after - ch = lastSpace; // go backwards to the last space - lastSpace = -1; // we have used this space - lastSpaceIndex = -1; - } - - if (linenum + 1 == linestodraw && text[ch + 1] != 0x0000) - { - if(i < 2) - i = 2; - - textDyn[linenum][i - 2] = '.'; - textDyn[linenum][i - 1] = '.'; - textDyn[linenum][i] = '.'; - textDyn[linenum][i + 1] = 0; - } - - currentWidth = 0; - ++linenum; - i = -1; - } - if (text[ch] == ' ' && i >= 0) - { - lastSpace = ch; - lastSpaceIndex = i; - } - ++ch; - ++i; - } -} - -/** - * Draw the text on screen - */ -void GuiText::draw(CVideo *pVideo) -{ - if(!text) - return; - - if(!isVisible()) - return; - - color[3] = getAlpha(); - blurGlowColor[3] = blurAlpha * getAlpha(); - - float finalRenderingScale = 2.0f * internalRenderingScale; - - int newSize = size * getScale() * finalRenderingScale; - int normal_size = size * getScale(); - - if(newSize != currentSize) - { - currentSize = normal_size; - - if(text) - textWidth = font->getWidth(text, normal_size); - } - - f32 x_pos = getCenterX() * finalRenderingScale; - f32 y_pos = getCenterY() * finalRenderingScale; - - if(maxWidth > 0 && maxWidth <= textWidth) - { - if(wrapMode == DOTTED) // text dotted - { - if(textDyn.size() == 0) - makeDottedText(); - - if(textDynWidth.size() != textDyn.size()) - { - textDynWidth.resize(textDyn.size()); - - for(u32 i = 0; i < textDynWidth.size(); i++) - textDynWidth[i] = font->getWidth(textDyn[i], newSize); - } - - - if(textDyn.size() > 0) - font->drawText(pVideo, x_pos, y_pos, getDepth(), textDyn[textDyn.size()-1], newSize, color, alignment, textDynWidth[textDyn.size()-1], defaultBlur, blurGlowIntensity, blurGlowColor,finalRenderingScale); - } - - else if(wrapMode == SCROLL_HORIZONTAL) - { - scrollText(pVideo->getFrameCount()); - - if(textDyn.size() > 0) - font->drawText(pVideo, x_pos, y_pos, getDepth(), textDyn[textDyn.size()-1], newSize, color, alignment, maxWidth*finalRenderingScale, defaultBlur, blurGlowIntensity, blurGlowColor,finalRenderingScale); - - } - else if(wrapMode == WRAP) - { - int lineheight = newSize + 6; - int yoffset = 0; - int voffset = 0; - - if(textDyn.size() == 0) - wrapText(); - - if(textDynWidth.size() != textDyn.size()) - { - textDynWidth.resize(textDyn.size()); - - for(u32 i = 0; i < textDynWidth.size(); i++) - textDynWidth[i] = font->getWidth(textDyn[i], newSize); - } - - if(alignment & ALIGN_MIDDLE) - voffset = (lineheight * (textDyn.size()-1)) >> 1; - - for(u32 i = 0; i < textDyn.size(); i++) - { - font->drawText(pVideo, x_pos, y_pos + voffset + yoffset, getDepth(), textDyn[i], newSize, color, alignment, textDynWidth[i], defaultBlur, blurGlowIntensity, blurGlowColor,finalRenderingScale); - yoffset -= lineheight; - } - } - } - else - { - uint16_t newtextWidth = font->getWidth(text, newSize); - font->drawText(pVideo, x_pos, y_pos, getDepth(), text, newSize, color, alignment, newtextWidth, defaultBlur, blurGlowIntensity, blurGlowColor,finalRenderingScale); - } -} diff --git a/src/gui/GuiText.h b/src/gui/GuiText.h deleted file mode 100644 index 2aa2d5e..0000000 --- a/src/gui/GuiText.h +++ /dev/null @@ -1,142 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#ifndef GUI_TEXT_H_ -#define GUI_TEXT_H_ - -#include "common/gx2_ext.h" -#include "GuiElement.h" -//!Forward declaration -class FreeTypeGX; - -//!Display, manage, and manipulate text in the GUI -class GuiText : public GuiElement -{ -public: - //!Constructor - GuiText(); - //!\param t Text - //!\param s Font size - //!\param c Font color - GuiText(const char * t, int s, const glm::vec4 & c); - //!\overload - //!\param t Text - //!\param s Font size - //!\param c Font color - GuiText(const wchar_t * t, int s, const glm::vec4 & c); - //!\overload - //!\Assumes SetPresets() has been called to setup preferred text attributes - //!\param t Text - GuiText(const char * t); - //!Destructor - virtual ~GuiText(); - //!Sets the text of the GuiText element - //!\param t Text - virtual void setText(const char * t); - virtual void setText(const wchar_t * t); - virtual void setTextf(const char *format, ...) __attribute__((format(printf,2,3))); - //!Sets up preset values to be used by GuiText(t) - //!Useful when printing multiple text elements, all with the same attributes set - //!\param sz Font size - //!\param c Font color - //!\param w Maximum width of texture image (for text wrapping) - //!\param wrap Wrapmode when w>0 - //!\param a Text alignment - static void setPresets(int sz, const glm::vec4 & c, int w, int a); - static void setPresetFont(FreeTypeGX *font); - //!Sets the font size - //!\param s Font size - void setFontSize(int s); - //!Sets the maximum width of the drawn texture image - //!If the text exceeds this, it is wrapped to the next line - //!\param w Maximum width - //!\param m WrapMode - void setMaxWidth(int w = 0, int m = WRAP); - //!Sets the font color - //!\param c Font color - void setColor(const glm::vec4 & c); - - void setBlurGlowColor(float blurIntensity, const glm::vec4 & c); - - void setTextBlur(float blur) { defaultBlur = blur; } - //!Get the original text as char - virtual const wchar_t * getText() const { return text; } - virtual std::string toUTF8(void) const; - //!Get the Horizontal Size of Text - int getTextWidth() { return textWidth; } - int getTextWidth(int ind); - //!Get the max textwidth - int getTextMaxWidth() { return maxWidth; } - //!Get fontsize - int getFontSize() { return size; }; - //!Set max lines to draw - void setLinesToDraw(int l) { linestodraw = l; } - //!Get current Textline (for position calculation) - const wchar_t * getDynText(int ind = 0); - virtual const wchar_t * getTextLine(int ind) { return getDynText(ind); }; - //!Change the font - bool setFont(FreeTypeGX *font); - //! virtual function used in child classes - virtual int getStartWidth() { return 0; }; - //!Constantly called to draw the text - void draw(CVideo *pVideo); - //! text enums - enum - { - WRAP, - DOTTED, - SCROLL_HORIZONTAL, - SCROLL_NONE - }; -protected: - static FreeTypeGX * presentFont; - static int presetSize; - static int presetMaxWidth; - static int presetInternalRenderingScale; - static int presetAlignment; - static GX2ColorF32 presetColor; - - //!Clear the dynamic text - void clearDynamicText(); - //!Create a dynamic dotted text if the text is too long - void makeDottedText(); - //!Scroll the text once - void scrollText(u32 frameCount); - //!Wrap the text to several lines - void wrapText(); - - wchar_t * text; - std::vector textDyn; - std::vector textDynWidth; - int wrapMode; //!< Wrapping toggle - int textScrollPos; //!< Current starting index of text string for scrolling - int textScrollInitialDelay; //!< Delay to wait before starting to scroll - int textScrollDelay; //!< Scrolling speed - int size; //!< Font size - int maxWidth; //!< Maximum width of the generated text object (for text wrapping) - FreeTypeGX *font; - int textWidth; - int currentSize; - int linestodraw; - glm::vec4 color; - float defaultBlur; - float blurGlowIntensity; - float blurAlpha; - glm::vec4 blurGlowColor; - float internalRenderingScale; -}; - -#endif diff --git a/src/gui/GuiToggle.cpp b/src/gui/GuiToggle.cpp deleted file mode 100644 index 03d5b37..0000000 --- a/src/gui/GuiToggle.cpp +++ /dev/null @@ -1,55 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2016 Maschell - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#include "GuiToggle.h" -/** - * Constructor for the GuiToggle class. - */ - -GuiToggle::GuiToggle(bool checked,f32 width,f32 height) - : GuiButton(width,height) -{ - bChanged = false; - selected = false; - clicked.connect(this,&GuiToggle::OnToggleClick); -} - -/** - * Destructor for the GuiButton class. - */ -GuiToggle::~GuiToggle() -{ - bChanged = false; - selected = false; -} - -void GuiToggle::OnToggleClick(GuiButton *button, const GuiController *controller, GuiTrigger *trigger){ - if(!isStateSet(STATE_DISABLED | STATE_HIDDEN | STATE_DISABLE_INPUT)){ - log_print("Clicked on Toggle: "); - if(selected){ - log_print("Uncheck\n"); - setUnchecked(); - }else{ - log_print("Check\n"); - setChecked(); - } - } -} - -void GuiToggle::update(GuiController * c){ - GuiButton::update(c); -} - diff --git a/src/gui/GuiToggle.h b/src/gui/GuiToggle.h deleted file mode 100644 index c6dc213..0000000 --- a/src/gui/GuiToggle.h +++ /dev/null @@ -1,59 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2016 Maschell - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#ifndef GUI_TOGGLE_H_ -#define GUI_TOGGLE_H_ - -#include "GuiButton.h" -#include "GuiFrame.h" - -//!A simple CheckBox -class GuiToggle : public GuiButton, public sigslot::has_slots<> -{ - public: - //!Constructor - //!\param checked Checked - GuiToggle(bool checked,f32 width,f32 height); - //!Destructor - virtual ~GuiToggle(); - void setValue(bool checked){ - if(selected != checked){ - selected = checked; - bChanged=true; - valueChanged(this,selected); - } - } - void setChecked(){ - setValue(true); - - } - void setUnchecked(){ - setValue(false); - } - bool getValue(){ - return selected; - } - sigslot::signal2 valueChanged; - void OnToggleClick(GuiButton *button, const GuiController *controller, GuiTrigger *trigger); - protected: - - bool selected; - bool bChanged; - - void update(GuiController * c); -}; - -#endif diff --git a/src/gui/GuiTrigger.cpp b/src/gui/GuiTrigger.cpp deleted file mode 100644 index a4a172c..0000000 --- a/src/gui/GuiTrigger.cpp +++ /dev/null @@ -1,174 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#include "GuiElement.h" -#include "GuiController.h" -#include "GuiTrigger.h" - -/** - * Constructor for the GuiTrigger class. - */ -GuiTrigger::GuiTrigger() - : chan(CHANNEL_ALL) - , btns(BUTTON_NONE) - , bClickEverywhere(false) - , bHoldEverywhere(false) - , bSelectionClickEverywhere(false) - , bLastTouched(false) -{ -} - -GuiTrigger::GuiTrigger(u32 ch, u32 btn, bool clickEverywhere, bool holdEverywhere, bool selectionClickEverywhere) - : chan(ch) - , btns(btn) - , bClickEverywhere(clickEverywhere) - , bHoldEverywhere(holdEverywhere) - , bSelectionClickEverywhere(selectionClickEverywhere) - , bLastTouched(false) -{ -} - -/** - * Destructor for the GuiTrigger class. - */ -GuiTrigger::~GuiTrigger() -{ -} - -/** - * Sets a simple trigger. Requires: - * - Element is selected - * - Trigger button is pressed - */ -void GuiTrigger::setTrigger(u32 ch, u32 btn) -{ - chan = ch; - btns = btn; -} - -bool GuiTrigger::left(const GuiController *controller) const -{ - if((controller->chan & chan) == 0) { - return false; - } - if((controller->data.buttons_h | controller->data.buttons_d) & (BUTTON_LEFT | STICK_L_LEFT)) - { - return true; - } - return false; -} - -bool GuiTrigger::right(const GuiController *controller) const -{ - if((controller->chan & chan) == 0) { - return false; - } - if((controller->data.buttons_h | controller->data.buttons_d) & (BUTTON_RIGHT | STICK_L_RIGHT)) - { - return true; - } - return false; -} - -bool GuiTrigger::up(const GuiController *controller) const -{ - if((controller->chan & chan) == 0) { - return false; - } - if((controller->data.buttons_h | controller->data.buttons_d) & (BUTTON_UP | STICK_L_UP)) - { - return true; - } - return false; -} - -bool GuiTrigger::down(const GuiController *controller) const -{ - if((controller->chan & chan) == 0) { - return false; - } - if((controller->data.buttons_h | controller->data.buttons_d) & (BUTTON_DOWN | STICK_L_DOWN)) - { - return true; - } - return false; -} - -bool GuiTrigger::clicked(const GuiController *controller) const -{ - if((controller->chan & chan) == 0) { - return false; - } - - bool bResult = false; - - if(controller->data.touched && controller->data.validPointer && (btns & VPAD_TOUCH) && !controller->lastData.touched) - { - bResult = true; - } - - if(controller->data.buttons_d & btns) - { - bResult = true; - } - return bResult; -} - -bool GuiTrigger::held(const GuiController *controller) const -{ - if((controller->chan & chan) == 0) { - return false; - } - - bool bResult = false; - - if(controller->data.touched && (btns & VPAD_TOUCH) && controller->data.validPointer && controller->lastData.touched && controller->lastData.validPointer) - { - bResult = true; - } - - if(controller->data.buttons_h & btns) - { - bResult = true; - } - - return bResult; -} - -bool GuiTrigger::released(const GuiController *controller) const -{ - if((controller->chan & chan) == 0) { - return false; - } - - if(clicked(controller) || held(controller)) - return false; - - bool bResult = false; - - if(!controller->data.touched && (btns & VPAD_TOUCH) && controller->lastData.touched && controller->lastData.validPointer) - { - bResult = true; - } - - if(controller->data.buttons_r & btns) - { - bResult = true; - } - - return bResult; -} - diff --git a/src/gui/GuiTrigger.h b/src/gui/GuiTrigger.h deleted file mode 100644 index 46a50e1..0000000 --- a/src/gui/GuiTrigger.h +++ /dev/null @@ -1,100 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#ifndef GUI_TRIGGER_H_ -#define GUI_TRIGGER_H_ - -#include "common/types.h" - -//!Menu input trigger management. Determine if action is neccessary based on input data by comparing controller input data to a specific trigger element. -class GuiTrigger -{ -public: - enum eChannels { - CHANNEL_1 = 0x01, - CHANNEL_2 = 0x02, - CHANNEL_3 = 0x04, - CHANNEL_4 = 0x08, - CHANNEL_5 = 0x10, - CHANNEL_ALL = 0xFF - }; - enum eButtons { - BUTTON_NONE = 0x0000, - VPAD_TOUCH = 0x80000000, - BUTTON_Z = 0x20000, - BUTTON_C = 0x10000, - BUTTON_A = 0x8000, - BUTTON_B = 0x4000, - BUTTON_X = 0x2000, - BUTTON_Y = 0x1000, - BUTTON_1 = BUTTON_Y, - BUTTON_2 = BUTTON_X, - BUTTON_LEFT = 0x0800, - BUTTON_RIGHT = 0x0400, - BUTTON_UP = 0x0200, - BUTTON_DOWN = 0x0100, - BUTTON_ZL = 0x0080, - BUTTON_ZR = 0x0040, - BUTTON_L = 0x0020, - BUTTON_R = 0x0010, - BUTTON_PLUS = 0x0008, - BUTTON_MINUS = 0x0004, - BUTTON_HOME = 0x0002, - BUTTON_SYNC = 0x0001, - STICK_R_LEFT = 0x04000000, - STICK_R_RIGHT = 0x02000000, - STICK_R_UP = 0x01000000, - STICK_R_DOWN = 0x00800000, - STICK_L_LEFT = 0x40000000, - STICK_L_RIGHT = 0x20000000, - STICK_L_UP = 0x10000000, - STICK_L_DOWN = 0x08000000 - }; - - //!Constructor - GuiTrigger(); - //!Constructor - GuiTrigger(u32 ch, u32 btns, bool clickEverywhere = false, bool holdEverywhere = false, bool selectionClickEverywhere = false); - //!Destructor - virtual ~GuiTrigger(); - //!Sets a simple trigger. Requires: element is selected, and trigger button is pressed - void setTrigger(u32 ch, u32 btns); - - void setClickEverywhere(bool b) { bClickEverywhere = b; } - void setHoldOnly(bool b) { bHoldEverywhere = b; } - void setSelectionClickEverywhere(bool b) { bSelectionClickEverywhere = b; } - - bool isClickEverywhere() const { return bClickEverywhere; } - bool isHoldEverywhere() const { return bHoldEverywhere; } - bool isSelectionClickEverywhere() const { return bSelectionClickEverywhere; } - - bool left(const GuiController *controller) const; - bool right(const GuiController *controller) const; - bool up(const GuiController *controller) const; - bool down(const GuiController *controller) const; - bool clicked(const GuiController *controller) const; - bool held(const GuiController *controller) const; - bool released(const GuiController *controller) const; -private: - u32 chan; - u32 btns; - bool bClickEverywhere; - bool bHoldEverywhere; - bool bSelectionClickEverywhere; - bool bLastTouched; -}; - -#endif diff --git a/src/gui/Scrollbar.cpp b/src/gui/Scrollbar.cpp deleted file mode 100644 index 84979b2..0000000 --- a/src/gui/Scrollbar.cpp +++ /dev/null @@ -1,277 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2011 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - ***************************************************************************/ -#include "Scrollbar.h" -#include "resources/Resources.h" - -Scrollbar::Scrollbar(int h) - : touchTrigger(GuiTrigger::CHANNEL_1, GuiTrigger::VPAD_TOUCH) - , wpadTouchTrigger(GuiTrigger::CHANNEL_2 | GuiTrigger::CHANNEL_3 | GuiTrigger::CHANNEL_4 | GuiTrigger::CHANNEL_5, GuiTrigger::BUTTON_A) -{ - SelItem = 0; - SelInd = 0; - PageSize = 0; - EntrieCount = 0; - ScrollSpeed = 15; - ScrollState = 0; - - listChanged.connect(this, &Scrollbar::setScrollboxPosition); - - btnSoundClick = Resources::GetSound("button_click.mp3"); - scrollbarLine = Resources::GetImageData("scrollbarLine.png"); - arrowDown = Resources::GetImageData("scrollbarArrowDown.png"); - arrowUp = Resources::GetImageData("scrollbarArrowUp.png"); - scrollbarBox = Resources::GetImageData("scrollbarButton.png"); - - height = h; - width = scrollbarBox->getWidth(); - - MaxHeight = height * 0.5f - (scrollbarBox ? (scrollbarBox->getHeight() * 0.5f) : 0) - (arrowUp ? arrowUp->getHeight() : 0); - MinHeight = -height * 0.5f + (scrollbarBox ? (scrollbarBox->getHeight() * 0.5f) : 0) + (arrowDown ? arrowDown->getHeight() : 0); - - scrollbarLineImg = new GuiImage(scrollbarLine); - scrollbarLineImg->setParent(this); - scrollbarLineImg->setAlignment(ALIGN_CENTER | ALIGN_MIDDLE); - scrollbarLineImg->setPosition(0, 0); - - arrowDownImg = new GuiImage(arrowDown); - arrowUpImg = new GuiImage(arrowUp); - scrollbarBoxImg = new GuiImage(scrollbarBox); - - arrowUpBtn = new GuiButton(arrowUpImg->getWidth(), arrowUpImg->getHeight()); - arrowUpBtn->setParent(this); - arrowUpBtn->setImage(arrowUpImg); - arrowUpBtn->setAlignment(ALIGN_CENTER | ALIGN_TOP); - arrowUpBtn->setPosition(0, 0); - arrowUpBtn->setTrigger(&touchTrigger, 0); - arrowUpBtn->setTrigger(&wpadTouchTrigger, 1); - arrowUpBtn->setSoundClick(btnSoundClick); - arrowUpBtn->setEffectGrow(); - arrowUpBtn->clicked.connect(this, &Scrollbar::OnUpButtonClick); - - arrowDownBtn = new GuiButton(arrowDownImg->getWidth(), arrowDownImg->getHeight()); - arrowDownBtn->setParent(this); - arrowDownBtn->setImage(arrowDownImg); - arrowDownBtn->setAlignment(ALIGN_CENTER | ALIGN_BOTTOM); - arrowDownBtn->setPosition(0, 0); - arrowDownBtn->setTrigger(&touchTrigger, 0); - arrowDownBtn->setTrigger(&wpadTouchTrigger, 1); - arrowDownBtn->setSoundClick(btnSoundClick); - arrowDownBtn->setEffectGrow(); - arrowDownBtn->clicked.connect(this, &Scrollbar::OnDownButtonClick); - - scrollbarBoxBtn = new GuiButton(scrollbarBoxImg->getWidth(), height); - scrollbarBoxBtn->setParent(this); - scrollbarBoxBtn->setImage(scrollbarBoxImg); - scrollbarBoxBtn->setAlignment(ALIGN_CENTER | ALIGN_TOP); - scrollbarBoxBtn->setPosition(0, MaxHeight); - scrollbarBoxBtn->setHoldable(true); - scrollbarBoxBtn->setTrigger(&touchTrigger, 0); - scrollbarBoxBtn->setTrigger(&wpadTouchTrigger, 1); - scrollbarBoxBtn->setEffectGrow(); - scrollbarBoxBtn->held.connect(this, &Scrollbar::OnBoxButtonHold); -} - -Scrollbar::~Scrollbar() -{ - Resources::RemoveSound(btnSoundClick); - Resources::RemoveImageData(scrollbarLine); - Resources::RemoveImageData(arrowDown); - Resources::RemoveImageData(arrowUp); - Resources::RemoveImageData(scrollbarBox); - - delete arrowUpBtn; - delete arrowDownBtn; - delete scrollbarBoxBtn; - - delete scrollbarLineImg; - - delete arrowDownImg; - delete arrowUpImg; - delete scrollbarBoxImg; -} - -void Scrollbar::ScrollOneUp() -{ - if(SelItem == 0 && SelInd > 0) - { - // move list up by 1 - --SelInd; - } - else if(SelInd+SelItem > 0) - { - --SelItem; - } -} - -void Scrollbar::ScrollOneDown() -{ - if(SelInd+SelItem + 1 < EntrieCount) - { - if(SelItem == PageSize-1) - { - // move list down by 1 - SelInd++; - } - else - { - SelItem++; - } - } -} - -void Scrollbar::OnUpButtonClick(GuiButton *button, const GuiController *controller, GuiTrigger *trigger) -{ - if(ScrollState < ScrollSpeed) - return; - - ScrollOneUp(); - - ScrollState = 0; - listChanged(SelItem, SelInd); -} - -void Scrollbar::OnDownButtonClick(GuiButton *button, const GuiController *controller, GuiTrigger *trigger) -{ - if(ScrollState < ScrollSpeed) - return; - - ScrollOneDown(); - - ScrollState = 0; - listChanged(SelItem, SelInd); -} - -void Scrollbar::OnBoxButtonHold(GuiButton *button, const GuiController *controller, GuiTrigger *trigger) -{ - if(EntrieCount == 0) - return; - - if(!controller->data.validPointer) - return; - - int y = controller->data.y - this->getCenterY(); - - int positionWiimote = LIMIT(y - MinHeight, 0, MaxHeight - MinHeight); - - int newSelected = (EntrieCount - 1) - (int) ((float) positionWiimote / (float) (MaxHeight-MinHeight) * (float) (EntrieCount-1)); - - int diff = newSelected-SelInd-SelItem; - - if(newSelected <= 0) - { - SelItem = 0; - SelInd = 0; - } - else if(newSelected >= EntrieCount-1) - { - SelItem = (PageSize-1 < EntrieCount-1) ? PageSize-1 : EntrieCount-1; - SelInd = EntrieCount-PageSize; - } - else if(newSelected < PageSize && SelInd == 0 && diff < 0) - { - SelItem = std::max(SelItem+diff, 0); - } - else if(EntrieCount-newSelected < PageSize && SelInd == EntrieCount-PageSize && diff > 0) - { - SelItem = std::min(SelItem+diff, PageSize-1); - } - else - { - SelInd = LIMIT(SelInd+diff, 0, ((EntrieCount-PageSize < 0) ? 0 : EntrieCount-PageSize)); - } - - ScrollState = 0; - listChanged(SelItem, SelInd); -} - -void Scrollbar::SetPageSize(int size) -{ - if(PageSize == size) - return; - - PageSize = size; - listChanged(SelItem, SelInd); -} - -void Scrollbar::SetSelectedItem(int pos) -{ - if(SelItem == pos) - return; - - SelItem = LIMIT(pos, 0, EntrieCount-1); - listChanged(SelItem, SelInd); -} - -void Scrollbar::SetSelectedIndex(int pos) -{ - if(SelInd == pos) - return; - - SelInd = pos; - listChanged(SelItem, SelInd); -} - -void Scrollbar::SetEntrieCount(int cnt) -{ - if(EntrieCount == cnt) - return; - - EntrieCount = cnt; - listChanged(SelItem, SelInd); -} - -void Scrollbar::setScrollboxPosition(int SelItem, int SelInd) -{ - int position = MaxHeight-(MaxHeight-MinHeight)*(SelInd+SelItem)/(EntrieCount-1); - - if(position < MinHeight || (SelInd+SelItem >= EntrieCount-1)) - position = MinHeight; - else if(position > MaxHeight || (SelInd+SelItem) == 0) - position = MaxHeight; - - scrollbarBoxBtn->setPosition(0, position); -} - -void Scrollbar::draw(CVideo * video) -{ - scrollbarLineImg->draw(video); - arrowUpBtn->draw(video); - arrowDownBtn->draw(video); - scrollbarBoxBtn->draw(video); - - updateEffects(); -} - -void Scrollbar::update(GuiController * t) -{ - if(this->isStateSet(STATE_DISABLED)) - return; - - arrowUpBtn->update(t); - arrowDownBtn->update(t); - scrollbarBoxBtn->update(t); - - ++ScrollState; -} - diff --git a/src/gui/Scrollbar.h b/src/gui/Scrollbar.h deleted file mode 100644 index cd7fc94..0000000 --- a/src/gui/Scrollbar.h +++ /dev/null @@ -1,84 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2011 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - ***************************************************************************/ -#ifndef SCROLLBAR_HPP_ -#define SCROLLBAR_HPP_ - -#include "gui/GuiElement.h" -#include "gui/GuiButton.h" - -class Scrollbar : public GuiElement, public sigslot::has_slots<> -{ - public: - Scrollbar(int height); - virtual ~Scrollbar(); - void ScrollOneUp(); - void ScrollOneDown(); - int GetSelectedItem() { return SelItem; } - int GetSelectedIndex() { return SelInd; } - void draw(CVideo * video); - void update(GuiController * t); - - //! Signals - sigslot::signal2 listChanged; - //! Slots - void SetPageSize(int size); - void SetRowSize(int size); - void SetSelectedItem(int pos); - void SetSelectedIndex(int pos); - void SetEntrieCount(int cnt); - protected: - void setScrollboxPosition(int SelItem, int SelInd); - void OnUpButtonClick(GuiButton *button, const GuiController *controller, GuiTrigger *trigger); - void OnDownButtonClick(GuiButton *button, const GuiController *controller, GuiTrigger *trigger); - void OnBoxButtonHold(GuiButton *button, const GuiController *controller, GuiTrigger *trigger); - - u32 ScrollState; - u16 ScrollSpeed; - - int MinHeight; - int MaxHeight; - int SelItem; - int SelInd; - int PageSize; - int EntrieCount; - int pressedChan; - - GuiButton * arrowUpBtn; - GuiButton * arrowDownBtn; - GuiButton * scrollbarBoxBtn; - GuiImage * scrollbarLineImg; - GuiImage * arrowDownImg; - GuiImage * arrowUpImg; - GuiImage * scrollbarBoxImg; - GuiImageData * scrollbarLine; - GuiImageData * arrowDown; - GuiImageData * arrowUp; - GuiImageData * scrollbarBox; - GuiSound * btnSoundClick; - - GuiTrigger touchTrigger; - GuiTrigger wpadTouchTrigger; -}; - -#endif diff --git a/src/gui/VPadController.h b/src/gui/VPadController.h deleted file mode 100644 index 83e437d..0000000 --- a/src/gui/VPadController.h +++ /dev/null @@ -1,62 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#ifndef VPAD_CONTROLLER_H_ -#define VPAD_CONTROLLER_H_ - -#include -#include "GuiController.h" - -class VPadController : public GuiController -{ -public: - //!Constructor - VPadController(int channel) - : GuiController(channel) - { - memset(&vpad, 0, sizeof(vpad)); - } - - //!Destructor - virtual ~VPadController() {} - - bool update(int width, int height) - { - lastData = data; - - VPADReadError vpadError = VPAD_READ_NO_SAMPLES; - VPADRead(0, &vpad, 1, &vpadError); - - if(vpadError == VPAD_READ_SUCCESS) - { - data.buttons_r = vpad.release; - data.buttons_h = vpad.hold; - data.buttons_d = vpad.trigger; - data.validPointer = !vpad.tpNormal.validity; - data.touched = vpad.tpNormal.touched; - //! calculate the screen offsets - data.x = -(width >> 1) + (int)((vpad.tpFiltered1.x * width) >> 12); - data.y = (height >> 1) - (int)(height - ((vpad.tpFiltered1.y * height) >> 12)); - return true; - } - return false; - } - -private: - VPADStatus vpad; -}; - -#endif diff --git a/src/gui/WPadController.h b/src/gui/WPadController.h deleted file mode 100644 index 26d1d98..0000000 --- a/src/gui/WPadController.h +++ /dev/null @@ -1,179 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#ifndef WPAD_CONTROLLER_H_ -#define WPAD_CONTROLLER_H_ - -#include "GuiController.h" -#include "dynamic_libs/padscore_functions.h" - -class WPadController : public GuiController -{ -public: - //!Constructor - WPadController(int channel) - : GuiController(channel) - { - memset(&kpadData, 0, sizeof(kpadData)); - } - - //!Destructor - virtual ~WPadController() {} - - u32 remapWiiMoteButtons(u32 buttons) - { - u32 conv_buttons = 0; - - if(buttons & WPAD_BUTTON_LEFT) - conv_buttons |= GuiTrigger::BUTTON_LEFT; - - if(buttons & WPAD_BUTTON_RIGHT) - conv_buttons |= GuiTrigger::BUTTON_RIGHT; - - if(buttons & WPAD_BUTTON_DOWN) - conv_buttons |= GuiTrigger::BUTTON_DOWN; - - if(buttons & WPAD_BUTTON_UP) - conv_buttons |= GuiTrigger::BUTTON_UP; - - if(buttons & WPAD_BUTTON_PLUS) - conv_buttons |= GuiTrigger::BUTTON_PLUS; - - if(buttons & WPAD_BUTTON_2) - conv_buttons |= GuiTrigger::BUTTON_2; - - if(buttons & WPAD_BUTTON_1) - conv_buttons |= GuiTrigger::BUTTON_1; - - if(buttons & WPAD_BUTTON_B) - conv_buttons |= GuiTrigger::BUTTON_B; - - if(buttons & WPAD_BUTTON_A) - conv_buttons |= GuiTrigger::BUTTON_A; - - if(buttons & WPAD_BUTTON_MINUS) - conv_buttons |= GuiTrigger::BUTTON_MINUS; - - if(buttons & WPAD_BUTTON_Z) - conv_buttons |= GuiTrigger::BUTTON_Z; - - if(buttons & WPAD_BUTTON_C) - conv_buttons |= GuiTrigger::BUTTON_C; - - if(buttons & WPAD_BUTTON_HOME) - conv_buttons |= GuiTrigger::BUTTON_HOME; - - return conv_buttons; - } - u32 remapClassicButtons(u32 buttons) - { - u32 conv_buttons = 0; - - if(buttons & WPAD_CLASSIC_BUTTON_LEFT) - conv_buttons |= GuiTrigger::BUTTON_LEFT; - - if(buttons & WPAD_CLASSIC_BUTTON_RIGHT) - conv_buttons |= GuiTrigger::BUTTON_RIGHT; - - if(buttons & WPAD_CLASSIC_BUTTON_DOWN) - conv_buttons |= GuiTrigger::BUTTON_DOWN; - - if(buttons & WPAD_CLASSIC_BUTTON_UP) - conv_buttons |= GuiTrigger::BUTTON_UP; - - if(buttons & WPAD_CLASSIC_BUTTON_PLUS) - conv_buttons |= GuiTrigger::BUTTON_PLUS; - - if(buttons & WPAD_CLASSIC_BUTTON_X) - conv_buttons |= GuiTrigger::BUTTON_X; - - if(buttons & WPAD_CLASSIC_BUTTON_Y) - conv_buttons |= GuiTrigger::BUTTON_Y; - - if(buttons & WPAD_CLASSIC_BUTTON_B) - conv_buttons |= GuiTrigger::BUTTON_B; - - if(buttons & WPAD_CLASSIC_BUTTON_A) - conv_buttons |= GuiTrigger::BUTTON_A; - - if(buttons & WPAD_CLASSIC_BUTTON_MINUS) - conv_buttons |= GuiTrigger::BUTTON_MINUS; - - if(buttons & WPAD_CLASSIC_BUTTON_HOME) - conv_buttons |= GuiTrigger::BUTTON_HOME; - - if(buttons & WPAD_CLASSIC_BUTTON_ZR) - conv_buttons |= GuiTrigger::BUTTON_ZR; - - if(buttons & WPAD_CLASSIC_BUTTON_ZL) - conv_buttons |= GuiTrigger::BUTTON_ZL; - - if(buttons & WPAD_CLASSIC_BUTTON_R) - conv_buttons |= GuiTrigger::BUTTON_R; - - if(buttons & WPAD_CLASSIC_BUTTON_L) - conv_buttons |= GuiTrigger::BUTTON_L; - - return conv_buttons; - } - - bool update(int width, int height) - { - lastData = data; - - u32 controller_type; - - //! check if the controller is connected - if(WPADProbe(chanIdx-1, &controller_type) != 0) - return false; - - KPADRead(chanIdx-1, &kpadData, 1); - - if(kpadData.device_type <= 1) - { - data.buttons_r = remapWiiMoteButtons(kpadData.btns_r); - data.buttons_h = remapWiiMoteButtons(kpadData.btns_h); - data.buttons_d = remapWiiMoteButtons(kpadData.btns_d); - } - else - { - data.buttons_r = remapClassicButtons(kpadData.classic.btns_r); - data.buttons_h = remapClassicButtons(kpadData.classic.btns_h); - data.buttons_d = remapClassicButtons(kpadData.classic.btns_d); - } - - data.validPointer = (kpadData.pos_valid == 1 || kpadData.pos_valid == 2) && (kpadData.pos_x >= -1.0f && kpadData.pos_x <= 1.0f) && (kpadData.pos_y >= -1.0f && kpadData.pos_y <= 1.0f); - //! calculate the screen offsets if pointer is valid else leave old value - if(data.validPointer) - { - data.x = (width >> 1) * kpadData.pos_x; - data.y = (height >> 1) * (-kpadData.pos_y); - - if(kpadData.angle_y > 0.0f) - data.pointerAngle = (-kpadData.angle_x + 1.0f) * 0.5f * 180.0f; - else - data.pointerAngle = (kpadData.angle_x + 1.0f) * 0.5f * 180.0f - 180.0f; - } - - return true; - } - -private: - KPADData kpadData; - u32 lastButtons; -}; - -#endif diff --git a/src/gui/sigslot.h b/src/gui/sigslot.h deleted file mode 100644 index d1f3844..0000000 --- a/src/gui/sigslot.h +++ /dev/null @@ -1,2731 +0,0 @@ -// sigslot.h: Signal/Slot classes -// -// Written by Sarah Thompson (sarah@telergy.com) 2002. -// -// License: Public domain. You are free to use this code however you like, with the proviso that -// the author takes on no responsibility or liability for any use. -// -// QUICK DOCUMENTATION -// -// (see also the full documentation at http://sigslot.sourceforge.net/) -// -// #define switches -// SIGSLOT_PURE_ISO - Define this to force ISO C++ compliance. This also disables -// all of the thread safety support on platforms where it is -// available. -// -// SIGSLOT_USE_POSIX_THREADS - Force use of Posix threads when using a C++ compiler other than -// gcc on a platform that supports Posix threads. (When using gcc, -// this is the default - use SIGSLOT_PURE_ISO to disable this if -// necessary) -// -// SIGSLOT_DEFAULT_MT_POLICY - Where thread support is enabled, this defaults to multi_threaded_global. -// Otherwise, the default is single_threaded. #define this yourself to -// override the default. In pure ISO mode, anything other than -// single_threaded will cause a compiler error. -// -// PLATFORM NOTES -// -// Win32 - On Win32, the WIN32 symbol must be #defined. Most mainstream -// compilers do this by default, but you may need to define it -// yourself if your build environment is less standard. This causes -// the Win32 thread support to be compiled in and used automatically. -// -// Unix/Linux/BSD, etc. - If you're using gcc, it is assumed that you have Posix threads -// available, so they are used automatically. You can override this -// (as under Windows) with the SIGSLOT_PURE_ISO switch. If you're using -// something other than gcc but still want to use Posix threads, you -// need to #define SIGSLOT_USE_POSIX_THREADS. -// -// ISO C++ - If none of the supported platforms are detected, or if -// SIGSLOT_PURE_ISO is defined, all multithreading support is turned off, -// along with any code that might cause a pure ISO C++ environment to -// complain. Before you ask, gcc -ansi -pedantic won't compile this -// library, but gcc -ansi is fine. Pedantic mode seems to throw a lot of -// errors that aren't really there. If you feel like investigating this, -// please contact the author. -// -// -// THREADING MODES -// -// single_threaded - Your program is assumed to be single threaded from the point of view -// of signal/slot usage (i.e. all objects using signals and slots are -// created and destroyed from a single thread). Behaviour if objects are -// destroyed concurrently is undefined (i.e. you'll get the occasional -// segmentation fault/memory exception). -// -// multi_threaded_global - Your program is assumed to be multi threaded. Objects using signals and -// slots can be safely created and destroyed from any thread, even when -// connections exist. In multi_threaded_global mode, this is achieved by a -// single global mutex (actually a critical section on Windows because they -// are faster). This option uses less OS resources, but results in more -// opportunities for contention, possibly resulting in more context switches -// than are strictly necessary. -// -// multi_threaded_local - Behaviour in this mode is essentially the same as multi_threaded_global, -// except that each signal, and each object that inherits has_slots, all -// have their own mutex/critical section. In practice, this means that -// mutex collisions (and hence context switches) only happen if they are -// absolutely essential. However, on some platforms, creating a lot of -// mutexes can slow down the whole OS, so use this option with care. -// -// USING THE LIBRARY -// -// See the full documentation at http://sigslot.sourceforge.net/ -// -// -#ifndef SIGSLOT_H__ -#define SIGSLOT_H__ - -#include -#include - -#define _SIGSLOT_SINGLE_THREADED - -#ifndef SIGSLOT_DEFAULT_MT_POLICY -# ifdef _SIGSLOT_SINGLE_THREADED -# define SIGSLOT_DEFAULT_MT_POLICY single_threaded -# else -# define SIGSLOT_DEFAULT_MT_POLICY multi_threaded_local -# endif -#endif - - -namespace sigslot { - - class single_threaded - { - public: - single_threaded() - { - ; - } - - virtual ~single_threaded() - { - ; - } - - virtual void lock() - { - ; - } - - virtual void unlock() - { - ; - } - }; - -#ifdef _SIGSLOT_HAS_WIN32_THREADS - // The multi threading policies only get compiled in if they are enabled. - class multi_threaded_global - { - public: - multi_threaded_global() - { - static bool isinitialised = false; - - if(!isinitialised) - { - InitializeCriticalSection(get_critsec()); - isinitialised = true; - } - } - - multi_threaded_global(const multi_threaded_global&) - { - ; - } - - virtual ~multi_threaded_global() - { - ; - } - - virtual void lock() - { - EnterCriticalSection(get_critsec()); - } - - virtual void unlock() - { - LeaveCriticalSection(get_critsec()); - } - - private: - CRITICAL_SECTION* get_critsec() - { - static CRITICAL_SECTION g_critsec; - return &g_critsec; - } - }; - - class multi_threaded_local - { - public: - multi_threaded_local() - { - InitializeCriticalSection(&m_critsec); - } - - multi_threaded_local(const multi_threaded_local&) - { - InitializeCriticalSection(&m_critsec); - } - - virtual ~multi_threaded_local() - { - DeleteCriticalSection(&m_critsec); - } - - virtual void lock() - { - EnterCriticalSection(&m_critsec); - } - - virtual void unlock() - { - LeaveCriticalSection(&m_critsec); - } - - private: - CRITICAL_SECTION m_critsec; - }; -#endif // _SIGSLOT_HAS_WIN32_THREADS - -#ifdef _SIGSLOT_HAS_POSIX_THREADS - // The multi threading policies only get compiled in if they are enabled. - class multi_threaded_global - { - public: - multi_threaded_global() - { - pthread_mutex_init(get_mutex(), NULL); - } - - multi_threaded_global(const multi_threaded_global&) - { - ; - } - - virtual ~multi_threaded_global() - { - ; - } - - virtual void lock() - { - pthread_mutex_lock(get_mutex()); - } - - virtual void unlock() - { - pthread_mutex_unlock(get_mutex()); - } - - private: - pthread_mutex_t* get_mutex() - { - static pthread_mutex_t g_mutex; - return &g_mutex; - } - }; - - class multi_threaded_local - { - public: - multi_threaded_local() - { - pthread_mutex_init(&m_mutex, NULL); - } - - multi_threaded_local(const multi_threaded_local&) - { - pthread_mutex_init(&m_mutex, NULL); - } - - virtual ~multi_threaded_local() - { - pthread_mutex_destroy(&m_mutex); - } - - virtual void lock() - { - pthread_mutex_lock(&m_mutex); - } - - virtual void unlock() - { - pthread_mutex_unlock(&m_mutex); - } - - private: - pthread_mutex_t m_mutex; - }; -#endif // _SIGSLOT_HAS_POSIX_THREADS - -#ifdef _SIGSLOT_HAS_LWP_THREADS - - class multi_threaded_global - { - public: - multi_threaded_global() - { - ; - } - - multi_threaded_global(const multi_threaded_global&) - { - ; - } - - virtual ~multi_threaded_global() - { - ; - } - - virtual void lock() - { - ; - } - - virtual void unlock() - { - ; - } - }; - - class multi_threaded_local - { - public: - multi_threaded_local() - { - ; - } - - multi_threaded_local(const multi_threaded_local&) - { - ; - } - - virtual ~multi_threaded_local() - { - } - - virtual void lock() - { - ; - } - - virtual void unlock() - { - ; - } - }; - -#endif // _SIGSLOT_HAS_LWP_THREADS - - template - class lock_block - { - public: - mt_policy *m_mutex; - - lock_block(mt_policy *mtx) - : m_mutex(mtx) - { - m_mutex->lock(); - } - - ~lock_block() - { - m_mutex->unlock(); - } - }; - - template - class has_slots; - - template - class _connection_base0 - { - public: - virtual ~_connection_base0() { ; } - virtual has_slots* getdest() const = 0; - virtual void emit() = 0; - virtual _connection_base0* clone() = 0; - virtual _connection_base0* duplicate(has_slots* pnewdest) = 0; - }; - - template - class _connection_base1 - { - public: - virtual ~_connection_base1() { ; } - virtual has_slots* getdest() const = 0; - virtual void emit(arg1_type) = 0; - virtual _connection_base1* clone() = 0; - virtual _connection_base1* duplicate(has_slots* pnewdest) = 0; - }; - - template - class _connection_base2 - { - public: - virtual ~_connection_base2() { ; } - virtual has_slots* getdest() const = 0; - virtual void emit(arg1_type, arg2_type) = 0; - virtual _connection_base2* clone() = 0; - virtual _connection_base2* duplicate(has_slots* pnewdest) = 0; - }; - - template - class _connection_base3 - { - public: - virtual ~_connection_base3() { ; } - virtual has_slots* getdest() const = 0; - virtual void emit(arg1_type, arg2_type, arg3_type) = 0; - virtual _connection_base3* clone() = 0; - virtual _connection_base3* duplicate(has_slots* pnewdest) = 0; - }; - - template - class _connection_base4 - { - public: - virtual ~_connection_base4() { ; } - virtual has_slots* getdest() const = 0; - virtual void emit(arg1_type, arg2_type, arg3_type, arg4_type) = 0; - virtual _connection_base4* clone() = 0; - virtual _connection_base4* duplicate(has_slots* pnewdest) = 0; - }; - - template - class _connection_base5 - { - public: - virtual ~_connection_base5() { ; } - virtual has_slots* getdest() const = 0; - virtual void emit(arg1_type, arg2_type, arg3_type, arg4_type, - arg5_type) = 0; - virtual _connection_base5* clone() = 0; - virtual _connection_base5* duplicate(has_slots* pnewdest) = 0; - }; - - template - class _connection_base6 - { - public: - virtual ~_connection_base6() { ; } - virtual has_slots* getdest() const = 0; - virtual void emit(arg1_type, arg2_type, arg3_type, arg4_type, arg5_type, - arg6_type) = 0; - virtual _connection_base6* clone() = 0; - virtual _connection_base6* duplicate(has_slots* pnewdest) = 0; - }; - - template - class _connection_base7 - { - public: - virtual ~_connection_base7() { ; } - virtual has_slots* getdest() const = 0; - virtual void emit(arg1_type, arg2_type, arg3_type, arg4_type, arg5_type, - arg6_type, arg7_type) = 0; - virtual _connection_base7* clone() = 0; - virtual _connection_base7* duplicate(has_slots* pnewdest) = 0; - }; - - template - class _connection_base8 - { - public: - virtual ~_connection_base8() { ; } - virtual has_slots* getdest() const = 0; - virtual void emit(arg1_type, arg2_type, arg3_type, arg4_type, arg5_type, - arg6_type, arg7_type, arg8_type) = 0; - virtual _connection_base8* clone() = 0; - virtual _connection_base8* duplicate(has_slots* pnewdest) = 0; - }; - - template - class _signal_base : public mt_policy - { - public: - virtual void slot_disconnect(has_slots* pslot) = 0; - virtual void slot_duplicate(const has_slots* poldslot, has_slots* pnewslot) = 0; - }; - - template - class has_slots : public mt_policy - { - private: - typedef typename std::set<_signal_base *> sender_set; - typedef typename sender_set::const_iterator const_iterator; - - public: - has_slots() - { - ; - } - - has_slots(const has_slots& hs) - : mt_policy(hs) - { - lock_block lock(this); - const_iterator it = hs.m_senders.begin(); - const_iterator itEnd = hs.m_senders.end(); - - while(it != itEnd) - { - (*it)->slot_duplicate(&hs, this); - m_senders.insert(*it); - ++it; - } - } - - void signal_connect(_signal_base* sender) - { - lock_block lock(this); - m_senders.insert(sender); - } - - void signal_disconnect(_signal_base* sender) - { - lock_block lock(this); - m_senders.erase(sender); - } - - virtual ~has_slots() - { - disconnect_all(); - } - - void disconnect_all() - { - lock_block lock(this); - const_iterator it = m_senders.begin(); - const_iterator itEnd = m_senders.end(); - - while(it != itEnd) - { - (*it)->slot_disconnect(this); - ++it; - } - - m_senders.erase(m_senders.begin(), m_senders.end()); - } - - private: - sender_set m_senders; - }; - - template - class _signal_base0 : public _signal_base - { - public: - typedef typename std::list<_connection_base0 *> connections_list; - typedef typename connections_list::const_iterator const_iterator; - typedef typename connections_list::iterator iterator; - - _signal_base0() - { - ; - } - - _signal_base0(const _signal_base0& s) - : _signal_base(s) - { - lock_block lock(this); - const_iterator it = s.m_connected_slots.begin(); - const_iterator itEnd = s.m_connected_slots.end(); - - while(it != itEnd) - { - (*it)->getdest()->signal_connect(this); - m_connected_slots.push_back((*it)->clone()); - - ++it; - } - } - - ~_signal_base0() - { - disconnect_all(); - } - - void disconnect_all() - { - lock_block lock(this); - const_iterator it = m_connected_slots.begin(); - const_iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - (*it)->getdest()->signal_disconnect(this); - delete *it; - - ++it; - } - - m_connected_slots.erase(m_connected_slots.begin(), m_connected_slots.end()); - } - - void disconnect(has_slots* pclass) - { - lock_block lock(this); - iterator it = m_connected_slots.begin(); - iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - if((*it)->getdest() == pclass) - { - delete *it; - m_connected_slots.erase(it); - pclass->signal_disconnect(this); - return; - } - - ++it; - } - } - - bool connected() - { - return m_connected_slots.size() != 0; - } - - void slot_disconnect(has_slots* pslot) - { - lock_block lock(this); - iterator it = m_connected_slots.begin(); - iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - iterator itNext = it; - ++itNext; - - if((*it)->getdest() == pslot) - { - delete *it; - m_connected_slots.erase(it); - // delete *it; - } - - it = itNext; - } - } - - void slot_duplicate(const has_slots* oldtarget, has_slots* newtarget) - { - lock_block lock(this); - iterator it = m_connected_slots.begin(); - iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - if((*it)->getdest() == oldtarget) - { - m_connected_slots.push_back((*it)->duplicate(newtarget)); - } - - ++it; - } - } - - protected: - connections_list m_connected_slots; - }; - - template - class _signal_base1 : public _signal_base - { - public: - typedef typename std::list<_connection_base1 *> connections_list; - typedef typename connections_list::const_iterator const_iterator; - typedef typename connections_list::iterator iterator; - - _signal_base1() - { - ; - } - - _signal_base1(const _signal_base1& s) - : _signal_base(s) - { - lock_block lock(this); - const_iterator it = s.m_connected_slots.begin(); - const_iterator itEnd = s.m_connected_slots.end(); - - while(it != itEnd) - { - (*it)->getdest()->signal_connect(this); - m_connected_slots.push_back((*it)->clone()); - - ++it; - } - } - - void slot_duplicate(const has_slots* oldtarget, has_slots* newtarget) - { - lock_block lock(this); - iterator it = m_connected_slots.begin(); - iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - if((*it)->getdest() == oldtarget) - { - m_connected_slots.push_back((*it)->duplicate(newtarget)); - } - - ++it; - } - } - - ~_signal_base1() - { - disconnect_all(); - } - - void disconnect_all() - { - lock_block lock(this); - const_iterator it = m_connected_slots.begin(); - const_iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - (*it)->getdest()->signal_disconnect(this); - delete *it; - - ++it; - } - - m_connected_slots.erase(m_connected_slots.begin(), m_connected_slots.end()); - } - - void disconnect(has_slots* pclass) - { - lock_block lock(this); - iterator it = m_connected_slots.begin(); - iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - if((*it)->getdest() == pclass) - { - delete *it; - m_connected_slots.erase(it); - pclass->signal_disconnect(this); - return; - } - - ++it; - } - } - - bool connected() - { - return m_connected_slots.size() != 0; - } - - void slot_disconnect(has_slots* pslot) - { - lock_block lock(this); - iterator it = m_connected_slots.begin(); - iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - iterator itNext = it; - ++itNext; - - if((*it)->getdest() == pslot) - { - delete *it; - m_connected_slots.erase(it); - // delete *it; - } - - it = itNext; - } - } - - - protected: - connections_list m_connected_slots; - }; - - template - class _signal_base2 : public _signal_base - { - public: - typedef typename std::list<_connection_base2 *> - connections_list; - typedef typename connections_list::const_iterator const_iterator; - typedef typename connections_list::iterator iterator; - - _signal_base2() - { - ; - } - - _signal_base2(const _signal_base2& s) - : _signal_base(s) - { - lock_block lock(this); - const_iterator it = s.m_connected_slots.begin(); - const_iterator itEnd = s.m_connected_slots.end(); - - while(it != itEnd) - { - (*it)->getdest()->signal_connect(this); - m_connected_slots.push_back((*it)->clone()); - - ++it; - } - } - - void slot_duplicate(const has_slots* oldtarget, has_slots* newtarget) - { - lock_block lock(this); - iterator it = m_connected_slots.begin(); - iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - if((*it)->getdest() == oldtarget) - { - m_connected_slots.push_back((*it)->duplicate(newtarget)); - } - - ++it; - } - } - - ~_signal_base2() - { - disconnect_all(); - } - - void disconnect_all() - { - lock_block lock(this); - const_iterator it = m_connected_slots.begin(); - const_iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - (*it)->getdest()->signal_disconnect(this); - delete *it; - - ++it; - } - - m_connected_slots.erase(m_connected_slots.begin(), m_connected_slots.end()); - } - - void disconnect(has_slots* pclass) - { - lock_block lock(this); - iterator it = m_connected_slots.begin(); - iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - if((*it)->getdest() == pclass) - { - delete *it; - m_connected_slots.erase(it); - pclass->signal_disconnect(this); - return; - } - - ++it; - } - } - - bool connected() - { - return m_connected_slots.size() != 0; - } - - void slot_disconnect(has_slots* pslot) - { - lock_block lock(this); - iterator it = m_connected_slots.begin(); - iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - iterator itNext = it; - ++itNext; - - if((*it)->getdest() == pslot) - { - delete *it; - m_connected_slots.erase(it); - // delete *it; - } - - it = itNext; - } - } - - protected: - connections_list m_connected_slots; - }; - - template - class _signal_base3 : public _signal_base - { - public: - typedef std::list<_connection_base3 *> - connections_list; - - typedef typename connections_list::const_iterator const_iterator; - typedef typename connections_list::iterator iterator; - _signal_base3() - { - ; - } - - _signal_base3(const _signal_base3& s) - : _signal_base(s) - { - lock_block lock(this); - const_iterator it = s.m_connected_slots.begin(); - const_iterator itEnd = s.m_connected_slots.end(); - - while(it != itEnd) - { - (*it)->getdest()->signal_connect(this); - m_connected_slots.push_back((*it)->clone()); - - ++it; - } - } - - void slot_duplicate(const has_slots* oldtarget, has_slots* newtarget) - { - lock_block lock(this); - iterator it = m_connected_slots.begin(); - iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - if((*it)->getdest() == oldtarget) - { - m_connected_slots.push_back((*it)->duplicate(newtarget)); - } - - ++it; - } - } - - ~_signal_base3() - { - disconnect_all(); - } - - void disconnect_all() - { - lock_block lock(this); - const_iterator it = m_connected_slots.begin(); - const_iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - (*it)->getdest()->signal_disconnect(this); - delete *it; - - ++it; - } - - m_connected_slots.erase(m_connected_slots.begin(), m_connected_slots.end()); - } - - void disconnect(has_slots* pclass) - { - lock_block lock(this); - iterator it = m_connected_slots.begin(); - iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - if((*it)->getdest() == pclass) - { - delete *it; - m_connected_slots.erase(it); - pclass->signal_disconnect(this); - return; - } - - ++it; - } - } - - bool connected() - { - return m_connected_slots.size() != 0; - } - - void slot_disconnect(has_slots* pslot) - { - lock_block lock(this); - iterator it = m_connected_slots.begin(); - iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - iterator itNext = it; - ++itNext; - - if((*it)->getdest() == pslot) - { - delete *it; - m_connected_slots.erase(it); - // delete *it; - } - - it = itNext; - } - } - - protected: - connections_list m_connected_slots; - }; - - template - class _signal_base4 : public _signal_base - { - public: - typedef std::list<_connection_base4 *> connections_list; - typedef typename connections_list::const_iterator const_iterator; - typedef typename connections_list::iterator iterator; - - _signal_base4() - { - ; - } - - _signal_base4(const _signal_base4& s) - : _signal_base(s) - { - lock_block lock(this); - const_iterator it = s.m_connected_slots.begin(); - const_iterator itEnd = s.m_connected_slots.end(); - - while(it != itEnd) - { - (*it)->getdest()->signal_connect(this); - m_connected_slots.push_back((*it)->clone()); - - ++it; - } - } - - void slot_duplicate(const has_slots* oldtarget, has_slots* newtarget) - { - lock_block lock(this); - iterator it = m_connected_slots.begin(); - iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - if((*it)->getdest() == oldtarget) - { - m_connected_slots.push_back((*it)->duplicate(newtarget)); - } - - ++it; - } - } - - ~_signal_base4() - { - disconnect_all(); - } - - void disconnect_all() - { - lock_block lock(this); - const_iterator it = m_connected_slots.begin(); - const_iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - (*it)->getdest()->signal_disconnect(this); - delete *it; - - ++it; - } - - m_connected_slots.erase(m_connected_slots.begin(), m_connected_slots.end()); - } - - void disconnect(has_slots* pclass) - { - lock_block lock(this); - iterator it = m_connected_slots.begin(); - iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - if((*it)->getdest() == pclass) - { - delete *it; - this->m_connected_slots.erase(it); - pclass->signal_disconnect(this); - return; - } - - ++it; - } - } - - bool connected() - { - return m_connected_slots.size() != 0; - } - - void slot_disconnect(has_slots* pslot) - { - lock_block lock(this); - iterator it = m_connected_slots.begin(); - iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - iterator itNext = it; - ++itNext; - - if((*it)->getdest() == pslot) - { - delete *it; - m_connected_slots.erase(it); - // delete *it; - } - - it = itNext; - } - } - - protected: - connections_list m_connected_slots; - }; - - template - class _signal_base5 : public _signal_base - { - public: - typedef std::list<_connection_base5 *> connections_list; - typedef typename connections_list::const_iterator const_iterator; - typedef typename connections_list::iterator iterator; - - _signal_base5() - { - ; - } - - _signal_base5(const _signal_base5& s) - : _signal_base(s) - { - lock_block lock(this); - const_iterator it = s.m_connected_slots.begin(); - const_iterator itEnd = s.m_connected_slots.end(); - - while(it != itEnd) - { - (*it)->getdest()->signal_connect(this); - m_connected_slots.push_back((*it)->clone()); - - ++it; - } - } - - void slot_duplicate(const has_slots* oldtarget, has_slots* newtarget) - { - lock_block lock(this); - iterator it = m_connected_slots.begin(); - iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - if((*it)->getdest() == oldtarget) - { - m_connected_slots.push_back((*it)->duplicate(newtarget)); - } - - ++it; - } - } - - ~_signal_base5() - { - disconnect_all(); - } - - void disconnect_all() - { - lock_block lock(this); - const_iterator it = m_connected_slots.begin(); - const_iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - (*it)->getdest()->signal_disconnect(this); - delete *it; - - ++it; - } - - m_connected_slots.erase(m_connected_slots.begin(), m_connected_slots.end()); - } - - void disconnect(has_slots* pclass) - { - lock_block lock(this); - iterator it = m_connected_slots.begin(); - iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - if((*it)->getdest() == pclass) - { - delete *it; - m_connected_slots.erase(it); - pclass->signal_disconnect(this); - return; - } - - ++it; - } - } - - bool connected() - { - return m_connected_slots.size() != 0; - } - - void slot_disconnect(has_slots* pslot) - { - lock_block lock(this); - iterator it = m_connected_slots.begin(); - iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - iterator itNext = it; - ++itNext; - - if((*it)->getdest() == pslot) - { - delete *it; - m_connected_slots.erase(it); - // delete *it; - } - - it = itNext; - } - } - - protected: - connections_list m_connected_slots; - }; - - template - class _signal_base6 : public _signal_base - { - public: - typedef std::list<_connection_base6 *> connections_list; - typedef typename connections_list::const_iterator const_iterator; - typedef typename connections_list::iterator iterator; - - _signal_base6() - { - ; - } - - _signal_base6(const _signal_base6& s) - : _signal_base(s) - { - lock_block lock(this); - const_iterator it = s.m_connected_slots.begin(); - const_iterator itEnd = s.m_connected_slots.end(); - - while(it != itEnd) - { - (*it)->getdest()->signal_connect(this); - m_connected_slots.push_back((*it)->clone()); - - ++it; - } - } - - void slot_duplicate(const has_slots* oldtarget, has_slots* newtarget) - { - lock_block lock(this); - iterator it = m_connected_slots.begin(); - iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - if((*it)->getdest() == oldtarget) - { - m_connected_slots.push_back((*it)->duplicate(newtarget)); - } - - ++it; - } - } - - ~_signal_base6() - { - disconnect_all(); - } - - void disconnect_all() - { - lock_block lock(this); - const_iterator it = m_connected_slots.begin(); - const_iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - (*it)->getdest()->signal_disconnect(this); - delete *it; - - ++it; - } - - m_connected_slots.erase(m_connected_slots.begin(), m_connected_slots.end()); - } - - void disconnect(has_slots* pclass) - { - lock_block lock(this); - iterator it = m_connected_slots.begin(); - iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - if((*it)->getdest() == pclass) - { - delete *it; - m_connected_slots.erase(it); - pclass->signal_disconnect(this); - return; - } - - ++it; - } - } - - bool connected() - { - return m_connected_slots.size() != 0; - } - - void slot_disconnect(has_slots* pslot) - { - lock_block lock(this); - iterator it = m_connected_slots.begin(); - iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - iterator itNext = it; - ++itNext; - - if((*it)->getdest() == pslot) - { - delete *it; - m_connected_slots.erase(it); - // delete *it; - } - - it = itNext; - } - } - - protected: - connections_list m_connected_slots; - }; - - template - class _signal_base7 : public _signal_base - { - public: - typedef std::list<_connection_base7 *> connections_list; - typedef typename connections_list::const_iterator const_iterator; - typedef typename connections_list::iterator iterator; - - _signal_base7() - { - ; - } - - _signal_base7(const _signal_base7& s) - : _signal_base(s) - { - lock_block lock(this); - const_iterator it = s.m_connected_slots.begin(); - const_iterator itEnd = s.m_connected_slots.end(); - - while(it != itEnd) - { - (*it)->getdest()->signal_connect(this); - m_connected_slots.push_back((*it)->clone()); - - ++it; - } - } - - void slot_duplicate(const has_slots* oldtarget, has_slots* newtarget) - { - lock_block lock(this); - iterator it = m_connected_slots.begin(); - iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - if((*it)->getdest() == oldtarget) - { - m_connected_slots.push_back((*it)->duplicate(newtarget)); - } - - ++it; - } - } - - ~_signal_base7() - { - disconnect_all(); - } - - void disconnect_all() - { - lock_block lock(this); - const_iterator it = m_connected_slots.begin(); - const_iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - (*it)->getdest()->signal_disconnect(this); - delete *it; - - ++it; - } - - m_connected_slots.erase(m_connected_slots.begin(), m_connected_slots.end()); - } - - void disconnect(has_slots* pclass) - { - lock_block lock(this); - iterator it = m_connected_slots.begin(); - iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - if((*it)->getdest() == pclass) - { - delete *it; - m_connected_slots.erase(it); - pclass->signal_disconnect(this); - return; - } - - ++it; - } - } - - bool connected() - { - return m_connected_slots.size() != 0; - } - - void slot_disconnect(has_slots* pslot) - { - lock_block lock(this); - iterator it = m_connected_slots.begin(); - iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - iterator itNext = it; - ++itNext; - - if((*it)->getdest() == pslot) - { - delete *it; - m_connected_slots.erase(it); - // delete *it; - } - - it = itNext; - } - } - - protected: - connections_list m_connected_slots; - }; - - template - class _signal_base8 : public _signal_base - { - public: - typedef std::list<_connection_base8 *> - connections_list; - typedef typename connections_list::const_iterator const_iterator; - typedef typename connections_list::iterator iterator; - - _signal_base8() - { - ; - } - - _signal_base8(const _signal_base8& s) - : _signal_base(s) - { - lock_block lock(this); - const_iterator it = s.m_connected_slots.begin(); - const_iterator itEnd = s.m_connected_slots.end(); - - while(it != itEnd) - { - (*it)->getdest()->signal_connect(this); - m_connected_slots.push_back((*it)->clone()); - - ++it; - } - } - - void slot_duplicate(const has_slots* oldtarget, has_slots* newtarget) - { - lock_block lock(this); - iterator it = m_connected_slots.begin(); - iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - if((*it)->getdest() == oldtarget) - { - m_connected_slots.push_back((*it)->duplicate(newtarget)); - } - - ++it; - } - } - - ~_signal_base8() - { - disconnect_all(); - } - - void disconnect_all() - { - lock_block lock(this); - const_iterator it = m_connected_slots.begin(); - const_iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - (*it)->getdest()->signal_disconnect(this); - delete *it; - - ++it; - } - - m_connected_slots.erase(m_connected_slots.begin(), m_connected_slots.end()); - } - - void disconnect(has_slots* pclass) - { - lock_block lock(this); - iterator it = m_connected_slots.begin(); - iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - if((*it)->getdest() == pclass) - { - delete *it; - m_connected_slots.erase(it); - pclass->signal_disconnect(this); - return; - } - - ++it; - } - } - - bool connected() - { - return m_connected_slots.size() != 0; - } - - void slot_disconnect(has_slots* pslot) - { - lock_block lock(this); - iterator it = m_connected_slots.begin(); - iterator itEnd = m_connected_slots.end(); - - while(it != itEnd) - { - iterator itNext = it; - ++itNext; - - if((*it)->getdest() == pslot) - { - delete *it; - m_connected_slots.erase(it); - // delete *it; - } - - it = itNext; - } - } - - protected: - connections_list m_connected_slots; - }; - - - template - class _connection0 : public _connection_base0 - { - public: - _connection0() - { - this->pobject = NULL; - this->pmemfun = NULL; - } - - _connection0(dest_type* pobject, void (dest_type::*pmemfun)()) - { - m_pobject = pobject; - m_pmemfun = pmemfun; - } - - virtual ~_connection0() - { - ; - } - - virtual _connection_base0* clone() - { - return new _connection0(*this); - } - - virtual _connection_base0* duplicate(has_slots* pnewdest) - { - return new _connection0((dest_type *)pnewdest, m_pmemfun); - } - - virtual void emit() - { - (m_pobject->*m_pmemfun)(); - } - - virtual has_slots* getdest() const - { - return m_pobject; - } - - private: - dest_type* m_pobject; - void (dest_type::* m_pmemfun)(); - }; - - template - class _connection1 : public _connection_base1 - { - public: - _connection1() - { - this->pobject = NULL; - this->pmemfun = NULL; - } - - _connection1(dest_type* pobject, void (dest_type::*pmemfun)(arg1_type)) - { - m_pobject = pobject; - m_pmemfun = pmemfun; - } - - virtual ~_connection1() - { - ; - } - - virtual _connection_base1* clone() - { - return new _connection1(*this); - } - - virtual _connection_base1* duplicate(has_slots* pnewdest) - { - return new _connection1((dest_type *)pnewdest, m_pmemfun); - } - - virtual void emit(arg1_type a1) - { - (m_pobject->*m_pmemfun)(a1); - } - - virtual has_slots* getdest() const - { - return m_pobject; - } - - private: - dest_type* m_pobject; - void (dest_type::* m_pmemfun)(arg1_type); - }; - - template - class _connection2 : public _connection_base2 - { - public: - _connection2() - { - this->pobject = NULL; - this->pmemfun = NULL; - } - - _connection2(dest_type* pobject, void (dest_type::*pmemfun)(arg1_type, - arg2_type)) - { - m_pobject = pobject; - m_pmemfun = pmemfun; - } - - virtual ~_connection2() - { - ; - } - - - virtual _connection_base2* clone() - { - return new _connection2(*this); - } - - virtual _connection_base2* duplicate(has_slots* pnewdest) - { - return new _connection2((dest_type *)pnewdest, m_pmemfun); - } - - virtual void emit(arg1_type a1, arg2_type a2) - { - (m_pobject->*m_pmemfun)(a1, a2); - } - - virtual has_slots* getdest() const - { - return m_pobject; - } - - private: - dest_type* m_pobject; - void (dest_type::* m_pmemfun)(arg1_type, arg2_type); - }; - - template - class _connection3 : public _connection_base3 - { - public: - _connection3() - { - this->pobject = NULL; - this->pmemfun = NULL; - } - - _connection3(dest_type* pobject, void (dest_type::*pmemfun)(arg1_type, - arg2_type, arg3_type)) - { - m_pobject = pobject; - m_pmemfun = pmemfun; - } - - virtual ~_connection3() - { - ; - } - - - virtual _connection_base3* clone() - { - return new _connection3(*this); - } - - virtual _connection_base3* duplicate(has_slots* pnewdest) - { - return new _connection3((dest_type *)pnewdest, m_pmemfun); - } - - virtual void emit(arg1_type a1, arg2_type a2, arg3_type a3) - { - (m_pobject->*m_pmemfun)(a1, a2, a3); - } - - virtual has_slots* getdest() const - { - return m_pobject; - } - - private: - dest_type* m_pobject; - void (dest_type::* m_pmemfun)(arg1_type, arg2_type, arg3_type); - }; - - template - class _connection4 : public _connection_base4 - { - public: - _connection4() - { - this->pobject = NULL; - this->pmemfun = NULL; - } - - _connection4(dest_type* pobject, void (dest_type::*pmemfun)(arg1_type, - arg2_type, arg3_type, arg4_type)) - { - m_pobject = pobject; - m_pmemfun = pmemfun; - } - - virtual ~_connection4() - { - ; - } - - virtual _connection_base4* clone() - { - return new _connection4(*this); - } - - virtual _connection_base4* duplicate(has_slots* pnewdest) - { - return new _connection4((dest_type *)pnewdest, m_pmemfun); - } - - virtual void emit(arg1_type a1, arg2_type a2, arg3_type a3, - arg4_type a4) - { - (m_pobject->*m_pmemfun)(a1, a2, a3, a4); - } - - virtual has_slots* getdest() const - { - return m_pobject; - } - - private: - dest_type* m_pobject; - void (dest_type::* m_pmemfun)(arg1_type, arg2_type, arg3_type, - arg4_type); - }; - - template - class _connection5 : public _connection_base5 - { - public: - _connection5() - { - this->pobject = NULL; - this->pmemfun = NULL; - } - - _connection5(dest_type* pobject, void (dest_type::*pmemfun)(arg1_type, - arg2_type, arg3_type, arg4_type, arg5_type)) - { - m_pobject = pobject; - m_pmemfun = pmemfun; - } - - virtual ~_connection5() - { - ; - } - - virtual _connection_base5* clone() - { - return new _connection5(*this); - } - - virtual _connection_base5* duplicate(has_slots* pnewdest) - { - return new _connection5((dest_type *)pnewdest, m_pmemfun); - } - - virtual void emit(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4, - arg5_type a5) - { - (m_pobject->*m_pmemfun)(a1, a2, a3, a4, a5); - } - - virtual has_slots* getdest() const - { - return m_pobject; - } - - private: - dest_type* m_pobject; - void (dest_type::* m_pmemfun)(arg1_type, arg2_type, arg3_type, arg4_type, - arg5_type); - }; - - template - class _connection6 : public _connection_base6 - { - public: - _connection6() - { - this->pobject = NULL; - this->pmemfun = NULL; - } - - _connection6(dest_type* pobject, void (dest_type::*pmemfun)(arg1_type, - arg2_type, arg3_type, arg4_type, arg5_type, arg6_type)) - { - m_pobject = pobject; - m_pmemfun = pmemfun; - } - - virtual ~_connection6() - { - ; - } - - virtual _connection_base6* clone() - { - return new _connection6(*this); - } - - virtual _connection_base6* duplicate(has_slots* pnewdest) - { - return new _connection6((dest_type *)pnewdest, m_pmemfun); - } - - virtual void emit(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4, - arg5_type a5, arg6_type a6) - { - (m_pobject->*m_pmemfun)(a1, a2, a3, a4, a5, a6); - } - - virtual has_slots* getdest() const - { - return m_pobject; - } - - private: - dest_type* m_pobject; - void (dest_type::* m_pmemfun)(arg1_type, arg2_type, arg3_type, arg4_type, - arg5_type, arg6_type); - }; - - template - class _connection7 : public _connection_base7 - { - public: - _connection7() - { - this->pobject = NULL; - this->pmemfun = NULL; - } - - _connection7(dest_type* pobject, void (dest_type::*pmemfun)(arg1_type, - arg2_type, arg3_type, arg4_type, arg5_type, arg6_type, arg7_type)) - { - m_pobject = pobject; - m_pmemfun = pmemfun; - } - - virtual ~_connection7() - { - ; - } - - virtual _connection_base7* clone() - { - return new _connection7(*this); - } - - virtual _connection_base7* duplicate(has_slots* pnewdest) - { - return new _connection7((dest_type *)pnewdest, m_pmemfun); - } - - virtual void emit(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4, - arg5_type a5, arg6_type a6, arg7_type a7) - { - (m_pobject->*m_pmemfun)(a1, a2, a3, a4, a5, a6, a7); - } - - virtual has_slots* getdest() const - { - return m_pobject; - } - - private: - dest_type* m_pobject; - void (dest_type::* m_pmemfun)(arg1_type, arg2_type, arg3_type, arg4_type, - arg5_type, arg6_type, arg7_type); - }; - - template - class _connection8 : public _connection_base8 - { - public: - _connection8() - { - this->pobject = NULL; - this->pmemfun = NULL; - } - - _connection8(dest_type* pobject, void (dest_type::*pmemfun)(arg1_type, - arg2_type, arg3_type, arg4_type, arg5_type, arg6_type, - arg7_type, arg8_type)) - { - m_pobject = pobject; - m_pmemfun = pmemfun; - } - - virtual ~_connection8() - { - ; - } - - virtual _connection_base8* clone() - { - return new _connection8(*this); - } - - virtual _connection_base8* duplicate(has_slots* pnewdest) - { - return new _connection8((dest_type *)pnewdest, m_pmemfun); - } - - virtual void emit(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4, - arg5_type a5, arg6_type a6, arg7_type a7, arg8_type a8) - { - (m_pobject->*m_pmemfun)(a1, a2, a3, a4, a5, a6, a7, a8); - } - - virtual has_slots* getdest() const - { - return m_pobject; - } - - private: - dest_type* m_pobject; - void (dest_type::* m_pmemfun)(arg1_type, arg2_type, arg3_type, arg4_type, - arg5_type, arg6_type, arg7_type, arg8_type); - }; - - template - class signal0 : public _signal_base0 - { - public: - typedef typename _signal_base0::connections_list::const_iterator const_iterator; - signal0() - { - ; - } - - signal0(const signal0& s) - : _signal_base0(s) - { - ; - } - - virtual ~signal0() - { - ; - } - - template - void connect(desttype* pclass, void (desttype::*pmemfun)()) - { - lock_block lock(this); - _connection0* conn = - new _connection0(pclass, pmemfun); - this->m_connected_slots.push_back(conn); - pclass->signal_connect(this); - } - - void emit() - { - lock_block lock(this); - const_iterator itNext, it = this->m_connected_slots.begin(); - const_iterator itEnd = this->m_connected_slots.end(); - - while(it != itEnd) - { - itNext = it; - ++itNext; - - (*it)->emit(); - - it = itNext; - } - } - - void operator()() - { - lock_block lock(this); - const_iterator itNext, it = this->m_connected_slots.begin(); - const_iterator itEnd = this->m_connected_slots.end(); - - while(it != itEnd) - { - itNext = it; - ++itNext; - - (*it)->emit(); - - it = itNext; - } - } - }; - - template - class signal1 : public _signal_base1 - { - public: - typedef typename _signal_base1::connections_list::const_iterator const_iterator; - signal1() - { - ; - } - - signal1(const signal1& s) - : _signal_base1(s) - { - ; - } - - virtual ~signal1() - { - ; - } - - template - void connect(desttype* pclass, void (desttype::*pmemfun)(arg1_type)) - { - lock_block lock(this); - _connection1* conn = - new _connection1(pclass, pmemfun); - this->m_connected_slots.push_back(conn); - pclass->signal_connect(this); - } - - void emit(arg1_type a1) - { - lock_block lock(this); - const_iterator itNext, it = this->m_connected_slots.begin(); - const_iterator itEnd = this->m_connected_slots.end(); - - while(it != itEnd) - { - itNext = it; - ++itNext; - - (*it)->emit(a1); - - it = itNext; - } - } - - void operator()(arg1_type a1) - { - lock_block lock(this); - const_iterator itNext, it = this->m_connected_slots.begin(); - const_iterator itEnd = this->m_connected_slots.end(); - - while(it != itEnd) - { - itNext = it; - ++itNext; - - (*it)->emit(a1); - - it = itNext; - } - } - }; - - template - class signal2 : public _signal_base2 - { - public: - typedef typename _signal_base2::connections_list::const_iterator const_iterator; - signal2() - { - ; - } - - signal2(const signal2& s) - : _signal_base2(s) - { - ; - } - - virtual ~signal2() - { - ; - } - - template - void connect(desttype* pclass, void (desttype::*pmemfun)(arg1_type, - arg2_type)) - { - lock_block lock(this); - _connection2* conn = new - _connection2(pclass, pmemfun); - this->m_connected_slots.push_back(conn); - pclass->signal_connect(this); - } - - void emit(arg1_type a1, arg2_type a2) - { - lock_block lock(this); - const_iterator itNext, it = this->m_connected_slots.begin(); - const_iterator itEnd = this->m_connected_slots.end(); - - while(it != itEnd) - { - itNext = it; - ++itNext; - - (*it)->emit(a1, a2); - - it = itNext; - } - } - - void operator()(arg1_type a1, arg2_type a2) - { - lock_block lock(this); - const_iterator itNext, it = this->m_connected_slots.begin(); - const_iterator itEnd = this->m_connected_slots.end(); - - while(it != itEnd) - { - itNext = it; - ++itNext; - - (*it)->emit(a1, a2); - - it = itNext; - } - } - }; - - template - class signal3 : public _signal_base3 - { - public: - typedef typename _signal_base3::connections_list::const_iterator const_iterator; - signal3() - { - ; - } - - signal3(const signal3& s) - : _signal_base3(s) - { - ; - } - - virtual ~signal3() - { - ; - } - - template - void connect(desttype* pclass, void (desttype::*pmemfun)(arg1_type, - arg2_type, arg3_type)) - { - lock_block lock(this); - _connection3* conn = - new _connection3(pclass, - pmemfun); - this->m_connected_slots.push_back(conn); - pclass->signal_connect(this); - } - - void emit(arg1_type a1, arg2_type a2, arg3_type a3) - { - lock_block lock(this); - const_iterator itNext, it = this->m_connected_slots.begin(); - const_iterator itEnd = this->m_connected_slots.end(); - - while(it != itEnd) - { - itNext = it; - ++itNext; - - (*it)->emit(a1, a2, a3); - - it = itNext; - } - } - - void operator()(arg1_type a1, arg2_type a2, arg3_type a3) - { - lock_block lock(this); - const_iterator itNext, it = this->m_connected_slots.begin(); - const_iterator itEnd = this->m_connected_slots.end(); - - while(it != itEnd) - { - itNext = it; - ++itNext; - - (*it)->emit(a1, a2, a3); - - it = itNext; - } - } - }; - - template - class signal4 : public _signal_base4 - { - public: - typedef typename _signal_base4::connections_list::const_iterator const_iterator; - signal4() - { - ; - } - - signal4(const signal4& s) - : _signal_base4(s) - { - ; - } - - virtual ~signal4() - { - ; - } - - template - void connect(desttype* pclass, void (desttype::*pmemfun)(arg1_type, - arg2_type, arg3_type, arg4_type)) - { - lock_block lock(this); - _connection4* - conn = new _connection4(pclass, pmemfun); - this->m_connected_slots.push_back(conn); - pclass->signal_connect(this); - } - - void emit(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4) - { - lock_block lock(this); - const_iterator itNext, it = this->m_connected_slots.begin(); - const_iterator itEnd = this->m_connected_slots.end(); - - while(it != itEnd) - { - itNext = it; - ++itNext; - - (*it)->emit(a1, a2, a3, a4); - - it = itNext; - } - } - - void operator()(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4) - { - lock_block lock(this); - const_iterator itNext, it = this->m_connected_slots.begin(); - const_iterator itEnd = this->m_connected_slots.end(); - - while(it != itEnd) - { - itNext = it; - ++itNext; - - (*it)->emit(a1, a2, a3, a4); - - it = itNext; - } - } - }; - - template - class signal5 : public _signal_base5 - { - public: - typedef typename _signal_base5::connections_list::const_iterator const_iterator; - signal5() - { - ; - } - - signal5(const signal5& s) - : _signal_base5(s) - { - ; - } - - virtual ~signal5() - { - ; - } - - template - void connect(desttype* pclass, void (desttype::*pmemfun)(arg1_type, - arg2_type, arg3_type, arg4_type, arg5_type)) - { - lock_block lock(this); - _connection5* conn = new _connection5(pclass, pmemfun); - this->m_connected_slots.push_back(conn); - pclass->signal_connect(this); - } - - void emit(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4, - arg5_type a5) - { - lock_block lock(this); - const_iterator itNext, it = this->m_connected_slots.begin(); - const_iterator itEnd = this->m_connected_slots.end(); - - while(it != itEnd) - { - itNext = it; - ++itNext; - - (*it)->emit(a1, a2, a3, a4, a5); - - it = itNext; - } - } - - void operator()(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4, - arg5_type a5) - { - lock_block lock(this); - const_iterator itNext, it = this->m_connected_slots.begin(); - const_iterator itEnd = this->m_connected_slots.end(); - - while(it != itEnd) - { - itNext = it; - ++itNext; - - (*it)->emit(a1, a2, a3, a4, a5); - - it = itNext; - } - } - }; - - - template - class signal6 : public _signal_base6 - { - public: - typedef typename _signal_base6::connections_list::const_iterator const_iterator; - signal6() - { - ; - } - - signal6(const signal6& s) - : _signal_base6(s) - { - ; - } - - virtual ~signal6() - { - ; - } - - template - void connect(desttype* pclass, void (desttype::*pmemfun)(arg1_type, - arg2_type, arg3_type, arg4_type, arg5_type, arg6_type)) - { - lock_block lock(this); - _connection6* conn = - new _connection6(pclass, pmemfun); - this->m_connected_slots.push_back(conn); - pclass->signal_connect(this); - } - - void emit(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4, - arg5_type a5, arg6_type a6) - { - lock_block lock(this); - const_iterator itNext, it = this->m_connected_slots.begin(); - const_iterator itEnd = this->m_connected_slots.end(); - - while(it != itEnd) - { - itNext = it; - ++itNext; - - (*it)->emit(a1, a2, a3, a4, a5, a6); - - it = itNext; - } - } - - void operator()(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4, - arg5_type a5, arg6_type a6) - { - lock_block lock(this); - const_iterator itNext, it = this->m_connected_slots.begin(); - const_iterator itEnd = this->m_connected_slots.end(); - - while(it != itEnd) - { - itNext = it; - ++itNext; - - (*it)->emit(a1, a2, a3, a4, a5, a6); - - it = itNext; - } - } - }; - - template - class signal7 : public _signal_base7 - { - public: - typedef typename _signal_base7::connections_list::const_iterator const_iterator; - signal7() - { - ; - } - - signal7(const signal7& s) - : _signal_base7(s) - { - ; - } - - virtual ~signal7() - { - ; - } - - template - void connect(desttype* pclass, void (desttype::*pmemfun)(arg1_type, - arg2_type, arg3_type, arg4_type, arg5_type, arg6_type, - arg7_type)) - { - lock_block lock(this); - _connection7* conn = - new _connection7(pclass, pmemfun); - this->m_connected_slots.push_back(conn); - pclass->signal_connect(this); - } - - void emit(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4, - arg5_type a5, arg6_type a6, arg7_type a7) - { - lock_block lock(this); - const_iterator itNext, it = this->m_connected_slots.begin(); - const_iterator itEnd = this->m_connected_slots.end(); - - while(it != itEnd) - { - itNext = it; - ++itNext; - - (*it)->emit(a1, a2, a3, a4, a5, a6, a7); - - it = itNext; - } - } - - void operator()(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4, - arg5_type a5, arg6_type a6, arg7_type a7) - { - lock_block lock(this); - const_iterator itNext, it = this->m_connected_slots.begin(); - const_iterator itEnd = this->m_connected_slots.end(); - - while(it != itEnd) - { - itNext = it; - ++itNext; - - (*it)->emit(a1, a2, a3, a4, a5, a6, a7); - - it = itNext; - } - } - }; - - template - class signal8 : public _signal_base8 - { - public: - typedef typename _signal_base8::connections_list::const_iterator const_iterator; - signal8() - { - ; - } - - signal8(const signal8& s) - : _signal_base8(s) - { - ; - } - - virtual ~signal8() - { - ; - } - - template - void connect(desttype* pclass, void (desttype::*pmemfun)(arg1_type, - arg2_type, arg3_type, arg4_type, arg5_type, arg6_type, - arg7_type, arg8_type)) - { - lock_block lock(this); - _connection8* conn = - new _connection8(pclass, pmemfun); - this->m_connected_slots.push_back(conn); - pclass->signal_connect(this); - } - - void emit(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4, - arg5_type a5, arg6_type a6, arg7_type a7, arg8_type a8) - { - lock_block lock(this); - const_iterator itNext, it = this->m_connected_slots.begin(); - const_iterator itEnd = this->m_connected_slots.end(); - - while(it != itEnd) - { - itNext = it; - ++itNext; - - (*it)->emit(a1, a2, a3, a4, a5, a6, a7, a8); - - it = itNext; - } - } - - void operator()(arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4, - arg5_type a5, arg6_type a6, arg7_type a7, arg8_type a8) - { - lock_block lock(this); - const_iterator itNext, it = this->m_connected_slots.begin(); - const_iterator itEnd = this->m_connected_slots.end(); - - while(it != itEnd) - { - itNext = it; - ++itNext; - - (*it)->emit(a1, a2, a3, a4, a5, a6, a7, a8); - - it = itNext; - } - } - }; - -}; // namespace sigslot - -#endif // SIGSLOT_H__ diff --git a/src/link.ld b/src/link.ld deleted file mode 100644 index 61f4721..0000000 --- a/src/link.ld +++ /dev/null @@ -1,40 +0,0 @@ -OUTPUT(flappy_bird.elf); - -/* Tell linker where our application entry is so the garbage collect can work correct */ -ENTRY(__entry_menu); - -SECTIONS { - . = 0x00802000; - .text : { - *(.text*); - } - .rodata : { - *(.rodata*); - } - .data : { - *(.data*); - - __sdata_start = .; - *(.sdata*); - __sdata_end = .; - - __sdata2_start = .; - *(.sdata2*); - __sdata2_end = .; - } - .bss : { - __bss_start = .; - *(.bss*); - *(.sbss*); - *(COMMON); - __bss_end = .; - } - __CODE_END = .; - - /DISCARD/ : { - *(*); - } -} - -/******************************************************** FS ********************************************************/ -/* coreinit.rpl difference in addresses 0xFE3C00 */ diff --git a/src/main.cpp b/src/main.cpp index 8b6624a..e9b265a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,10 +1,9 @@ #include +#include #include "Application.h" #include "system/memory.h" #include "utils/logger.h" #include "utils/utils.h" -#include "dynamic_libs/padscore_functions.h" -#include "common/common.h" /* Entry point */ extern "C" int Menu_Main(void) @@ -14,10 +13,7 @@ extern "C" int Menu_Main(void) //!******************************************************************* socket_lib_init(); //! do OS (for acquire) and sockets first so we got logging - log_init("192.168.1.12"); - - InitPadScoreFunctionPointers(); - log_printf("Function exports loaded\n"); + log_init(); log_print("Initialize memory management\n"); memoryInitialize(); @@ -29,9 +25,7 @@ extern "C" int Menu_Main(void) log_printf("Start main application\n"); Application::instance()->exec(); - Application::destroyInstance(); - - log_deinit(); - - return EXIT_SUCCESS; + Application::destroyInstance(); + + return 0; } diff --git a/src/main.h b/src/main.h index 4204cd6..d7a5202 100644 --- a/src/main.h +++ b/src/main.h @@ -1,8 +1,6 @@ #ifndef _MAIN_H_ #define _MAIN_H_ -#include "common/types.h" - /* Main */ #ifdef __cplusplus extern "C" { diff --git a/src/menu/MainWindow.cpp b/src/menu/MainWindow.cpp index 22300f5..1a1e775 100644 --- a/src/menu/MainWindow.cpp +++ b/src/menu/MainWindow.cpp @@ -20,6 +20,8 @@ #include "Application.h" #include "utils/StringTools.h" #include "utils/logger.h" +#include "resources/Resources.h" +#include "system/AsyncDeleter.h" MainWindow::MainWindow(int w, int h) : width(w) @@ -27,7 +29,7 @@ MainWindow::MainWindow(int w, int h) { for(int i = 0; i < 4; i++) { - std::string filename = strfmt("player%i_point.png", i+1); + std::string filename = StringTools::strfmt("player%i_point.png", i+1); pointerImgData[i] = Resources::GetImageData(filename.c_str()); pointerImg[i] = new GuiImage(pointerImgData[i]); pointerImg[i]->setScale(1.5f); @@ -60,18 +62,18 @@ MainWindow::~MainWindow() void MainWindow::updateEffects() { //! dont read behind the initial elements in case one was added - u32 tvSize = tvElements.size(); - u32 drcSize = drcElements.size(); + uint32_t tvSize = tvElements.size(); + uint32_t drcSize = drcElements.size(); - for(u32 i = 0; (i < drcSize) && (i < drcElements.size()); ++i) + for(uint32_t i = 0; (i < drcSize) && (i < drcElements.size()); ++i) { drcElements[i]->updateEffects(); } //! only update TV elements that are not updated yet because they are on DRC - for(u32 i = 0; (i < tvSize) && (i < tvElements.size()); ++i) + for(uint32_t i = 0; (i < tvSize) && (i < tvElements.size()); ++i) { - u32 n; + uint32_t n; for(n = 0; (n < drcSize) && (n < drcElements.size()); n++) { if(tvElements[i] == drcElements[n]) @@ -86,18 +88,18 @@ void MainWindow::updateEffects() void MainWindow::process(){ //! dont read behind the initial elements in case one was added - u32 tvSize = tvElements.size(); - u32 drcSize = drcElements.size(); + uint32_t tvSize = tvElements.size(); + uint32_t drcSize = drcElements.size(); - for(u32 i = 0; (i < drcSize) && (i < drcElements.size()); ++i) + for(uint32_t i = 0; (i < drcSize) && (i < drcElements.size()); ++i) { drcElements[i]->process(); } //! only update TV elements that are not updated yet because they are on DRC - for(u32 i = 0; (i < tvSize) && (i < tvElements.size()); ++i) + for(uint32_t i = 0; (i < tvSize) && (i < tvElements.size()); ++i) { - u32 n; + uint32_t n; for(n = 0; (n < drcSize) && (n < drcElements.size()); n++) { if(tvElements[i] == drcElements[n]) @@ -113,31 +115,31 @@ void MainWindow::process(){ void MainWindow::update(GuiController *controller) { //! dont read behind the initial elements in case one was added - //u32 tvSize = tvElements.size(); + //uint32_t tvSize = tvElements.size(); if(controller->chan & GuiTrigger::CHANNEL_1) { - u32 drcSize = drcElements.size(); + uint32_t drcSize = drcElements.size(); - for(u32 i = 0; (i < drcSize) && (i < drcElements.size()); ++i) + for(uint32_t i = 0; (i < drcSize) && (i < drcElements.size()); ++i) { drcElements[i]->update(controller); } } else { - u32 tvSize = tvElements.size(); + uint32_t tvSize = tvElements.size(); - for(u32 i = 0; (i < tvSize) && (i < tvElements.size()); ++i) + for(uint32_t i = 0; (i < tvSize) && (i < tvElements.size()); ++i) { tvElements[i]->update(controller); } } // //! only update TV elements that are not updated yet because they are on DRC -// for(u32 i = 0; (i < tvSize) && (i < tvElements.size()); ++i) +// for(uint32_t i = 0; (i < tvSize) && (i < tvElements.size()); ++i) // { -// u32 n; +// uint32_t n; // for(n = 0; (n < drcSize) && (n < drcElements.size()); n++) // { // if(tvElements[i] == drcElements[n]) @@ -152,8 +154,8 @@ void MainWindow::update(GuiController *controller) if(controller->chanIdx >= 1 && controller->chanIdx <= 4 && controller->data.validPointer) { int wpadIdx = controller->chanIdx - 1; - f32 posX = controller->data.x; - f32 posY = controller->data.y; + float posX = controller->data.x; + float posY = controller->data.y; pointerImg[wpadIdx]->setPosition(posX, posY); pointerImg[wpadIdx]->setAngle(controller->data.pointerAngle); pointerValid[wpadIdx] = true; @@ -162,7 +164,7 @@ void MainWindow::update(GuiController *controller) void MainWindow::drawDrc(CVideo *video) { - for(u32 i = 0; i < drcElements.size(); ++i) + for(uint32_t i = 0; i < drcElements.size(); ++i) { drcElements[i]->draw(video); } @@ -180,7 +182,7 @@ void MainWindow::drawDrc(CVideo *video) void MainWindow::drawTv(CVideo *video) { - for(u32 i = 0; i < tvElements.size(); ++i) + for(uint32_t i = 0; i < tvElements.size(); ++i) { tvElements[i]->draw(video); } diff --git a/src/menu/MainWindow.h b/src/menu/MainWindow.h index 8f160a3..ec2d5eb 100644 --- a/src/menu/MainWindow.h +++ b/src/menu/MainWindow.h @@ -55,7 +55,7 @@ public: appendDrc(e); } - void insertTv(u32 pos, GuiElement *e) + void insertTv(uint32_t pos, GuiElement *e) { if(!e) return; @@ -63,7 +63,7 @@ public: removeTv(e); tvElements.insert(tvElements.begin() + pos, e); } - void insertDrc(u32 pos, GuiElement *e) + void insertDrc(uint32_t pos, GuiElement *e) { if(!e) return; @@ -72,7 +72,7 @@ public: drcElements.insert(drcElements.begin() + pos, e); } - void insert(u32 pos, GuiElement *e) + void insert(uint32_t pos, GuiElement *e) { insertTv(pos, e); insertDrc(pos, e); @@ -80,7 +80,7 @@ public: void removeTv(GuiElement *e) { - for(u32 i = 0; i < tvElements.size(); ++i) + for(uint32_t i = 0; i < tvElements.size(); ++i) { if(e == tvElements[i]) { @@ -91,7 +91,7 @@ public: } void removeDrc(GuiElement *e) { - for(u32 i = 0; i < drcElements.size(); ++i) + for(uint32_t i = 0; i < drcElements.size(); ++i) { if(e == drcElements[i]) { diff --git a/src/menu/MainWindowTV.cpp b/src/menu/MainWindowTV.cpp index 972740d..0a0801a 100644 --- a/src/menu/MainWindowTV.cpp +++ b/src/menu/MainWindowTV.cpp @@ -17,6 +17,7 @@ ****************************************************************************/ #include "MainWindowTV.h" #include "utils/logger.h" +#include "resources/Resources.h" MainWindowTV::MainWindowTV(int w, int h) : GuiMainWindowScreen(w, h) diff --git a/src/resources/Resources.cpp b/src/resources/Resources.cpp index 87e9d21..973d9ce 100644 --- a/src/resources/Resources.cpp +++ b/src/resources/Resources.cpp @@ -3,7 +3,7 @@ #include "Resources.h" #include "filelist.h" #include "system/AsyncDeleter.h" -#include "fs/fs_utils.h" +#include "fs/FSUtils.h" #include "gui/GuiImageAsync.h" #include "gui/GuiSound.h" @@ -43,20 +43,20 @@ bool Resources::LoadFiles(const char * path) fullpath += "/"; fullpath += RecourceList[i].filename; - u8 * buffer = NULL; - u32 filesize = 0; + uint8_t * buffer = NULL; + uint32_t filesize = 0; - LoadFileToMem(fullpath.c_str(), &buffer, &filesize); + FSUtils::LoadFileToMem(fullpath.c_str(), &buffer, &filesize); RecourceList[i].CustomFile = buffer; - RecourceList[i].CustomFileSize = (u32) filesize; + RecourceList[i].CustomFileSize = (uint32_t) filesize; result |= (buffer != 0); } return result; } -const u8 * Resources::GetFile(const char * filename) +const uint8_t * Resources::GetFile(const char * filename) { for(int i = 0; RecourceList[i].filename != NULL; ++i) { @@ -69,7 +69,7 @@ const u8 * Resources::GetFile(const char * filename) return NULL; } -u32 Resources::GetFileSize(const char * filename) +uint32_t Resources::GetFileSize(const char * filename) { for(int i = 0; RecourceList[i].filename != NULL; ++i) { @@ -97,8 +97,8 @@ GuiImageData * Resources::GetImageData(const char * filename) { if(strcasecmp(filename, RecourceList[i].filename) == 0) { - const u8 * buff = RecourceList[i].CustomFile ? RecourceList[i].CustomFile : RecourceList[i].DefaultFile; - const u32 size = RecourceList[i].CustomFile ? RecourceList[i].CustomFileSize : RecourceList[i].DefaultFileSize; + const uint8_t * buff = RecourceList[i].CustomFile ? RecourceList[i].CustomFile : RecourceList[i].DefaultFile; + const uint32_t size = RecourceList[i].CustomFile ? RecourceList[i].CustomFileSize : RecourceList[i].DefaultFileSize; if(buff == NULL) return NULL; @@ -150,8 +150,8 @@ GuiSound * Resources::GetSound(const char * filename) { if(strcasecmp(filename, RecourceList[i].filename) == 0) { - const u8 * buff = RecourceList[i].CustomFile ? RecourceList[i].CustomFile : RecourceList[i].DefaultFile; - const u32 size = RecourceList[i].CustomFile ? RecourceList[i].CustomFileSize : RecourceList[i].DefaultFileSize; + const uint8_t * buff = RecourceList[i].CustomFile ? RecourceList[i].CustomFile : RecourceList[i].DefaultFile; + const uint32_t size = RecourceList[i].CustomFile ? RecourceList[i].CustomFileSize : RecourceList[i].DefaultFileSize; if(buff == NULL) return NULL; diff --git a/src/resources/Resources.h b/src/resources/Resources.h index 6aba197..52285e0 100644 --- a/src/resources/Resources.h +++ b/src/resources/Resources.h @@ -2,7 +2,6 @@ #define RECOURCES_H_ #include -#include "common/types.h" //! forward declaration class GuiImageData; @@ -13,8 +12,8 @@ class Resources public: static void Clear(); static bool LoadFiles(const char * path); - static const u8 * GetFile(const char * filename); - static u32 GetFileSize(const char * filename); + static const uint8_t * GetFile(const char * filename); + static uint32_t GetFileSize(const char * filename); static GuiImageData * GetImageData(const char * filename); static void RemoveImageData(GuiImageData * image); diff --git a/src/sounds/BufferCircle.cpp b/src/sounds/BufferCircle.cpp deleted file mode 100644 index ccba870..0000000 --- a/src/sounds/BufferCircle.cpp +++ /dev/null @@ -1,143 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2010 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - * - * for WiiXplorer 2010 - ***************************************************************************/ -#include -#include -#include "utils/utils.h" -#include "BufferCircle.hpp" - -BufferCircle::BufferCircle() -{ - which = 0; - BufferBlockSize = 0; -} - -BufferCircle::~BufferCircle() -{ - FreeBuffer(); - SoundBuffer.clear(); - BufferSize.clear(); - BufferReady.clear(); -} - -void BufferCircle::SetBufferBlockSize(int size) -{ - if(size < 0) - return; - - BufferBlockSize = size; - - for(int i = 0; i < Size(); i++) - { - if(SoundBuffer[i] != NULL) - free(SoundBuffer[i]); - - SoundBuffer[i] = (u8 *) memalign(32, ALIGN32(BufferBlockSize)); - BufferSize[i] = 0; - BufferReady[i] = false; - } -} - -void BufferCircle::Resize(int size) -{ - while(size < Size()) - RemoveBuffer(Size()-1); - - int oldSize = Size(); - - SoundBuffer.resize(size); - BufferSize.resize(size); - BufferReady.resize(size); - - for(int i = oldSize; i < Size(); i++) - { - if(BufferBlockSize > 0) - SoundBuffer[i] = (u8 *) memalign(32, ALIGN32(BufferBlockSize)); - else - SoundBuffer[i] = NULL; - BufferSize[i] = 0; - BufferReady[i] = false; - } -} - -void BufferCircle::RemoveBuffer(int pos) -{ - if(!Valid(pos)) - return; - - if(SoundBuffer[pos] != NULL) - free(SoundBuffer[pos]); - - SoundBuffer.erase(SoundBuffer.begin()+pos); - BufferSize.erase(BufferSize.begin()+pos); - BufferReady.erase(BufferReady.begin()+pos); -} - -void BufferCircle::ClearBuffer() -{ - for(int i = 0; i < Size(); i++) - { - BufferSize[i] = 0; - BufferReady[i] = false; - } - which = 0; -} - -void BufferCircle::FreeBuffer() -{ - for(int i = 0; i < Size(); i++) - { - if(SoundBuffer[i] != NULL) - free(SoundBuffer[i]); - - SoundBuffer[i] = NULL; - BufferSize[i] = 0; - BufferReady[i] = false; - } -} - -void BufferCircle::LoadNext() -{ - BufferReady[which] = false; - BufferSize[which] = 0; - - which = Next(); -} - -void BufferCircle::SetBufferReady(int pos, bool state) -{ - if(!Valid(pos)) - return; - - BufferReady[pos] = state; -} - -void BufferCircle::SetBufferSize(int pos, int size) -{ - if(!Valid(pos)) - return; - - BufferSize[pos] = size; -} diff --git a/src/sounds/BufferCircle.hpp b/src/sounds/BufferCircle.hpp deleted file mode 100644 index 0502ef8..0000000 --- a/src/sounds/BufferCircle.hpp +++ /dev/null @@ -1,86 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2010 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - * - * for WiiXplorer 2010 - ***************************************************************************/ -#ifndef BUFFER_CIRCLE_HPP_ -#define BUFFER_CIRCLE_HPP_ - -#include -#include "common/types.h" - -class BufferCircle -{ - public: - //!> Constructor - BufferCircle(); - //!> Destructor - ~BufferCircle(); - //!> Set circle size - void Resize(int size); - //!> Get the circle size - int Size() { return SoundBuffer.size(); }; - //!> Set/resize the buffer size - void SetBufferBlockSize(int size); - //!> Remove a buffer - void RemoveBuffer(int pos); - //!> Set all buffers clear - void ClearBuffer(); - //!> Free all buffers - void FreeBuffer(); - //!> Switch to next buffer - void LoadNext(); - //!> Get the current buffer - u8 * GetBuffer() { return GetBuffer(which); }; - //!> Get a buffer at a position - u8 * GetBuffer(int pos) { if(!Valid(pos)) return NULL; else return SoundBuffer[pos]; }; - //!> Get current buffer size - u32 GetBufferSize() { return GetBufferSize(which); }; - //!> Get buffer size at position - u32 GetBufferSize(int pos) { if(!Valid(pos)) return 0; else return BufferSize[pos]; }; - //!> Is current buffer ready - bool IsBufferReady() { return IsBufferReady(which); }; - //!> Is a buffer at a position ready - bool IsBufferReady(int pos) { if(!Valid(pos)) return false; else return BufferReady[pos]; }; - //!> Set a buffer at a position to a ready state - void SetBufferReady(int pos, bool st); - //!> Set the buffersize at a position - void SetBufferSize(int pos, int size); - //!> Get the current position in the circle - u16 Which() { return which; }; - - //!> Get the next location - inline u16 Next() { return (which+1 >= Size()) ? 0 : which+1; } - inline u16 Prev() { if(Size() == 0) return 0; else return ((int)which-1 < 0) ? Size()-1 : which-1; } - protected: - //!> Check if the position is a valid position in the vector - bool Valid(int pos) { return !(pos < 0 || pos >= Size()); }; - - u16 which; - u32 BufferBlockSize; - std::vector SoundBuffer; - std::vector BufferSize; - std::vector BufferReady; -}; - -#endif diff --git a/src/sounds/Mp3Decoder.cpp b/src/sounds/Mp3Decoder.cpp deleted file mode 100644 index 48a76ed..0000000 --- a/src/sounds/Mp3Decoder.cpp +++ /dev/null @@ -1,217 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2010 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - * - * for WiiXplorer 2010 - ***************************************************************************/ -#include -#include -#include -#include -#include -#include -#include "common/types.h" -#include "Mp3Decoder.hpp" - -Mp3Decoder::Mp3Decoder(const char * filepath) - : SoundDecoder(filepath) -{ - SoundType = SOUND_MP3; - ReadBuffer = NULL; - mad_timer_reset(&Timer); - mad_stream_init(&Stream); - mad_frame_init(&Frame); - mad_synth_init(&Synth); - - if(!file_fd) - return; - - OpenFile(); -} - -Mp3Decoder::Mp3Decoder(const u8 * snd, int len) - : SoundDecoder(snd, len) -{ - SoundType = SOUND_MP3; - ReadBuffer = NULL; - mad_timer_reset(&Timer); - mad_stream_init(&Stream); - mad_frame_init(&Frame); - mad_synth_init(&Synth); - - if(!file_fd) - return; - - OpenFile(); -} - -Mp3Decoder::~Mp3Decoder() -{ - ExitRequested = true; - while(Decoding) - usleep(100); - - mad_synth_finish(&Synth); - mad_frame_finish(&Frame); - mad_stream_finish(&Stream); - - if(ReadBuffer) - free(ReadBuffer); - ReadBuffer = NULL; -} - -void Mp3Decoder::OpenFile() -{ - GuardPtr = NULL; - ReadBuffer = (u8 *) memalign(32, SoundBlockSize*SoundBlocks); - if(!ReadBuffer) - { - if(file_fd) - delete file_fd; - file_fd = NULL; - return; - } - - u8 dummybuff[4096]; - int ret = Read(dummybuff, 4096, 0); - if(ret <= 0) - { - if(file_fd) - delete file_fd; - file_fd = NULL; - return; - } - - SampleRate = (u32) Frame.header.samplerate; - Format = ((MAD_NCHANNELS(&Frame.header) == 2) ? (FORMAT_PCM_16_BIT | CHANNELS_STEREO) : (FORMAT_PCM_16_BIT | CHANNELS_MONO)); - Rewind(); -} - -int Mp3Decoder::Rewind() -{ - mad_synth_finish(&Synth); - mad_frame_finish(&Frame); - mad_stream_finish(&Stream); - mad_timer_reset(&Timer); - mad_stream_init(&Stream); - mad_frame_init(&Frame); - mad_synth_init(&Synth); - SynthPos = 0; - GuardPtr = NULL; - - if(!file_fd) - return -1; - - return SoundDecoder::Rewind(); -} - -static inline s16 FixedToShort(mad_fixed_t Fixed) -{ - /* Clipping */ - if(Fixed>=MAD_F_ONE) - return(SHRT_MAX); - if(Fixed<=-MAD_F_ONE) - return(-SHRT_MAX); - - Fixed=Fixed>>(MAD_F_FRACBITS-15); - return((s16)Fixed); -} - -int Mp3Decoder::Read(u8 * buffer, int buffer_size, int pos) -{ - if(!file_fd) - return -1; - - if(Format == (FORMAT_PCM_16_BIT | CHANNELS_STEREO)) - buffer_size &= ~0x0003; - else - buffer_size &= ~0x0001; - - u8 * write_pos = buffer; - u8 * write_end = buffer+buffer_size; - - while(1) - { - while(SynthPos < Synth.pcm.length) - { - if(write_pos >= write_end) - return write_pos-buffer; - - *((s16 *) write_pos) = FixedToShort(Synth.pcm.samples[0][SynthPos]); - write_pos += 2; - - if(MAD_NCHANNELS(&Frame.header) == 2) - { - *((s16 *) write_pos) = FixedToShort(Synth.pcm.samples[1][SynthPos]); - write_pos += 2; - } - SynthPos++; - } - - if(Stream.buffer == NULL || Stream.error == MAD_ERROR_BUFLEN) - { - u8 * ReadStart = ReadBuffer; - int ReadSize = SoundBlockSize*SoundBlocks; - int Remaining = 0; - - if(Stream.next_frame != NULL) - { - Remaining = Stream.bufend - Stream.next_frame; - memmove(ReadBuffer, Stream.next_frame, Remaining); - ReadStart += Remaining; - ReadSize -= Remaining; - } - - ReadSize = file_fd->read(ReadStart, ReadSize); - if(ReadSize <= 0) - { - GuardPtr = ReadStart; - memset(GuardPtr, 0, MAD_BUFFER_GUARD); - ReadSize = MAD_BUFFER_GUARD; - } - - CurPos += ReadSize; - mad_stream_buffer(&Stream, ReadBuffer, Remaining+ReadSize); - } - - if(mad_frame_decode(&Frame,&Stream)) - { - if(MAD_RECOVERABLE(Stream.error)) - { - if(Stream.error != MAD_ERROR_LOSTSYNC || !GuardPtr) - continue; - } - else - { - if(Stream.error != MAD_ERROR_BUFLEN) - return -1; - else if(Stream.error == MAD_ERROR_BUFLEN && GuardPtr) - return -1; - } - } - - mad_timer_add(&Timer,Frame.header.duration); - mad_synth_frame(&Synth,&Frame); - SynthPos = 0; - } - return 0; -} diff --git a/src/sounds/Mp3Decoder.hpp b/src/sounds/Mp3Decoder.hpp deleted file mode 100644 index ccc437b..0000000 --- a/src/sounds/Mp3Decoder.hpp +++ /dev/null @@ -1,47 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2010 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - * - * for WiiXplorer 2010 - ***************************************************************************/ -#include - -#include "SoundDecoder.hpp" - -class Mp3Decoder : public SoundDecoder -{ - public: - Mp3Decoder(const char * filepath); - Mp3Decoder(const u8 * sound, int len); - virtual ~Mp3Decoder(); - int Rewind(); - int Read(u8 * buffer, int buffer_size, int pos); - protected: - void OpenFile(); - struct mad_stream Stream; - struct mad_frame Frame; - struct mad_synth Synth; - mad_timer_t Timer; - u8 * GuardPtr; - u8 * ReadBuffer; - u32 SynthPos; -}; diff --git a/src/sounds/OggDecoder.cpp b/src/sounds/OggDecoder.cpp deleted file mode 100644 index 9f6c629..0000000 --- a/src/sounds/OggDecoder.cpp +++ /dev/null @@ -1,137 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2010 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - * - * for WiiXplorer 2010 - ***************************************************************************/ -#include -#include -#include "OggDecoder.hpp" - -static int ogg_read(void * punt, int bytes, int blocks, int *f) -{ - return ((CFile *) f)->read((u8 *) punt, bytes*blocks); -} - -static int ogg_seek(int *f, ogg_int64_t offset, int mode) -{ - return ((CFile *) f)->seek((u64) offset, mode); -} - -static int ogg_close(int *f) -{ - ((CFile *) f)->close(); - return 0; -} - -static long ogg_tell(int *f) -{ - return (long) ((CFile *) f)->tell(); -} - -static ov_callbacks callbacks = { - (size_t (*)(void *, size_t, size_t, void *)) ogg_read, - (int (*)(void *, ogg_int64_t, int)) ogg_seek, - (int (*)(void *)) ogg_close, - (long (*)(void *)) ogg_tell -}; - -OggDecoder::OggDecoder(const char * filepath) - : SoundDecoder(filepath) -{ - SoundType = SOUND_OGG; - - if(!file_fd) - return; - - OpenFile(); -} - -OggDecoder::OggDecoder(const u8 * snd, int len) - : SoundDecoder(snd, len) -{ - SoundType = SOUND_OGG; - - if(!file_fd) - return; - - OpenFile(); -} - -OggDecoder::~OggDecoder() -{ - ExitRequested = true; - while(Decoding) - usleep(100); - - if(file_fd) - ov_clear(&ogg_file); -} - -void OggDecoder::OpenFile() -{ - if (ov_open_callbacks(file_fd, &ogg_file, NULL, 0, callbacks) < 0) - { - delete file_fd; - file_fd = NULL; - return; - } - - ogg_info = ov_info(&ogg_file, -1); - if(!ogg_info) - { - ov_clear(&ogg_file); - delete file_fd; - file_fd = NULL; - return; - } - - Format = ((ogg_info->channels == 2) ? (FORMAT_PCM_16_BIT | CHANNELS_STEREO) : (FORMAT_PCM_16_BIT | CHANNELS_MONO)); - SampleRate = ogg_info->rate; -} - -int OggDecoder::Rewind() -{ - if(!file_fd) - return -1; - - int ret = ov_time_seek(&ogg_file, 0); - CurPos = 0; - EndOfFile = false; - - return ret; -} - -int OggDecoder::Read(u8 * buffer, int buffer_size, int pos) -{ - if(!file_fd) - return -1; - - int bitstream = 0; - - int read = ov_read(&ogg_file, (char *) buffer, buffer_size, &bitstream); - - if(read > 0) - CurPos += read; - - return read; -} diff --git a/src/sounds/OggDecoder.hpp b/src/sounds/OggDecoder.hpp deleted file mode 100644 index 8dc568e..0000000 --- a/src/sounds/OggDecoder.hpp +++ /dev/null @@ -1,43 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2010 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - * - * for WiiXplorer 2010 - ***************************************************************************/ -#include -#include - -#include "SoundDecoder.hpp" - -class OggDecoder : public SoundDecoder -{ - public: - OggDecoder(const char * filepath); - OggDecoder(const u8 * snd, int len); - virtual ~OggDecoder(); - int Rewind(); - int Read(u8 * buffer, int buffer_size, int pos); - protected: - void OpenFile(); - OggVorbis_File ogg_file; - vorbis_info *ogg_info; -}; diff --git a/src/sounds/SoundDecoder.cpp b/src/sounds/SoundDecoder.cpp deleted file mode 100644 index 057871f..0000000 --- a/src/sounds/SoundDecoder.cpp +++ /dev/null @@ -1,224 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2009-2013 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#include -#include -#include -#include -#include "SoundDecoder.hpp" - -static const u32 FixedPointShift = 15; -static const u32 FixedPointScale = 1 << FixedPointShift; - -SoundDecoder::SoundDecoder() -{ - file_fd = NULL; - Init(); -} - -SoundDecoder::SoundDecoder(const std::string & filepath) -{ - file_fd = new CFile(filepath, CFile::ReadOnly); - Init(); -} - -SoundDecoder::SoundDecoder(const u8 * buffer, int size) -{ - file_fd = new CFile(buffer, size); - Init(); -} - -SoundDecoder::~SoundDecoder() -{ - ExitRequested = true; - while(Decoding) - usleep(1000); - - //! lock unlock once to make sure it's really not decoding - Lock(); - Unlock(); - - if(file_fd) - delete file_fd; - file_fd = NULL; - - if(ResampleBuffer) - free(ResampleBuffer); -} - -void SoundDecoder::Init() -{ - SoundType = SOUND_RAW; - SoundBlocks = 8; - SoundBlockSize = 0x4000; - ResampleTo48kHz = false; - CurPos = 0; - whichLoad = 0; - Loop = false; - EndOfFile = false; - Decoding = false; - ExitRequested = false; - SoundBuffer.SetBufferBlockSize(SoundBlockSize); - SoundBuffer.Resize(SoundBlocks); - ResampleBuffer = NULL; - ResampleRatio = 0; -} - -int SoundDecoder::Rewind() -{ - CurPos = 0; - EndOfFile = false; - file_fd->rewind(); - - return 0; -} - -int SoundDecoder::Read(u8 * buffer, int buffer_size, int pos) -{ - int ret = file_fd->read(buffer, buffer_size); - CurPos += ret; - - return ret; -} - -void SoundDecoder::EnableUpsample(void) -{ - if( (ResampleBuffer == NULL) - && IsStereo() && Is16Bit() - && SampleRate != 32000 - && SampleRate != 48000) - { - ResampleBuffer = (u8*)memalign(32, SoundBlockSize); - ResampleRatio = ( FixedPointScale * SampleRate ) / 48000; - SoundBlockSize = ( SoundBlockSize * ResampleRatio ) / FixedPointScale; - SoundBlockSize &= ~0x03; - // set new sample rate - SampleRate = 48000; - } -} - -void SoundDecoder::Upsample(s16 *src, s16 *dst, u32 nr_src_samples, u32 nr_dst_samples) -{ - int timer = 0; - - for(u32 i = 0, n = 0; i < nr_dst_samples; i += 2) - { - if((n+3) < nr_src_samples) { - // simple fixed point linear interpolation - dst[i] = src[n] + ( ((src[n+2] - src[n] ) * timer) >> FixedPointShift ); - dst[i+1] = src[n+1] + ( ((src[n+3] - src[n+1]) * timer) >> FixedPointShift ); - } - else { - dst[i] = src[n]; - dst[i+1] = src[n+1]; - } - - timer += ResampleRatio; - - if(timer >= (int)FixedPointScale) { - n += 2; - timer -= FixedPointScale; - } - } -} - -void SoundDecoder::Decode() -{ - if(!file_fd || ExitRequested || EndOfFile) - return; - - // check if we are not at the pre-last buffer (last buffer is playing) - u16 whichPlaying = SoundBuffer.Which(); - if( ((whichPlaying == 0) && (whichLoad == SoundBuffer.Size()-2)) - || ((whichPlaying == 1) && (whichLoad == SoundBuffer.Size()-1)) - || (whichLoad == (whichPlaying-2))) - { - return; - } - - Decoding = true; - - int done = 0; - u8 * write_buf = SoundBuffer.GetBuffer(whichLoad); - if(!write_buf) - { - ExitRequested = true; - Decoding = false; - return; - } - - if(ResampleTo48kHz && !ResampleBuffer) - EnableUpsample(); - - while(done < SoundBlockSize) - { - int ret = Read(&write_buf[done], SoundBlockSize-done, Tell()); - - if(ret <= 0) - { - if(Loop) - { - Rewind(); - continue; - } - else - { - EndOfFile = true; - break; - } - } - - done += ret; - } - - if(done > 0) - { - // check if we need to resample - if(ResampleBuffer && ResampleRatio) - { - memcpy(ResampleBuffer, write_buf, done); - - int src_samples = done >> 1; - int dest_samples = ( src_samples * FixedPointScale ) / ResampleRatio; - dest_samples &= ~0x01; - Upsample((s16*)ResampleBuffer, (s16*)write_buf, src_samples, dest_samples); - done = dest_samples << 1; - } - - //! TODO: remove this later and add STEREO support with two voices, for now we convert to MONO - if(IsStereo()) - { - s16* monoBuf = (s16*)write_buf; - done = done >> 1; - - for(int i = 0; i < done; i++) - monoBuf[i] = monoBuf[i << 1]; - } - - DCFlushRange(write_buf, done); - SoundBuffer.SetBufferSize(whichLoad, done); - SoundBuffer.SetBufferReady(whichLoad, true); - if(++whichLoad >= SoundBuffer.Size()) - whichLoad = 0; - } - - // check if next in queue needs to be filled as well and do so - if(!SoundBuffer.IsBufferReady(whichLoad)) - Decode(); - - Decoding = false; -} - diff --git a/src/sounds/SoundDecoder.hpp b/src/sounds/SoundDecoder.hpp deleted file mode 100644 index c0c9da1..0000000 --- a/src/sounds/SoundDecoder.hpp +++ /dev/null @@ -1,105 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2010 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - * - * for WiiXplorer 2010 - ***************************************************************************/ -#ifndef SOUND_DECODER_HPP -#define SOUND_DECODER_HPP - -#include "fs/CFile.hpp" -#include "system/CMutex.h" -#include "BufferCircle.hpp" - -class SoundDecoder -{ -public: - SoundDecoder(); - SoundDecoder(const std::string & filepath); - SoundDecoder(const u8 * buffer, int size); - virtual ~SoundDecoder(); - virtual void Lock() { mutex.lock(); } - virtual void Unlock() { mutex.unlock(); } - virtual int Read(u8 * buffer, int buffer_size, int pos); - virtual int Tell() { return CurPos; } - virtual int Seek(int pos) { CurPos = pos; return file_fd->seek(CurPos, SEEK_SET); } - virtual int Rewind(); - virtual u16 GetFormat() { return Format; } - virtual u16 GetSampleRate() { return SampleRate; } - virtual void Decode(); - virtual bool IsBufferReady() { return SoundBuffer.IsBufferReady(); } - virtual u8 * GetBuffer() { return SoundBuffer.GetBuffer(); } - virtual u32 GetBufferSize() { return SoundBuffer.GetBufferSize(); } - virtual void LoadNext() { SoundBuffer.LoadNext(); } - virtual bool IsEOF() { return EndOfFile; } - virtual void SetLoop(bool l) { Loop = l; EndOfFile = false; } - virtual u8 GetSoundType() { return SoundType; } - virtual void ClearBuffer() { SoundBuffer.ClearBuffer(); whichLoad = 0; } - virtual bool IsStereo() { return (GetFormat() & CHANNELS_STEREO) != 0; } - virtual bool Is16Bit() { return ((GetFormat() & 0xFF) == FORMAT_PCM_16_BIT); } - virtual bool IsDecoding() { return Decoding; } - - void EnableUpsample(void); - - enum SoundFormats - { - FORMAT_PCM_16_BIT = 0x0A, - FORMAT_PCM_8_BIT = 0x19, - }; - enum SoundChannels - { - CHANNELS_MONO = 0x100, - CHANNELS_STEREO = 0x200 - }; - - enum SoundType - { - SOUND_RAW = 0, - SOUND_MP3, - SOUND_OGG, - SOUND_WAV - }; -protected: - void Init(); - void Upsample(s16 *src, s16 *dst, u32 nr_src_samples, u32 nr_dst_samples); - - CFile * file_fd; - BufferCircle SoundBuffer; - u8 SoundType; - u16 whichLoad; - u16 SoundBlocks; - int SoundBlockSize; - int CurPos; - bool ResampleTo48kHz; - bool Loop; - bool EndOfFile; - bool Decoding; - bool ExitRequested; - u16 Format; - u16 SampleRate; - u8 *ResampleBuffer; - u32 ResampleRatio; - CMutex mutex; -}; - - -#endif diff --git a/src/sounds/SoundHandler.cpp b/src/sounds/SoundHandler.cpp deleted file mode 100644 index 2d7ffad..0000000 --- a/src/sounds/SoundHandler.cpp +++ /dev/null @@ -1,351 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2010 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - * - * for WiiXplorer 2010 - ***************************************************************************/ -#include -#include -#include "common/common.h" -#include "fs/CFile.hpp" -#include "SoundHandler.hpp" -#include "WavDecoder.hpp" -#include "Mp3Decoder.hpp" -#include "OggDecoder.hpp" - -SoundHandler * SoundHandler::handlerInstance = NULL; - -SoundHandler::SoundHandler() - : CThread(CThread::eAttributeAffCore1 | CThread::eAttributePinnedAff, 0, 0x8000) -{ - Decoding = false; - ExitRequested = false; - for(u32 i = 0; i < MAX_DECODERS; ++i) - { - DecoderList[i] = NULL; - voiceList[i] = NULL; - } - - resumeThread(); - - //! wait for initialization - while(!isThreadSuspended()) - usleep(1000); -} - -SoundHandler::~SoundHandler() -{ - ExitRequested = true; - ThreadSignal(); - - ClearDecoderList(); -} - -void SoundHandler::AddDecoder(int voice, const char * filepath) -{ - if(voice < 0 || voice >= MAX_DECODERS) - return; - - if(DecoderList[voice] != NULL) - RemoveDecoder(voice); - - DecoderList[voice] = GetSoundDecoder(filepath); -} - -void SoundHandler::AddDecoder(int voice, const u8 * snd, int len) -{ - if(voice < 0 || voice >= MAX_DECODERS) - return; - - if(DecoderList[voice] != NULL) - RemoveDecoder(voice); - - DecoderList[voice] = GetSoundDecoder(snd, len); -} - -void SoundHandler::RemoveDecoder(int voice) -{ - if(voice < 0 || voice >= MAX_DECODERS) - return; - - if(DecoderList[voice] != NULL) - { - if(voiceList[voice] && voiceList[voice]->getState() != Voice::STATE_STOPPED) - { - if(voiceList[voice]->getState() != Voice::STATE_STOP) - voiceList[voice]->setState(Voice::STATE_STOP); - - // it shouldn't take longer than 3 ms actually but we wait up to 20 - // on application quit the AX frame callback is not called anymore - // therefore this would end in endless loop if no timeout is defined - int timeOut = 20; - while(--timeOut && (voiceList[voice]->getState() != Voice::STATE_STOPPED)) - usleep(1000); - } - SoundDecoder *decoder = DecoderList[voice]; - decoder->Lock(); - DecoderList[voice] = NULL; - decoder->Unlock(); - delete decoder; - } -} - -void SoundHandler::ClearDecoderList() -{ - for(u32 i = 0; i < MAX_DECODERS; ++i) - RemoveDecoder(i); -} - -static inline bool CheckMP3Signature(const u8 * buffer) -{ - const char MP3_Magic[][3] = - { - {'I', 'D', '3'}, //'ID3' - {0xff, 0xfe}, //'MPEG ADTS, layer III, v1.0 [protected]', 'mp3', 'audio/mpeg'), - {0xff, 0xff}, //'MPEG ADTS, layer III, v1.0', 'mp3', 'audio/mpeg'), - {0xff, 0xfa}, //'MPEG ADTS, layer III, v1.0 [protected]', 'mp3', 'audio/mpeg'), - {0xff, 0xfb}, //'MPEG ADTS, layer III, v1.0', 'mp3', 'audio/mpeg'), - {0xff, 0xf2}, //'MPEG ADTS, layer III, v2.0 [protected]', 'mp3', 'audio/mpeg'), - {0xff, 0xf3}, //'MPEG ADTS, layer III, v2.0', 'mp3', 'audio/mpeg'), - {0xff, 0xf4}, //'MPEG ADTS, layer III, v2.0 [protected]', 'mp3', 'audio/mpeg'), - {0xff, 0xf5}, //'MPEG ADTS, layer III, v2.0', 'mp3', 'audio/mpeg'), - {0xff, 0xf6}, //'MPEG ADTS, layer III, v2.0 [protected]', 'mp3', 'audio/mpeg'), - {0xff, 0xf7}, //'MPEG ADTS, layer III, v2.0', 'mp3', 'audio/mpeg'), - {0xff, 0xe2}, //'MPEG ADTS, layer III, v2.5 [protected]', 'mp3', 'audio/mpeg'), - {0xff, 0xe3}, //'MPEG ADTS, layer III, v2.5', 'mp3', 'audio/mpeg'), - }; - - if(buffer[0] == MP3_Magic[0][0] && buffer[1] == MP3_Magic[0][1] && - buffer[2] == MP3_Magic[0][2]) - { - return true; - } - - for(int i = 1; i < 13; i++) - { - if(buffer[0] == MP3_Magic[i][0] && buffer[1] == MP3_Magic[i][1]) - return true; - } - - return false; -} - -SoundDecoder * SoundHandler::GetSoundDecoder(const char * filepath) -{ - u32 magic; - CFile f(filepath, CFile::ReadOnly); - if(f.size() == 0) - return NULL; - - do - { - f.read((u8 *) &magic, 1); - } - while(((u8 *) &magic)[0] == 0 && f.tell() < f.size()); - - if(f.tell() == f.size()) - return NULL; - - f.seek(f.tell()-1, SEEK_SET); - f.read((u8 *) &magic, 4); - f.close(); - - if(magic == 0x4f676753) // 'OggS' - { - return new OggDecoder(filepath); - } - else if(magic == 0x52494646) // 'RIFF' - { - return new WavDecoder(filepath); - } - else if(CheckMP3Signature((u8 *) &magic) == true) - { - return new Mp3Decoder(filepath); - } - - return new SoundDecoder(filepath); -} - -SoundDecoder * SoundHandler::GetSoundDecoder(const u8 * sound, int length) -{ - const u8 * check = sound; - int counter = 0; - - while(check[0] == 0 && counter < length) - { - check++; - counter++; - } - - if(counter >= length) - return NULL; - - u32 * magic = (u32 *) check; - - if(magic[0] == 0x4f676753) // 'OggS' - { - return new OggDecoder(sound, length); - } - else if(magic[0] == 0x52494646) // 'RIFF' - { - return new WavDecoder(sound, length); - } - else if(CheckMP3Signature(check) == true) - { - return new Mp3Decoder(sound, length); - } - - return new SoundDecoder(sound, length); -} - -void SoundHandler::executeThread() -{ - //! initialize 48 kHz renderer - AXInitParams params; - memset(¶ms, 0, sizeof(params)); - params.renderer = AX_INIT_RENDERER_48KHZ; - - // TODO: handle support for 3.1.0 with dynamic libs instead of static linking it - //if(AXInitWithParams != 0) - AXInitWithParams(¶ms); - //else - // AXInit(); - - // The problem with last voice on 500 was caused by it having priority 0 - // We would need to change this priority distribution if for some reason - // we would need MAX_DECODERS > Voice::PRIO_MAX - for(u32 i = 0; i < MAX_DECODERS; ++i) - { - int priority = (MAX_DECODERS - i) * Voice::PRIO_MAX / MAX_DECODERS; - voiceList[i] = new Voice(priority); // allocate voice 0 with highest priority - } - - AXRegisterAppFrameCallback(SoundHandler::axFrameCallback); - - - u16 i = 0; - while (!ExitRequested) - { - suspendThread(); - - for(i = 0; i < MAX_DECODERS; ++i) - { - if(DecoderList[i] == NULL) - continue; - - Decoding = true; - if(DecoderList[i]) - DecoderList[i]->Lock(); - if(DecoderList[i]) - DecoderList[i]->Decode(); - if(DecoderList[i]) - DecoderList[i]->Unlock(); - } - Decoding = false; - } - - for(u32 i = 0; i < MAX_DECODERS; ++i) - voiceList[i]->stop(); - - AXRegisterAppFrameCallback(NULL); - AXQuit(); - - for(u32 i = 0; i < MAX_DECODERS; ++i) - { - delete voiceList[i]; - voiceList[i] = NULL; - } -} - -void SoundHandler::axFrameCallback(void) -{ - for (u32 i = 0; i < MAX_DECODERS; i++) - { - Voice *voice = handlerInstance->getVoice(i); - - switch (voice->getState()) - { - default: - case Voice::STATE_STOPPED: - break; - - case Voice::STATE_START: { - SoundDecoder * decoder = handlerInstance->getDecoder(i); - decoder->Lock(); - if(decoder->IsBufferReady()) - { - const u8 *buffer = decoder->GetBuffer(); - const u32 bufferSize = decoder->GetBufferSize(); - decoder->LoadNext(); - - const u8 *nextBuffer = NULL; - u32 nextBufferSize = 0; - - if(decoder->IsBufferReady()) - { - nextBuffer = decoder->GetBuffer(); - nextBufferSize = decoder->GetBufferSize(); - decoder->LoadNext(); - } - - voice->play(buffer, bufferSize, nextBuffer, nextBufferSize, decoder->GetFormat() & 0xff, decoder->GetSampleRate()); - - handlerInstance->ThreadSignal(); - - voice->setState(Voice::STATE_PLAYING); - } - decoder->Unlock(); - break; - } - case Voice::STATE_PLAYING: - if(voice->getInternState() == 1) - { - if(voice->isBufferSwitched()) - { - SoundDecoder * decoder = handlerInstance->getDecoder(i); - decoder->Lock(); - if(decoder->IsBufferReady()) - { - voice->setNextBuffer(decoder->GetBuffer(), decoder->GetBufferSize()); - decoder->LoadNext(); - handlerInstance->ThreadSignal(); - } - else if(decoder->IsEOF()) - { - voice->setState(Voice::STATE_STOP); - } - decoder->Unlock(); - } - } - else - { - voice->setState(Voice::STATE_STOPPED); - } - break; - case Voice::STATE_STOP: - if(voice->getInternState() != 0) - voice->stop(); - voice->setState(Voice::STATE_STOPPED); - break; - } - } -} diff --git a/src/sounds/SoundHandler.hpp b/src/sounds/SoundHandler.hpp deleted file mode 100644 index f793332..0000000 --- a/src/sounds/SoundHandler.hpp +++ /dev/null @@ -1,78 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2010 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - * - * for WiiXplorer 2010 - ***************************************************************************/ -#ifndef SOUNDHANDLER_H_ -#define SOUNDHANDLER_H_ - -#include -#include "common/types.h" -#include "system/CThread.h" -#include "SoundDecoder.hpp" -#include "Voice.h" - -#define MAX_DECODERS 16 // can be increased up to 96 - -class SoundHandler : public CThread -{ -public: - static SoundHandler * instance() { - if (!handlerInstance) - handlerInstance = new SoundHandler(); - return handlerInstance; - } - - static void DestroyInstance() { delete handlerInstance; handlerInstance = NULL; } - - void AddDecoder(int voice, const char * filepath); - void AddDecoder(int voice, const u8 * snd, int len); - void RemoveDecoder(int voice); - - SoundDecoder * getDecoder(int i) { return ((i < 0 || i >= MAX_DECODERS) ? NULL : DecoderList[i]); }; - Voice * getVoice(int i) { return ((i < 0 || i >= MAX_DECODERS) ? NULL : voiceList[i]); }; - - void ThreadSignal() { resumeThread(); }; - bool IsDecoding() { return Decoding; }; -protected: - SoundHandler(); - ~SoundHandler(); - - static void axFrameCallback(void); - - void executeThread(void); - void ClearDecoderList(); - - SoundDecoder * GetSoundDecoder(const char * filepath); - SoundDecoder * GetSoundDecoder(const u8 * sound, int length); - - static SoundHandler * handlerInstance; - - bool Decoding; - bool ExitRequested; - - Voice * voiceList[MAX_DECODERS]; - SoundDecoder * DecoderList[MAX_DECODERS]; -}; - -#endif diff --git a/src/sounds/Voice.h b/src/sounds/Voice.h deleted file mode 100644 index ceb4ad7..0000000 --- a/src/sounds/Voice.h +++ /dev/null @@ -1,164 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#ifndef _AXSOUND_H_ -#define _AXSOUND_H_ - -#include -#include - -class Voice -{ -public: - - enum VoicePriorities - { - PRIO_MIN = 1, - PRIO_MAX = 31 - }; - - enum VoiceStates - { - STATE_STOPPED, - STATE_START, - STATE_PLAYING, - STATE_STOP, - }; - - Voice(int prio) - : state(STATE_STOPPED) - { - lastLoopCounter = 0; - nextBufferSize = 0; - - voice = AXAcquireVoice(prio, 0, 0); - if(voice) - { - AXSetVoiceType(voice, 0); - setVolume(0x80000000); - - AXVoiceDeviceMixData mix[6]; - memset(mix, 0, sizeof(mix)); - mix[0].bus[0].volume = 0x8000; - mix[0].bus[0].delta = 0; - mix[1].bus[0].volume = 0x8000; - mix[1].bus[0].delta = 0; - - AXSetVoiceDeviceMix(voice, 0, 0, mix); - AXSetVoiceDeviceMix(voice, 1, 0, mix); - } - } - - ~Voice() - { - if(voice) - { - AXFreeVoice(voice); - } - } - - void play(const u8 *buffer, u32 bufferSize, const u8 *nextBuffer, u32 nextBufSize, u16 format, u32 sampleRate) - { - if(!voice) - return; - - memset(&voiceBuffer, 0, sizeof(voiceBuffer)); - - voiceBuffer.data = buffer; - voiceBuffer.dataType = format; - voiceBuffer.loopingEnabled = (nextBuffer == NULL) ? 0 : 1; - voiceBuffer.currentOffset = 0; - voiceBuffer.endOffset = (bufferSize >> 1) - 1; - voiceBuffer.loopOffset = ((nextBuffer - buffer) >> 1); - nextBufferSize = nextBufSize; - - // TODO: handle support for 3.1.0 with dynamic libs instead of static linking it - //u32 samplesPerSec = (AXGetInputSamplesPerSec != 0) ? AXGetInputSamplesPerSec() : 32000; - u32 samplesPerSec = AXGetInputSamplesPerSec(); - - memset(&ratioBits, 0, sizeof(ratioBits)); - ratioBits.ratio = (u32)(0x00010000 * ((f32)sampleRate / (f32)samplesPerSec)); - - AXSetVoiceOffsets(voice, &voiceBuffer); - AXSetVoiceSrc(voice, &ratioBits); - AXSetVoiceSrcType(voice, 1); - AXSetVoiceState(voice, 1); - } - - void stop() - { - if(voice) - AXSetVoiceState(voice, 0); - } - - void setVolume(u32 vol) - { - if(voice) - { - AXVoiceVeData data; - data.volume = vol >> 16; - data.delta = vol & 0xFFFF; - AXSetVoiceVe(voice, &data); - } - } - - - void setNextBuffer(const u8 *buffer, u32 bufferSize) - { - voiceBuffer.loopOffset = ((buffer - (const u8*)voiceBuffer.data) >> 1); - nextBufferSize = bufferSize; - - AXSetVoiceLoopOffset(voice, voiceBuffer.loopOffset); - } - - bool isBufferSwitched() - { - u32 loopCounter = AXGetVoiceLoopCount(voice); - if(lastLoopCounter != loopCounter) - { - lastLoopCounter = loopCounter; - AXSetVoiceEndOffset(voice, voiceBuffer.loopOffset + (nextBufferSize >> 1) - 1); - return true; - } - return false; - } - - u32 getInternState() const { - if(voice) - return ((u32 *)voice)[1]; - return 0; - } - u32 getState() const { - return state; - } - void setState(u32 s) { - state = s; - } - - void * getVoice() const { - return voice; - } - -private: - AXVoice *voice; - AXVoiceSrc ratioBits; - AXVoiceOffsets voiceBuffer; - u32 state; - u32 nextBufferSize; - u32 lastLoopCounter; -}; - -#endif // _AXSOUND_H_ diff --git a/src/sounds/WavDecoder.cpp b/src/sounds/WavDecoder.cpp deleted file mode 100644 index f241df0..0000000 --- a/src/sounds/WavDecoder.cpp +++ /dev/null @@ -1,154 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2010 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - * - * for WiiXplorer 2010 - ***************************************************************************/ -#include -#include "WavDecoder.hpp" -#include "utils/utils.h" - -WavDecoder::WavDecoder(const char * filepath) - : SoundDecoder(filepath) -{ - SoundType = SOUND_WAV; - SampleRate = 48000; - Format = CHANNELS_STEREO | FORMAT_PCM_16_BIT; - - if(!file_fd) - return; - - OpenFile(); -} - -WavDecoder::WavDecoder(const u8 * snd, int len) - : SoundDecoder(snd, len) -{ - SoundType = SOUND_WAV; - SampleRate = 48000; - Format = CHANNELS_STEREO | FORMAT_PCM_16_BIT; - - if(!file_fd) - return; - - OpenFile(); -} - -WavDecoder::~WavDecoder() -{ -} - - -void WavDecoder::OpenFile() -{ - SWaveHdr Header; - SWaveFmtChunk FmtChunk; - memset(&Header, 0, sizeof(SWaveHdr)); - memset(&FmtChunk, 0, sizeof(SWaveFmtChunk)); - - file_fd->read((u8 *) &Header, sizeof(SWaveHdr)); - file_fd->read((u8 *) &FmtChunk, sizeof(SWaveFmtChunk)); - - if (Header.magicRIFF != 0x52494646) // 'RIFF' - { - CloseFile(); - return; - } - else if(Header.magicWAVE != 0x57415645) // 'WAVE' - { - CloseFile(); - return; - } - else if(FmtChunk.magicFMT != 0x666d7420) // 'fmt ' - { - CloseFile(); - return; - } - - DataOffset = sizeof(SWaveHdr)+le32(FmtChunk.size)+8; - file_fd->seek(DataOffset, SEEK_SET); - SWaveChunk DataChunk; - file_fd->read((u8 *) &DataChunk, sizeof(SWaveChunk)); - - while(DataChunk.magicDATA != 0x64617461) // 'data' - { - DataOffset += 8+le32(DataChunk.size); - file_fd->seek(DataOffset, SEEK_SET); - int ret = file_fd->read((u8 *) &DataChunk, sizeof(SWaveChunk)); - if(ret <= 0) - { - CloseFile(); - return; - } - } - - DataOffset += 8; - DataSize = le32(DataChunk.size); - Is16Bit = (le16(FmtChunk.bps) == 16); - SampleRate = le32(FmtChunk.freq); - - if (le16(FmtChunk.channels) == 1 && le16(FmtChunk.bps) == 8 && le16(FmtChunk.alignment) <= 1) - Format = CHANNELS_MONO | FORMAT_PCM_8_BIT; - else if (le16(FmtChunk.channels) == 1 && le16(FmtChunk.bps) == 16 && le16(FmtChunk.alignment) <= 2) - Format = CHANNELS_MONO | FORMAT_PCM_16_BIT; - else if (le16(FmtChunk.channels) == 2 && le16(FmtChunk.bps) == 8 && le16(FmtChunk.alignment) <= 2) - Format = CHANNELS_STEREO | FORMAT_PCM_8_BIT; - else if (le16(FmtChunk.channels) == 2 && le16(FmtChunk.bps) == 16 && le16(FmtChunk.alignment) <= 4) - Format = CHANNELS_STEREO | FORMAT_PCM_16_BIT; -} - -void WavDecoder::CloseFile() -{ - if(file_fd) - delete file_fd; - - file_fd = NULL; -} - -int WavDecoder::Read(u8 * buffer, int buffer_size, int pos) -{ - if(!file_fd) - return -1; - - if(CurPos >= (int) DataSize) - return 0; - - file_fd->seek(DataOffset+CurPos, SEEK_SET); - - if(buffer_size > (int) DataSize-CurPos) - buffer_size = DataSize-CurPos; - - int read = file_fd->read(buffer, buffer_size); - if(read > 0) - { - if (Is16Bit) - { - read &= ~0x0001; - - for (u32 i = 0; i < (u32) (read / sizeof (u16)); ++i) - ((u16 *) buffer)[i] = le16(((u16 *) buffer)[i]); - } - CurPos += read; - } - - return read; -} diff --git a/src/sounds/WavDecoder.hpp b/src/sounds/WavDecoder.hpp deleted file mode 100644 index 5981883..0000000 --- a/src/sounds/WavDecoder.hpp +++ /dev/null @@ -1,71 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2010 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - * - * for WiiXplorer 2010 - ***************************************************************************/ -#ifndef WAVDECODER_HPP_ -#define WAVDECODER_HPP_ - -#include "SoundDecoder.hpp" - -typedef struct -{ - u32 magicRIFF; - u32 size; - u32 magicWAVE; -} SWaveHdr; - -typedef struct -{ - u32 magicFMT; - u32 size; - u16 format; - u16 channels; - u32 freq; - u32 avgBps; - u16 alignment; - u16 bps; -} SWaveFmtChunk; - -typedef struct -{ - u32 magicDATA; - u32 size; -} SWaveChunk; - -class WavDecoder : public SoundDecoder -{ - public: - WavDecoder(const char * filepath); - WavDecoder(const u8 * snd, int len); - virtual ~WavDecoder(); - int Read(u8 * buffer, int buffer_size, int pos); - protected: - void OpenFile(); - void CloseFile(); - u32 DataOffset; - u32 DataSize; - bool Is16Bit; -}; - -#endif diff --git a/src/system/AsyncDeleter.cpp b/src/system/AsyncDeleter.cpp index 7776989..420d272 100644 --- a/src/system/AsyncDeleter.cpp +++ b/src/system/AsyncDeleter.cpp @@ -19,28 +19,23 @@ AsyncDeleter * AsyncDeleter::deleterInstance = NULL; AsyncDeleter::AsyncDeleter() - : CThread(CThread::eAttributeAffCore1 | CThread::eAttributePinnedAff) - , exitApplication(false) -{ + : CThread(CThread::eAttributeAffCore1 | CThread::eAttributePinnedAff) + , exitApplication(false) { } -AsyncDeleter::~AsyncDeleter() -{ +AsyncDeleter::~AsyncDeleter() { exitApplication = true; } -void AsyncDeleter::triggerDeleteProcess(void) -{ +void AsyncDeleter::triggerDeleteProcess(void) { if(!deleterInstance) deleterInstance = new AsyncDeleter; //! to trigger the event after GUI process is finished execution //! this function is used to swap elements from one to next array - if(!deleterInstance->deleteElements.empty()) - { + if(!deleterInstance->deleteElements.empty()) { deleterInstance->deleteMutex.lock(); - while(!deleterInstance->deleteElements.empty()) - { + while(!deleterInstance->deleteElements.empty()) { deleterInstance->realDeleteElements.push(deleterInstance->deleteElements.front()); deleterInstance->deleteElements.pop(); } @@ -49,18 +44,15 @@ void AsyncDeleter::triggerDeleteProcess(void) } } -void AsyncDeleter::executeThread(void) -{ - while(!exitApplication) - { +void AsyncDeleter::executeThread(void) { + while(!exitApplication) { suspendThread(); //! delete elements that require post process deleting //! because otherwise they would block or do invalid access on GUI thread - while(!realDeleteElements.empty()) - { + while(!realDeleteElements.empty()) { deleteMutex.lock(); - AsyncDeleter::Element *element = realDeleteElements.front(); + GuiElement *element = realDeleteElements.front(); realDeleteElements.pop(); deleteMutex.unlock(); diff --git a/src/system/AsyncDeleter.h b/src/system/AsyncDeleter.h index 5497ad2..c28251b 100644 --- a/src/system/AsyncDeleter.h +++ b/src/system/AsyncDeleter.h @@ -18,27 +18,24 @@ #define _ASYNC_DELETER_H #include +#include #include "CThread.h" #include "CMutex.h" -class AsyncDeleter : public CThread -{ +class AsyncDeleter : public CThread { public: - static void destroyInstance() - { + static void destroyInstance() { delete deleterInstance; deleterInstance = NULL; } - class Element - { + class Element { public: Element() {} virtual ~Element() {} }; - static void pushForDelete(AsyncDeleter::Element *e) - { + static void pushForDelete(GuiElement *e) { if(!deleterInstance) deleterInstance = new AsyncDeleter; @@ -56,8 +53,8 @@ private: void executeThread(void); bool exitApplication; - std::queue deleteElements; - std::queue realDeleteElements; + std::queue deleteElements; + std::queue realDeleteElements; CMutex deleteMutex; }; diff --git a/src/system/CMutex.h b/src/system/CMutex.h index fecd54c..76f23ac 100644 --- a/src/system/CMutex.h +++ b/src/system/CMutex.h @@ -43,7 +43,7 @@ public: if(pMutex) OSUnlockMutex(pMutex); } - bool tryLock(void) { + BOOL tryLock(void) { if(!pMutex) return false; diff --git a/src/system/CThread.h b/src/system/CThread.h index 81d8ac2..21a1700 100644 --- a/src/system/CThread.h +++ b/src/system/CThread.h @@ -17,103 +17,117 @@ #ifndef CTHREAD_H_ #define CTHREAD_H_ + #include #include +#include #include -class CThread -{ +class CThread { public: - typedef void (* Callback)(CThread *thread, void *arg); + typedef void (* Callback)(CThread *thread, void *arg); - //! constructor - CThread(int iAttr, int iPriority = 16, int iStackSize = 0x8000, CThread::Callback callback = NULL, void *callbackArg = NULL) - : pThread(NULL) - , pThreadStack(NULL) - , pCallback(callback) - , pCallbackArg(callbackArg) - { - //! save attribute assignment - iAttributes = iAttr; - //! allocate the thread - pThread = (OSThread*)memalign(8, sizeof(OSThread)); - //! allocate the stack - pThreadStack = (u8 *) memalign(0x20, iStackSize); + //! constructor + CThread(int32_t iAttr, int32_t iPriority = 16, int32_t iStackSize = 0x8000, CThread::Callback callback = NULL, void *callbackArg = NULL) + : pThread(NULL) + , pThreadStack(NULL) + , pCallback(callback) + , pCallbackArg(callbackArg) { + //! save attribute assignment + iAttributes = iAttr; + //! allocate the thread + pThread = (OSThread*)memalign(8, sizeof(OSThread)); + //! allocate the stack + pThreadStack = (uint8_t *) memalign(0x20, iStackSize); //! create the thread - if(pThread && pThreadStack) + if(pThread && pThreadStack) OSCreateThread(pThread, &CThread::threadCallback, 1, (char*)this, pThreadStack+iStackSize, iStackSize, iPriority, iAttributes); - } + } - //! destructor - virtual ~CThread() { shutdownThread(); } + //! destructor + virtual ~CThread() { + shutdownThread(); + } - static CThread *create(CThread::Callback callback, void *callbackArg, int iAttr = eAttributeNone, int iPriority = 16, int iStackSize = 0x8000) - { - return ( new CThread(iAttr, iPriority, iStackSize, callback, callbackArg) ); - } + static CThread *create(CThread::Callback callback, void *callbackArg, int32_t iAttr = eAttributeNone, int32_t iPriority = 16, int32_t iStackSize = 0x8000) { + return ( new CThread(iAttr, iPriority, iStackSize, callback, callbackArg) ); + } - //! Get thread ID - virtual void* getThread() const { return pThread; } - //! Thread entry function - virtual void executeThread(void) - { - if(pCallback) + //! Get thread ID + virtual void* getThread() const { + return pThread; + } + //! Thread entry function + virtual void executeThread(void) { + if(pCallback) pCallback(this, pCallbackArg); - } - //! Suspend thread - virtual void suspendThread(void) { if(isThreadSuspended()) return; if(pThread) OSSuspendThread(pThread); } - //! Resume thread - virtual void resumeThread(void) { if(!isThreadSuspended()) return; if(pThread) OSResumeThread(pThread); } - //! Set thread priority - virtual void setThreadPriority(int prio) { if(pThread) OSSetThreadPriority(pThread, prio); } - //! Check if thread is suspended - virtual bool isThreadSuspended(void) const { if(pThread) return OSIsThreadSuspended(pThread); return false; } - //! Check if thread is terminated - virtual bool isThreadTerminated(void) const { if(pThread) return OSIsThreadTerminated(pThread); return false; } - //! Check if thread is running - virtual bool isThreadRunning(void) const { return !isThreadSuspended() && !isThreadRunning(); } - //! Shutdown thread - virtual void shutdownThread(void) - { - //! wait for thread to finish - if(pThread && !(iAttributes & eAttributeDetach)) - { - if(isThreadSuspended()) + } + //! Suspend thread + virtual void suspendThread(void) { + if(isThreadSuspended()) return; + if(pThread) OSSuspendThread(pThread); + } + //! Resume thread + virtual void resumeThread(void) { + if(!isThreadSuspended()) return; + if(pThread) OSResumeThread(pThread); + } + //! Set thread priority + virtual void setThreadPriority(int prio) { + if(pThread) OSSetThreadPriority(pThread, prio); + } + //! Check if thread is suspended + virtual BOOL isThreadSuspended(void) const { + if(pThread) return OSIsThreadSuspended(pThread); + return false; + } + //! Check if thread is terminated + virtual BOOL isThreadTerminated(void) const { + if(pThread) return OSIsThreadTerminated(pThread); + return false; + } + //! Check if thread is running + virtual BOOL isThreadRunning(void) const { + return !isThreadSuspended() && !isThreadRunning(); + } + //! Shutdown thread + virtual void shutdownThread(void) { + //! wait for thread to finish + if(pThread && !(iAttributes & eAttributeDetach)) { + if(isThreadSuspended()) resumeThread(); - OSJoinThread(pThread, NULL); - } - //! free the thread stack buffer - if(pThreadStack) - free(pThreadStack); - if(pThread) - free(pThread); + OSJoinThread(pThread, NULL); + } + //! free the thread stack buffer + if(pThreadStack) + free(pThreadStack); + if(pThread) + free(pThread); - pThread = NULL; - pThreadStack = NULL; - } + pThread = NULL; + pThreadStack = NULL; + } //! Thread attributes - enum eCThreadAttributes - { - eAttributeNone = 0x07, - eAttributeAffCore0 = 0x01, - eAttributeAffCore1 = 0x02, - eAttributeAffCore2 = 0x04, - eAttributeDetach = 0x08, - eAttributePinnedAff = 0x10 - }; + enum eCThreadAttributes { + eAttributeNone = 0x07, + eAttributeAffCore0 = 0x01, + eAttributeAffCore1 = 0x02, + eAttributeAffCore2 = 0x04, + eAttributeDetach = 0x08, + eAttributePinnedAff = 0x10 + }; private: - static int threadCallback(int argc, const char **argv) - { - //! After call to start() continue with the internal function - ((CThread *) argv)->executeThread(); - return 0; - } + static int threadCallback(int argc, const char **argv) { + //! After call to start() continue with the internal function + ((CThread *) argv)->executeThread(); + return 0; + } int iAttributes; - OSThread *pThread; - u8 *pThreadStack; - Callback pCallback; - void *pCallbackArg; + OSThread *pThread; + uint8_t *pThreadStack; + Callback pCallback; + void *pCallbackArg; }; #endif diff --git a/src/system/exception_handler.c b/src/system/exception_handler.c deleted file mode 100644 index 9d8a66b..0000000 --- a/src/system/exception_handler.c +++ /dev/null @@ -1,169 +0,0 @@ -#include -#include "common/types.h" -#include "exception_handler.h" - -#define OS_EXCEPTION_MODE_GLOBAL_ALL_CORES 4 - -#define OS_EXCEPTION_DSI 2 -#define OS_EXCEPTION_ISI 3 -#define OS_EXCEPTION_PROGRAM 6 - -/* Exceptions */ -typedef struct OSContext -{ - /* OSContext identifier */ - uint32_t tag1; - uint32_t tag2; - - /* GPRs */ - uint32_t gpr[32]; - - /* Special registers */ - uint32_t cr; - uint32_t lr; - uint32_t ctr; - uint32_t xer; - - /* Initial PC and MSR */ - uint32_t srr0; - uint32_t srr1; - - /* Only valid during DSI exception */ - uint32_t exception_specific0; - uint32_t exception_specific1; - - /* There is actually a lot more here but we don't need the rest*/ -} OSContext; - -#include -#include - -#define CPU_STACK_TRACE_DEPTH 10 -#define __stringify(rn) #rn - -#define mfspr(_rn) \ -({ register uint32_t _rval = 0; \ - asm volatile("mfspr %0," __stringify(_rn) \ - : "=r" (_rval));\ - _rval; \ -}) - -typedef struct _framerec { - struct _framerec *up; - void *lr; -} frame_rec, *frame_rec_t; - -static const char *exception_names[] = { - "DSI", - "ISI", - "PROGRAM" -}; - -static const char exception_print_formats[18][45] = { - "Exception type %s occurred!\n", // 0 - "GPR00 %08X GPR08 %08X GPR16 %08X GPR24 %08X\n", // 1 - "GPR01 %08X GPR09 %08X GPR17 %08X GPR25 %08X\n", // 2 - "GPR02 %08X GPR10 %08X GPR18 %08X GPR26 %08X\n", // 3 - "GPR03 %08X GPR11 %08X GPR19 %08X GPR27 %08X\n", // 4 - "GPR04 %08X GPR12 %08X GPR20 %08X GPR28 %08X\n", // 5 - "GPR05 %08X GPR13 %08X GPR21 %08X GPR29 %08X\n", // 6 - "GPR06 %08X GPR14 %08X GPR22 %08X GPR30 %08X\n", // 7 - "GPR07 %08X GPR15 %08X GPR23 %08X GPR31 %08X\n", // 8 - "LR %08X SRR0 %08x SRR1 %08x\n", // 9 - "DAR %08X DSISR %08X\n", // 10 - "\nSTACK DUMP:", // 11 - " --> ", // 12 - " -->\n", // 13 - "\n", // 14 - "%p", // 15 - "\nCODE DUMP:\n", // 16 - "%p: %08X %08X %08X %08X\n", // 17 -}; - -static unsigned char exception_cb(OSContext * context, unsigned char exception_type) { - char buf[850]; - int pos = 0; - /* - * This part is mostly from libogc. Thanks to the devs over there. - */ - pos += sprintf(buf + pos, exception_print_formats[0], exception_names[exception_type]); - pos += sprintf(buf + pos, exception_print_formats[1], context->gpr[0], context->gpr[8], context->gpr[16], context->gpr[24]); - pos += sprintf(buf + pos, exception_print_formats[2], context->gpr[1], context->gpr[9], context->gpr[17], context->gpr[25]); - pos += sprintf(buf + pos, exception_print_formats[3], context->gpr[2], context->gpr[10], context->gpr[18], context->gpr[26]); - pos += sprintf(buf + pos, exception_print_formats[4], context->gpr[3], context->gpr[11], context->gpr[19], context->gpr[27]); - pos += sprintf(buf + pos, exception_print_formats[5], context->gpr[4], context->gpr[12], context->gpr[20], context->gpr[28]); - pos += sprintf(buf + pos, exception_print_formats[6], context->gpr[5], context->gpr[13], context->gpr[21], context->gpr[29]); - pos += sprintf(buf + pos, exception_print_formats[7], context->gpr[6], context->gpr[14], context->gpr[22], context->gpr[30]); - pos += sprintf(buf + pos, exception_print_formats[8], context->gpr[7], context->gpr[15], context->gpr[23], context->gpr[31]); - pos += sprintf(buf + pos, exception_print_formats[9], context->lr, context->srr0, context->srr1); - - //if(exception_type == OS_EXCEPTION_DSI) { - pos += sprintf(buf + pos, exception_print_formats[10], context->exception_specific1, context->exception_specific0); // this freezes - //} - - void *pc = (void*)context->srr0; - void *lr = (void*)context->lr; - void *r1 = (void*)context->gpr[1]; - register uint32_t i = 0; - register frame_rec_t l,p = (frame_rec_t)lr; - - l = p; - p = r1; - if(!p) - asm volatile("mr %0,%%r1" : "=r"(p)); - - pos += sprintf(buf + pos, exception_print_formats[11]); - - for(i = 0; i < CPU_STACK_TRACE_DEPTH-1 && p->up; p = p->up, i++) { - if(i % 4) - pos += sprintf(buf + pos, exception_print_formats[12]); - else { - if(i > 0) - pos += sprintf(buf + pos, exception_print_formats[13]); - else - pos += sprintf(buf + pos, exception_print_formats[14]); - } - - switch(i) { - case 0: - if(pc) - pos += sprintf(buf + pos, exception_print_formats[15],pc); - break; - case 1: - if(!l) - l = (frame_rec_t)mfspr(8); - pos += sprintf(buf + pos, exception_print_formats[15],(void*)l); - break; - default: - pos += sprintf(buf + pos, exception_print_formats[15],(void*)(p->up->lr)); - break; - } - } - - //if(exception_type == OS_EXCEPTION_DSI) { - uint32_t *pAdd = (uint32_t*)context->srr0; - pos += sprintf(buf + pos, exception_print_formats[16]); - // TODO by Dimok: this was actually be 3 instead of 2 lines in libogc .... but there is just no more space anymore on the screen - for (i = 0; i < 8; i += 4) - pos += sprintf(buf + pos, exception_print_formats[17], &(pAdd[i]),pAdd[i], pAdd[i+1], pAdd[i+2], pAdd[i+3]); - //} - - OSFatal(buf); - return 1; -} - -static unsigned char dsi_exception_cb(void * context) { - return exception_cb(context, 0); -} -static unsigned char isi_exception_cb(void * context) { - return exception_cb(context, 1); -} -static unsigned char program_exception_cb(void * context) { - return exception_cb(context, 2); -} - -void setup_os_exceptions(void) { - OSSetExceptionCallback(OS_EXCEPTION_DSI, (OSExceptionCallbackFn)dsi_exception_cb); - OSSetExceptionCallback(OS_EXCEPTION_ISI, (OSExceptionCallbackFn)isi_exception_cb); - OSSetExceptionCallback(OS_EXCEPTION_PROGRAM, (OSExceptionCallbackFn)program_exception_cb); -} diff --git a/src/system/exception_handler.h b/src/system/exception_handler.h deleted file mode 100644 index 7626f92..0000000 --- a/src/system/exception_handler.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef __EXCEPTION_HANDLER_H_ -#define __EXCEPTION_HANDLER_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -void setup_os_exceptions(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/src/system/memory.c b/src/system/memory.c index 9d41226..a3ad26c 100644 --- a/src/system/memory.c +++ b/src/system/memory.c @@ -17,10 +17,8 @@ #include #include #include -#include -#include -#include -#include "common/common.h" +#include +#include #include "memory.h" #define MEMORY_ARENA_1 0 @@ -37,14 +35,14 @@ //! Memory functions //! This is the only place where those are needed so lets keep them more or less private //!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -static MEMExpandedHeap * mem1_heap = NULL; -static MEMExpandedHeap * bucket_heap = NULL; +static MEMHeapHandle mem1_heap = NULL; +static MEMHeapHandle bucket_heap = NULL; void memoryInitialize(void) { if(!mem1_heap) { - MEMFrameHeap * mem1_heap_handle = MEMGetBaseHeapHandle(MEMORY_ARENA_1); + MEMHeapHandle mem1_heap_handle = MEMGetBaseHeapHandle(MEMORY_ARENA_1); unsigned int mem1_allocatable_size = MEMGetAllocatableSizeForFrmHeapEx(mem1_heap_handle, 4); void *mem1_memory = MEMAllocFromFrmHeapEx(mem1_heap_handle, mem1_allocatable_size, 4); if(mem1_memory) @@ -53,7 +51,7 @@ void memoryInitialize(void) if(!bucket_heap) { - MEMFrameHeap * bucket_heap_handle = MEMGetBaseHeapHandle(MEMORY_ARENA_FG_BUCKET); + MEMHeapHandle bucket_heap_handle = MEMGetBaseHeapHandle(MEMORY_ARENA_FG_BUCKET); unsigned int bucket_allocatable_size = MEMGetAllocatableSizeForFrmHeapEx(bucket_heap_handle, 4); void *bucket_memory = MEMAllocFromFrmHeapEx(bucket_heap_handle, bucket_allocatable_size, 4); if(bucket_memory) diff --git a/src/system/memory_area_table.c b/src/system/memory_area_table.c deleted file mode 100644 index 76bcba8..0000000 --- a/src/system/memory_area_table.c +++ /dev/null @@ -1,397 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#include -#include -#include "common/common.h" -#include "utils/utils.h" -#include "memory_area_table.h" - -typedef struct _memory_values_t -{ - unsigned int start_address; - unsigned int end_address; -} memory_values_t; - -static const memory_values_t mem_vals_400[] = -{ - { 0x2E573BFC, 0x2FF8F83C }, // 26735 kB - { 0x2D86D318, 0x2DFFFFFC }, // 7755 kB - { 0x2CE59830, 0x2D3794D8 }, // 5247 kB - { 0x2D3795AC, 0x2D854300 }, // 4971 kB - { 0x28FEC800, 0x293B29D0 }, // 3864 kB - { 0x29BC200C, 0x29D79B94 }, // 1758 kB - { 0x2A517A68, 0x2A6794B8 }, // 1414 kB - { 0x288C1D80, 0x28A69FA0 }, // 1696 kB - - { 0, 0 } -}; - -static const memory_values_t mem_vals_410[] = -{ -// { 0x28041760, 0x28049D0C } // 33 kB -// { 0x280608F4, 0x2806C97C } // 48 kB -// { 0x280953C8, 0x280A1324 } // 47 kB -// { 0x280A1358, 0x280AD388 } // 48 kB -// { 0x280C9040, 0x280D0ABC } // 30 kB -// { 0x280D0AD8, 0x28113FBC } // 269 kB -// { 0x2812575C, 0x2817A53C } // 339 kB -// { 0x2817A6A0, 0x281BA53C } // 255 kB -// { 0x281D571C, 0x2820253C } // 179 kB -// { 0x28234D00, 0x2824B33C } // 89 kB -// { 0x2824E300, 0x2828D7BC } // 253 kB -// { 0x282A8DF0, 0x282B63FC } // 53 kB -// { 0x282BC524, 0x282C62FC } // 39 kB -// { 0x2835A988, 0x28366804 } // 47 kB -// { 0x2836E05C, 0x28378DBC } // 43 kB -// { 0x283A735C, 0x284D2A64 } // 1197 kB (1 MB) -// { 0x284D76B0, 0x285021FC } // 170 kB -// { 0x285766A4, 0x28583E4C } // 53 kB -// { 0x28590E5C, 0x2859B248 } // 40 kB -// { 0x2859B288, 0x285AE06C } // 75 kB -// { 0x285B7108, 0x285C0A7C } // 38 kB -// { 0x285C38A0, 0x285D089C } // 52 kB -// { 0x285D0A84, 0x285DC63C } // 46 kB -// { 0x285E0A84, 0x285F089C } // 63 kB -// { 0x285F7FD0, 0x286037D8 } // 46 kB -// { 0x2860E3E4, 0x28621B00 } // 77 kB -// { 0x286287B0, 0x28638BC0 } // 65 kB -// { 0x2863F4A0, 0x2864DE00 } // 58 kB -// { 0x2864F1FC, 0x28656EE0 } // 31 kB -// { 0x2865AF44, 0x286635A0 } // 33 kB -// { 0x2866F774, 0x2867C680 } // 51 kB -// { 0x2867FAC0, 0x286A2CA0 } // 140 kB -// { 0x286B3540, 0x286C1900 } // 56 kB -// { 0x286C64A4, 0x286DDB80 } // 93 kB -// { 0x286E640C, 0x286F1DC0 } // 46 kB -// { 0x286F3884, 0x2870D3C0 } // 102 kB -// { 0x28710824, 0x28719D80 } // 37 kB -// { 0x2872A674, 0x2873B180 } // 66 kB -// { 0x287402F0, 0x28758780 } // 97 kB -// { 0x287652F0, 0x28771C00 } // 50 kB -// { 0x287F878C, 0x2880A680 } // 71 kB -// { 0x2880F4AC, 0x2881E6E0 } // 60 kB -// { 0x28821488, 0x28829A40 } // 33 kB -// { 0x2882A5D0, 0x288385BC } // 55 kB -// { 0x288385D8, 0x28854780 } // 112 kB -// { 0x28857984, 0x28864F80 } // 53 kB -// { 0x28870AC0, 0x2887CAC0 } // 48 kB -// { 0x2887CAC8, 0x28888CC8 } // 48 kB -// { 0x28888CD0, 0x28894ED0 } // 48 kB -// { 0x28894ED8, 0x288BE0DC } // 164 kB -// { 0x288C1C70, 0x28AD9ED4 } // 2144 kB (2 MB) -// { 0x28AD9F04, 0x28B66100 } // 560 kB -// { 0x28B748A8, 0x28B952E0 } // 130 kB -// { 0x28B9AB58, 0x28BA2480 } // 30 kB -// { 0x28BA3D00, 0x28BC21C0 } // 121 kB -// { 0x28BC2F08, 0x28BD9860 } // 90 kB -// { 0x28BED09C, 0x28BFDD00 } // 67 kB -// { 0x28C068F0, 0x28C2E220 } // 158 kB -// { 0x28CC4C6C, 0x28CF6834 } // 198 kB -// { 0x28D3DD64, 0x28D4BF8C } // 56 kB -// { 0x28D83C4C, 0x28DD0284 } // 305 kB -// { 0x28DDDED4, 0x28E84294 } // 664 kB -// { 0x28E99C7C, 0x28F382A4 } // 633 kB -// { 0x28F45EF4, 0x28FEC2B4 } // 664 kB -// { 0x28FEC800, 0x293B2A18 } // 3864 kB (3 MB) -// { 0x293E187C, 0x293EC7FC } // 43 kB -// { 0x295C7240, 0x295D523C } // 56 kB -// { 0x295DA8DC, 0x295E323C } // 34 kB -// { 0x295ED6C0, 0x295F6FDC } // 38 kB -// { 0x29606340, 0x2960FC5C } // 38 kB -// { 0x2964F040, 0x29657C3C } // 35 kB -// { 0x296E0EBC, 0x296EBDBC } // 43 kB -// { 0x2998DFB4, 0x2999DEE4 } // 63 kB -// { 0x2999E6A8, 0x299BE9C4 } // 128 kB -// { 0x29B8DF40, 0x29BA09DC } // 74 kB -// { 0x29BC200C, 0x29D79B94 } // 1758 kB (1 MB) -// { 0x29DA9694, 0x29DB1694 } // 32 kB -// { 0x2A3D7558, 0x2A427558 } // 320 kB -// { 0x2A42769C, 0x2A47769C } // 320 kB -// { 0x2A4777E0, 0x2A4C77E0 } // 320 kB -// { 0x2A4C7924, 0x2A517924 } // 320 kB -// { 0x2A517A68, 0x2A6794B8 } // 1414 kB (1 MB) -// { 0x2AD17528, 0x2AD4EA24 } // 221 kB -// { 0x2B038C4C, 0x2B1794C8 } // 1282 kB (1 MB) -// { 0x2BBA990C, 0x2BBB983C } // 63 kB -// { 0x2BBBA160, 0x2BC82164 } // 800 kB -// { 0x2BD0000C, 0x2BD71638 } // 453 kB -// { 0x2BD7170C, 0x2BD83B0C } // 73 kB -// { 0x2BDBA000, 0x2BDCA028 } // 64 kB -// { 0x2BDCE000, 0x2BDDE028 } // 64 kB -// { 0x2BDE2E34, 0x2BDF2D64 } // 63 kB -// { 0x2BDF35E8, 0x2BE031BC } // 62 kB -// { 0x2BE052A4, 0x2BE151D4 } // 63 kB -// { 0x2BE174AC, 0x2BE27244 } // 63 kB -// { 0x2BE3AC80, 0x2BE48C80 } // 56 kB -// { 0x2BE49EDC, 0x2BE56C7C } // 51 kB -// { 0x2BE82F70, 0x2BE92E9C } // 63 kB -// { 0x2BE9ADBC, 0x2BEA8DBC } // 56 kB -// { 0x2BEAAB7C, 0x2BEB6DBC } // 48 kB -// { 0x2BEC0F3C, 0x2BECEF3C } // 56 kB -// { 0x2BED45DC, 0x2BEDCF3C } // 34 kB -// { 0x2BEE73C0, 0x2BEF0CDC } // 38 kB -// { 0x2BF00040, 0x2BF0995C } // 38 kB -// { 0x2BF48D40, 0x2BF5193C } // 35 kB -// { 0x2BFDABBC, 0x2BFE5ABC } // 43 kB -// { 0x2C03DA40, 0x2C045D7C } // 32 kB -// { 0x2C179450, 0x2C18937C } // 63 kB -// { 0x2C1DC940, 0x2C1EA93C } // 56 kB -// { 0x2C1EABDC, 0x2C1F893C } // 55 kB -// { 0x2C239A80, 0x2C243D3C } // 40 kB -// { 0x2CE10224, 0x2CE3683C } // 153 kB -// { 0x2CE374F4, 0x2CE473A4 } // 63 kB -// { 0x2CE49830, 0x2D3794D8 } // 5311 kB (5 MB) -// { 0x2D3795AC, 0x2D854300 } // 4971 kB (4 MB) -// { 0x2D8546B0, 0x2D8602C4 } // 47 kB -// { 0x2D86D318, 0x2DFFFFFC } // 7755 kB (7 MB) -// { 0x2E2DCD60, 0x2E2E4D7C } // 32 kB -// { 0x2E33F160, 0x2E365AFC } // 154 kB -// { 0x2E37AC40, 0x2E39BB3C } // 131 kB -// { 0x2E3A6EF0, 0x2E3CA2FC } // 141 kB -// { 0x2E3D9EE0, 0x2E400B3C } // 155 kB -// { 0x2E43A8F0, 0x2E442BBC } // 32 kB -// { 0x2E46EC90, 0x2E48E27C } // 125 kB -// { 0x2E497F90, 0x2E4A147C } // 37 kB -// { 0x2E4A5B40, 0x2E4C67BC } // 131 kB -// { 0x2E4FBEF0, 0x2E52697C } // 170 kB -// { 0x2E550750, 0x2E57333C } // 138 kB -// { 0x2E573F3C, 0x2FF8F07C } // 226732 kB (26 MB) -// { 0x31000000, 0x31E1FFFC } // 614464 kB (14 MB) -// { 0x320A5D80, 0x320AEA3C } // 35 kB -// { 0x320E8670, 0x3210017C } // 94 kB -// { 0x3212609C, 0x3213187C } // 45 kB -// { 0x3219DF08, 0x321B72BC } // 100 kB -// { 0x3300ED34, 0x3301AD3C } // 48 kB -// { 0x33041760, 0x33049D0C } // 33 kB -// { 0x330608F8, 0x3306C97C } // 48 kB -// { 0x33089D80, 0x33095284 } // 45 kB -// { 0x33095470, 0x330A1324 } // 47 kB -// { 0x330A1358, 0x330ADC10 } // 50 kB -// { 0x330C9040, 0x330D0ABC } // 30 kB -// { 0x330D0AD8, 0x3311F9CC } // 315 kB -// { 0x3312575C, 0x3320A63C } // 915 kB -// { 0x33234D00, 0x3324B33C } // 89 kB -// { 0x3324E300, 0x3328D7BC } // 253 kB -// { 0x3329D134, 0x332CA324 } // 180 kB -// { 0x3332B200, 0x33340C88 } // 86 kB -// { 0x3335A440, 0x335021FC } // 1695 kB (1 MB) -// { 0x3350A778, 0x3391680C } // 4144 kB (4 MB) -// { 0x3391A444, 0x3392A25C } // 63 kB -// { 0x3392A444, 0x33939EB4 } // 62 kB -// { 0x3393A444, 0x3394A25C } // 63 kB -// { 0x339587C0, 0x33976C80 } // 121 kB -// { 0x339779C8, 0x3398E320 } // 90 kB -// { 0x3399AE74, 0x339A7D80 } // 51 kB -// { 0x339AB1C0, 0x339CE3A0 } // 140 kB -// { 0x339CEB28, 0x339DEC38 } // 64 kB -// { 0x339DEC40, 0x339ED000 } // 56 kB -// { 0x339F1BA4, 0x33A09280 } // 93 kB -// { 0x33A0C6E4, 0x33A15C40 } // 37 kB -// { 0x33A15D64, 0x33EBFFFC } // 4776 kB (4 MB) -// { 0x33F01380, 0x33F21FFC } // 131 kB -// { 0x33F44820, 0x33F6B1BC } // 154 kB -// { 0x33F80300, 0x33FA11FC } // 131 kB -// { 0x33FA4D3C, 0x33FEDAFC } // 291 kB -// { 0x33FFFFD4, 0x38FFFFFC } // 81920 kB (80 MB) - {0, 0} -}; - -static const memory_values_t mem_vals_500[] = -{ - { 0x2E605CBC, 0x2FF849BC }, // size 26733828 (26107 kB) (25 MB) - { 0x2CAE7878, 0x2D207DB4 }, // size 7472448 (7297 kB) (7 MB) - { 0x2D3B966C, 0x2D8943C0 }, // size 5090648 (4971 kB) (4 MB) - { 0x2D8AD3D8, 0x2DFFFFFC }, // size 7679016 (7499 kB) (7 MB) - // TODO: Check which of those areas are usable -// { 0x283A73DC, 0x284D2AE4 } // size 1226508 (1197 kB) (1 MB) -// { 0x29030800, 0x293F69FC } // size 3957248 (3864 kB) (3 MB) -// { 0x2970200C, 0x298B9C54 } // size 1801292 (1759 kB) (1 MB) -// { 0x2A057B68, 0x2A1B9578 } // size 1448468 (1414 kB) (1 MB) - -// { 0x29030800, 0x293F69FC } // size 3957248 (3864 kB) (3 MB) -// { 0x2970200C, 0x298B9C54 } // size 1801292 (1759 kB) (1 MB) -// { 0x2A057B68, 0x2A1B9578 } // size 1448468 (1414 kB) (1 MB) -// { 0x288EEC30, 0x28B06E94 } // size 2196072 (2144 kB) (2 MB) -// { 0x283A73DC, 0x284D2AE4 } // size 1226508 (1197 kB) (1 MB) -// { 0x3335A4C0, 0x335021FC } // size 1736000 (1695 kB) (1 MB) -// { 0x3350C1D4, 0x339182CC } // size 4243708 (4144 kB) (4 MB) -// { 0x33A14094, 0x33EBFFFC } // size 4898668 (4783 kB) (4 MB) -// { 0x33FFFFD4, 0x38FFFFFC } // size 83886124 (81920 kB) (80 MB) - {0, 0} -}; - -static const memory_values_t mem_vals_532[] = -{ - // TODO: Check which of those areas are usable -// {0x28000000 + 0x000DCC9C, 0x28000000 + 0x00174F80}, // 608 kB -// {0x28000000 + 0x00180B60, 0x28000000 + 0x001C0A00}, // 255 kB -// {0x28000000 + 0x001ECE9C, 0x28000000 + 0x00208CC0}, // 111 kB -// {0x28000000 + 0x00234180, 0x28000000 + 0x0024B444}, // 92 kB -// {0x28000000 + 0x0024D8C0, 0x28000000 + 0x0028D884}, // 255 kB -// {0x28000000 + 0x003A745C, 0x28000000 + 0x004D2B68}, // 1197 kB -// {0x28000000 + 0x004D77B0, 0x28000000 + 0x00502200}, // 170 kB -// {0x28000000 + 0x005B3A88, 0x28000000 + 0x005C6870}, // 75 kB -// {0x28000000 + 0x0061F3E4, 0x28000000 + 0x00632B04}, // 77 kB -// {0x28000000 + 0x00639790, 0x28000000 + 0x00649BC4}, // 65 kB -// {0x28000000 + 0x00691490, 0x28000000 + 0x006B3CA4}, // 138 kB -// {0x28000000 + 0x006D7BCC, 0x28000000 + 0x006EEB84}, // 91 kB -// {0x28000000 + 0x00704E44, 0x28000000 + 0x0071E3C4}, // 101 kB -// {0x28000000 + 0x0073B684, 0x28000000 + 0x0074C184}, // 66 kB -// {0x28000000 + 0x00751354, 0x28000000 + 0x00769784}, // 97 kB -// {0x28000000 + 0x008627DC, 0x28000000 + 0x00872904}, // 64 kB -// {0x28000000 + 0x008C1E98, 0x28000000 + 0x008EB0A0}, // 164 kB -// {0x28000000 + 0x008EEC30, 0x28000000 + 0x00B06E98}, // 2144 kB -// {0x28000000 + 0x00B06EC4, 0x28000000 + 0x00B930C4}, // 560 kB -// {0x28000000 + 0x00BA1868, 0x28000000 + 0x00BC22A4}, // 130 kB -// {0x28000000 + 0x00BC48F8, 0x28000000 + 0x00BDEC84}, // 104 kB -// {0x28000000 + 0x00BE3DC0, 0x28000000 + 0x00C02284}, // 121 kB -// {0x28000000 + 0x00C02FC8, 0x28000000 + 0x00C19924}, // 90 kB -// {0x28000000 + 0x00C2D35C, 0x28000000 + 0x00C3DDC4}, // 66 kB -// {0x28000000 + 0x00C48654, 0x28000000 + 0x00C6E2E4}, // 151 kB -// {0x28000000 + 0x00D04E04, 0x28000000 + 0x00D36938}, // 198 kB -// {0x28000000 + 0x00DC88AC, 0x28000000 + 0x00E14288}, // 302 kB -// {0x28000000 + 0x00E21ED4, 0x28000000 + 0x00EC8298}, // 664 kB -// {0x28000000 + 0x00EDDC7C, 0x28000000 + 0x00F7C2A8}, // 633 kB -// {0x28000000 + 0x00F89EF4, 0x28000000 + 0x010302B8}, // 664 kB -// {0x28000000 + 0x01030800, 0x28000000 + 0x013F69A0}, // 3864 kB -// {0x28000000 + 0x016CE000, 0x28000000 + 0x016E0AA0}, // 74 kB -// {0x28000000 + 0x0170200C, 0x28000000 + 0x018B9C58}, // 1759 kB -// {0x28000000 + 0x01F17658, 0x28000000 + 0x01F6765C}, // 320 kB -// {0x28000000 + 0x01F6779C, 0x28000000 + 0x01FB77A0}, // 320 kB -// {0x28000000 + 0x01FB78E0, 0x28000000 + 0x020078E4}, // 320 kB -// {0x28000000 + 0x02007A24, 0x28000000 + 0x02057A28}, // 320 kB -// {0x28000000 + 0x02057B68, 0x28000000 + 0x021B957C}, // 1414 kB -// {0x28000000 + 0x02891528, 0x28000000 + 0x028C8A28}, // 221 kB -// {0x28000000 + 0x02BBCC4C, 0x28000000 + 0x02CB958C}, // 1010 kB -// {0x28000000 + 0x0378D45C, 0x28000000 + 0x03855464}, // 800 kB -// {0x28000000 + 0x0387800C, 0x28000000 + 0x03944938}, // 818 kB -// {0x28000000 + 0x03944A08, 0x28000000 + 0x03956E0C}, // 73 kB -// {0x28000000 + 0x04A944A4, 0x28000000 + 0x04ABAAC0}, // 153 kB -// {0x28000000 + 0x04ADE370, 0x28000000 + 0x0520EAB8}, // 7361 kB // ok -// {0x28000000 + 0x053B966C, 0x28000000 + 0x058943C4}, // 4971 kB // ok -// {0x28000000 + 0x058AD3D8, 0x28000000 + 0x06000000}, // 7499 kB -// {0x28000000 + 0x0638D320, 0x28000000 + 0x063B0280}, // 139 kB -// {0x28000000 + 0x063C39E0, 0x28000000 + 0x063E62C0}, // 138 kB -// {0x28000000 + 0x063F52A0, 0x28000000 + 0x06414A80}, // 125 kB -// {0x28000000 + 0x06422810, 0x28000000 + 0x0644B2C0}, // 162 kB -// {0x28000000 + 0x064E48D0, 0x28000000 + 0x06503EC0}, // 125 kB -// {0x28000000 + 0x0650E360, 0x28000000 + 0x06537080}, // 163 kB -// {0x28000000 + 0x0653A460, 0x28000000 + 0x0655C300}, // 135 kB -// {0x28000000 + 0x0658AA40, 0x28000000 + 0x065BC4C0}, // 198 kB // ok -// {0x28000000 + 0x065E51A0, 0x28000000 + 0x06608E80}, // 143 kB // ok -// {0x28000000 + 0x06609ABC, 0x28000000 + 0x07F82C00}, // 26084 kB // ok - -// {0x30000000 + 0x000DCC9C, 0x30000000 + 0x00180A00}, // 655 kB -// {0x30000000 + 0x00180B60, 0x30000000 + 0x001C0A00}, // 255 kB -// {0x30000000 + 0x001F5EF0, 0x30000000 + 0x00208CC0}, // 75 kB -// {0x30000000 + 0x00234180, 0x30000000 + 0x0024B444}, // 92 kB -// {0x30000000 + 0x0024D8C0, 0x30000000 + 0x0028D884}, // 255 kB -// {0x30000000 + 0x003A745C, 0x30000000 + 0x004D2B68}, // 1197 kB -// {0x30000000 + 0x006D3334, 0x30000000 + 0x00772204}, // 635 kB -// {0x30000000 + 0x00789C60, 0x30000000 + 0x007C6000}, // 240 kB -// {0x30000000 + 0x00800000, 0x30000000 + 0x01E20000}, // 22876 kB // ok - { 0x2E609ABC, 0x2FF82C00 }, // 26084 kB - { 0x29030800, 0x293F69A0 }, // 3864 kB - { 0x288EEC30, 0x28B06E98 }, // 2144 kB - { 0x2D3B966C, 0x2D8943C4 }, // 4971 kB - { 0x2CAE0370, 0x2D20EAB8 }, // 7361 kB - { 0x2D8AD3D8, 0x2E000000 }, // 7499 kB - - {0, 0} -}; // total : 66mB + 25mB - -static const memory_values_t mem_vals_540[] = -{ - { 0x2E609EFC, 0x2FF82000 }, // 26083 kB - { 0x29030800, 0x293F6000 }, // 3864 kB - { 0x288EEC30, 0x28B06800 }, // 2144 kB - { 0x2D3B966C, 0x2D894000 }, // 4971 kB - { 0x2CB56370, 0x2D1EF000 }, // 6756 kB - { 0x2D8AD3D8, 0x2E000000 }, // 7499 kB - { 0x2970200C, 0x298B9800 }, // 1759 kB - { 0x2A057B68, 0x2A1B9000 }, // 1414 kB - { 0x2ABBCC4C, 0x2ACB9000 }, // 1010 kB - {0, 0} -}; - -s_mem_area * memoryGetAreaTable(void) -{ - return MEM_AREA_TABLE; -} - -static inline void memoryAddArea(int start, int end, int cur_index) -{ - // Create and copy new memory area - s_mem_area * mem_area = memoryGetAreaTable(); - mem_area[cur_index].address = start; - mem_area[cur_index].size = end - start; - mem_area[cur_index].next = 0; - - // Fill pointer to this area in the previous area - if (cur_index > 0) - { - mem_area[cur_index - 1].next = &mem_area[cur_index]; - } -} - -/* Create memory areas arrays */ -void memoryInitAreaTable() -{ - u32 ApplicationMemoryEnd = (u32)APP_BASE_MEM; - - // This one seems to be available on every firmware and therefore its our code area but also our main RPX area behind our code - // 22876 kB - our application // ok - if(OS_FIRMWARE <= 400) { - memoryAddArea(ApplicationMemoryEnd + 0x4B000000, 0x4B000000 + 0x01E20000, 0); - } - else { - memoryAddArea(ApplicationMemoryEnd + 0x30000000, 0x30000000 + 0x01E20000, 0); - } - - const memory_values_t * mem_vals = NULL; - - switch(OS_FIRMWARE) - { - case 400: { - mem_vals = mem_vals_400; - break; - } - case 500: { - mem_vals = mem_vals_500; - break; - } - case 532: { - mem_vals = mem_vals_532; - break; - } - case 540: - case 550: { - mem_vals = mem_vals_540; - break; - } - default: - return; // no known values - } - - // Fill entries - int i = 0; - while (mem_vals[i].start_address) - { - memoryAddArea(mem_vals[i].start_address, mem_vals[i].end_address, i + 1); - i++; - } -} diff --git a/src/system/memory_area_table.h b/src/system/memory_area_table.h deleted file mode 100644 index 70d7f2f..0000000 --- a/src/system/memory_area_table.h +++ /dev/null @@ -1,34 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#ifndef _MEMORY_AREA_TABLE_H_ -#define _MEMORY_AREA_TABLE_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "common/common.h" - -void memoryInitAreaTable(); -s_mem_area * memoryGetAreaTable(void); - - -#ifdef __cplusplus -} -#endif - -#endif // _MEMORY_AREA_TABLE_H_ diff --git a/src/utils/StringTools.cpp b/src/utils/StringTools.cpp index 7fff008..c1d672a 100644 --- a/src/utils/StringTools.cpp +++ b/src/utils/StringTools.cpp @@ -30,164 +30,167 @@ #include #include #include -#include "common/types.h" +#include +#include +#include +#include -const char * fmt(const char * format, ...) -{ - static char strChar[512]; - strChar[0] = 0; - char * tmp = NULL; - va_list va; - va_start(va, format); - if((vasprintf(&tmp, format, va) >= 0) && tmp) - { - snprintf(strChar, sizeof(strChar), tmp); - free(tmp); - va_end(va); - return (const char *) strChar; - } - va_end(va); - - if(tmp) - free(tmp); - - return NULL; +BOOL StringTools::EndsWith(const std::string& a, const std::string& b) { + if (b.size() > a.size()) return false; + return std::equal(a.begin() + a.size() - b.size(), a.end(), b.begin()); } -const wchar_t * wfmt(const char * format, ...) -{ - static wchar_t strWChar[512]; - strWChar[0] = 0; +const char * StringTools::byte_to_binary(int32_t x) { + static char b[9]; + b[0] = '\0'; - if(!format) - return (const wchar_t *) strWChar; + int32_t z; + for (z = 128; z > 0; z >>= 1) { + strcat(b, ((x & z) == z) ? "1" : "0"); + } - if(strcmp(format, "") == 0) - return (const wchar_t *) strWChar; - - char * tmp = NULL; - - va_list va; - va_start(va, format); - if((vasprintf(&tmp, format, va) >= 0) && tmp) - { - int bt; - int strlength = strlen(tmp); - bt = mbstowcs(strWChar, tmp, (strlength < 512) ? strlength : 512 ); - free(tmp); - tmp = 0; - - if(bt > 0) - { - strWChar[bt] = 0; - return (const wchar_t *) strWChar; - } - } - va_end(va); - - if(tmp) - free(tmp); - - return NULL; + return b; } -int strprintf(std::string &str, const char * format, ...) -{ - int result = 0; - char * tmp = NULL; - - va_list va; - va_start(va, format); - if((vasprintf(&tmp, format, va) >= 0) && tmp) - { - str = tmp; - result = str.size(); - } - va_end(va); - - if(tmp) - free(tmp); - - return result; +std::string StringTools::removeCharFromString(std::string& input,char toBeRemoved) { + std::string output = input; + size_t position; + while(1) { + position = output.find(toBeRemoved); + if(position == std::string::npos) + break; + output.erase(position, 1); + } + return output; } -std::string strfmt(const char * format, ...) -{ - std::string str; - char * tmp = NULL; +const char * StringTools::fmt(const char * format, ...) { + static char strChar[512]; + strChar[0] = 0; - va_list va; - va_start(va, format); - if((vasprintf(&tmp, format, va) >= 0) && tmp) - { - str = tmp; - } - va_end(va); + va_list va; + va_start(va, format); + if((vsprintf(strChar, format, va) >= 0)) { + va_end(va); + return (const char *) strChar; + } + va_end(va); - if(tmp) - free(tmp); - - return str; + return NULL; } -bool char2wchar_t(const char * strChar, wchar_t * dest) -{ - if(!strChar || !dest) - return false; +const wchar_t * StringTools::wfmt(const char * format, ...) { + static char tmp[512]; + static wchar_t strWChar[512]; + strWChar[0] = 0; + tmp[0] = 0; - int bt; - bt = mbstowcs(dest, strChar, strlen(strChar)); - if (bt > 0) { - dest[bt] = 0; - return true; - } + if(!format) + return (const wchar_t *) strWChar; - return false; + if(strcmp(format, "") == 0) + return (const wchar_t *) strWChar; + + va_list va; + va_start(va, format); + if((vsprintf(tmp, format, va) >= 0)) { + int bt; + int32_t strlength = strlen(tmp); + bt = mbstowcs(strWChar, tmp, (strlength < 512) ? strlength : 512 ); + + if(bt > 0) { + strWChar[bt] = 0; + return (const wchar_t *) strWChar; + } + } + va_end(va); + + return NULL; } -int strtokcmp(const char * string, const char * compare, const char * separator) -{ - if(!string || !compare) - return -1; +int32_t StringTools::strprintf(std::string &str, const char * format, ...) { + static char tmp[512]; + tmp[0] = 0; + int32_t result = 0; - char TokCopy[512]; - strncpy(TokCopy, compare, sizeof(TokCopy)); - TokCopy[511] = '\0'; + va_list va; + va_start(va, format); + if((vsprintf(tmp, format, va) >= 0)) { + str = tmp; + result = str.size(); + } + va_end(va); - char * strTok = strtok(TokCopy, separator); - - while (strTok != NULL) - { - if (strcasecmp(string, strTok) == 0) - { - return 0; - } - strTok = strtok(NULL,separator); - } - - return -1; + return result; } -int strextcmp(const char * string, const char * extension, char seperator) -{ - if(!string || !extension) - return -1; +std::string StringTools::strfmt(const char * format, ...) { + std::string str; + static char tmp[512]; + tmp[0] = 0; - char *ptr = strrchr(string, seperator); - if(!ptr) - return -1; + va_list va; + va_start(va, format); + if((vsprintf(tmp, format, va) >= 0)) { + str = tmp; + } + va_end(va); - return strcasecmp(ptr + 1, extension); + return str; +} + +BOOL StringTools::char2wchar_t(const char * strChar, wchar_t * dest) { + if(!strChar || !dest) + return false; + + int bt; + bt = mbstowcs(dest, strChar, strlen(strChar)); + if (bt > 0) { + dest[bt] = 0; + return true; + } + + return false; +} + +int32_t StringTools::strtokcmp(const char * string, const char * compare, const char * separator) { + if(!string || !compare) + return -1; + + char TokCopy[512]; + strncpy(TokCopy, compare, sizeof(TokCopy)); + TokCopy[511] = '\0'; + + char * strTok = strtok(TokCopy, separator); + + while (strTok != NULL) { + if (strcasecmp(string, strTok) == 0) { + return 0; + } + strTok = strtok(NULL,separator); + } + + return -1; +} + +int32_t StringTools::strextcmp(const char * string, const char * extension, char seperator) { + if(!string || !extension) + return -1; + + char *ptr = strrchr(string, seperator); + if(!ptr) + return -1; + + return strcasecmp(ptr + 1, extension); } -std::vector stringSplit(const std::string & inValue, const std::string & splitter) -{ +std::vector StringTools::stringSplit(const std::string & inValue, const std::string & splitter) { std::string value = inValue; std::vector result; while (true) { - unsigned int index = value.find(splitter); + uint32_t index = value.find(splitter); if (index == std::string::npos) { result.push_back(value); break; diff --git a/src/utils/StringTools.h b/src/utils/StringTools.h index 897376a..c648f4c 100644 --- a/src/utils/StringTools.h +++ b/src/utils/StringTools.h @@ -28,51 +28,55 @@ #include #include -#include "common/types.h" +#include -const char * fmt(const char * format, ...); -const wchar_t * wfmt(const char * format, ...); -int strprintf(std::string &str, const char * format, ...); -std::string strfmt(const char * format, ...); -bool char2wchar_t(const char * src, wchar_t * dest); -int strtokcmp(const char * string, const char * compare, const char * separator); -int strextcmp(const char * string, const char * extension, char seperator); +class StringTools{ + public: + static BOOL EndsWith(const std::string& a, const std::string& b); + static const char * byte_to_binary(int32_t x); + static std::string removeCharFromString(std::string& input,char toBeRemoved); + static const char * fmt(const char * format, ...); + static const wchar_t * wfmt(const char * format, ...); + static int32_t strprintf(std::string &str, const char * format, ...); + static std::string strfmt(const char * format, ...); + static BOOL char2wchar_t(const char * src, wchar_t * dest); + static int32_t strtokcmp(const char * string, const char * compare, const char * separator); + static int32_t strextcmp(const char * string, const char * extension, char seperator); -inline const char * FullpathToFilename(const char *path) -{ - if(!path) return path; + static const char * FullpathToFilename(const char *path){ + if(!path) return path; - const char * ptr = path; - const char * Filename = ptr; + const char * ptr = path; + const char * Filename = ptr; - while(*ptr != '\0') - { - if(ptr[0] == '/' && ptr[1] != '\0') - Filename = ptr+1; + while(*ptr != '\0') + { + if(ptr[0] == '/' && ptr[1] != '\0') + Filename = ptr+1; - ++ptr; - } + ++ptr; + } - return Filename; -} + return Filename; + } -inline void RemoveDoubleSlashs(std::string &str) -{ - u32 length = str.size(); + static void RemoveDoubleSlashs(std::string &str){ + uint32_t length = str.size(); - //! clear path of double slashes - for(u32 i = 1; i < length; ++i) - { - if(str[i-1] == '/' && str[i] == '/') - { - str.erase(i, 1); - i--; - length--; - } - } -} + //! clear path of double slashes + for(uint32_t i = 1; i < length; ++i) + { + if(str[i-1] == '/' && str[i] == '/') + { + str.erase(i, 1); + i--; + length--; + } + } + } -std::vector stringSplit(const std::string & value, const std::string & splitter); + static std::vector stringSplit(const std::string & value, const std::string & splitter); +}; #endif /* __STRING_TOOLS_H */ diff --git a/src/utils/logger.c b/src/utils/logger.c index 90f4497..ed95731 100644 --- a/src/utils/logger.c +++ b/src/utils/logger.c @@ -1,61 +1,48 @@ -#include #include #include #include #include #include +#include #include -#include "common/common.h" -#include "logger.h" +#include -#ifdef DEBUG_LOGGER -static int log_socket = -1; -static volatile int log_lock = 0; +#include +#include -void log_init(const char * ipString) -{ - log_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (log_socket < 0) - return; +static int log_socket __attribute__((section(".data")))= -1; +static struct sockaddr_in connect_addr __attribute__((section(".data"))); +static volatile int log_lock __attribute__((section(".data"))) = 0; - struct sockaddr_in connect_addr; - memset(&connect_addr, 0, sizeof(connect_addr)); - connect_addr.sin_family = AF_INET; - connect_addr.sin_port = 4405; - inet_aton(ipString, &connect_addr.sin_addr); +void log_init_() { + int broadcastEnable = 1; + log_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (log_socket < 0) + return; - if(connect(log_socket, (struct sockaddr*)&connect_addr, sizeof(connect_addr)) < 0) - { - socketclose(log_socket); - log_socket = -1; - } + setsockopt(log_socket, SOL_SOCKET, SO_BROADCAST, &broadcastEnable, sizeof(broadcastEnable)); + + memset(&connect_addr, 0, sizeof(struct sockaddr_in)); + connect_addr.sin_family = AF_INET; + connect_addr.sin_port = 4405; + connect_addr.sin_addr.s_addr = htonl(INADDR_BROADCAST); } -void log_deinit(void) -{ - if(log_socket >= 0) - { - socketclose(log_socket); - log_socket = -1; - } -} - -void log_print(const char *str) -{ +void log_print_(const char *str) { // socket is always 0 initially as it is in the BSS if(log_socket < 0) { return; } while(log_lock) - usleep(1000); + OSSleepTicks(OSMicrosecondsToTicks(1000)); log_lock = 1; int len = strlen(str); int ret; while (len > 0) { int block = len < 1400 ? len : 1400; // take max 1400 bytes per UDP packet - ret = send(log_socket, str, block, 0); + ret = sendto(log_socket, str, block, 0, (struct sockaddr *)&connect_addr, sizeof(struct sockaddr_in)); if(ret < 0) break; @@ -66,23 +53,30 @@ void log_print(const char *str) log_lock = 0; } -void log_printf(const char *format, ...) -{ +void OSFatal_printf(const char *format, ...) { + char tmp[512]; + tmp[0] = 0; + va_list va; + va_start(va, format); + if((vsprintf(tmp, format, va) >= 0)) { + OSFatal(tmp); + } + va_end(va); +} + +void log_printf_(const char *format, ...) { if(log_socket < 0) { return; } - char * tmp = NULL; + char tmp[512]; + tmp[0] = 0; - va_list va; - va_start(va, format); - if((vasprintf(&tmp, format, va) >= 0) && tmp) - { - log_print(tmp); - } - va_end(va); - - if(tmp) - free(tmp); + va_list va; + va_start(va, format); + if((vsprintf(tmp, format, va) >= 0)) { + log_print_(tmp); + } + va_end(va); } -#endif + diff --git a/src/utils/logger.h b/src/utils/logger.h index dd7cc71..a5b4919 100644 --- a/src/utils/logger.h +++ b/src/utils/logger.h @@ -5,19 +5,32 @@ extern "C" { #endif -#define DEBUG_LOGGER 1 +#include + +void log_init_(); +//void log_deinit_(void); +void log_print_(const char *str); +void log_printf_(const char *format, ...); +void OSFatal_printf(const char *format, ...); + +#define __FILENAME_X__ (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__) +#define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILENAME_X__) + +#define OSFATAL_FUNCTION_LINE(FMT, ARGS...)do { \ + OSFatal_printf("[%s]%s@L%04d: " FMT "",__FILENAME__,__FUNCTION__, __LINE__, ## ARGS); \ + } while (0) + + +#define log_init() log_init_() +//#define log_deinit() log_deinit_() +#define log_print(str) log_print_(str) +#define log_printf(FMT, ARGS...) log_printf_(FMT, ## ARGS); + +#define DEBUG_FUNCTION_LINE(FMT, ARGS...)do { \ + log_printf("[%23s]%30s@L%04d: " FMT "",__FILENAME__,__FUNCTION__, __LINE__, ## ARGS); \ + } while (0) + -#ifdef DEBUG_LOGGER -void log_init(const char * ip); -void log_deinit(void); -void log_print(const char *str); -void log_printf(const char *format, ...); -#else -#define log_init(x) -#define log_deinit() -#define log_print(x) -#define log_printf(x, ...) -#endif #ifdef __cplusplus } diff --git a/src/utils/utils.c b/src/utils/utils.c index c46a559..0042415 100644 --- a/src/utils/utils.c +++ b/src/utils/utils.c @@ -1,17 +1,41 @@ -#include +#include +#include +#include +#include +#include +#include +#include - -#define BUS_SPEED 248625000 -#define SECS_TO_TICKS(sec) (((unsigned long long)(sec)) * (BUS_SPEED/4)) -#define MILLISECS_TO_TICKS(msec) (SECS_TO_TICKS(msec) / 1000) -#define MICROSECS_TO_TICKS(usec) (SECS_TO_TICKS(usec) / 1000000) - -void usleep(unsigned int microsecs) -{ - OSSleepTicks(MICROSECS_TO_TICKS(microsecs)); -} - -void sleep(unsigned int secs) -{ - OSSleepTicks(SECS_TO_TICKS(secs)); +// https://gist.github.com/ccbrown/9722406 +void dumpHex(const void* data, size_t size) { + char ascii[17]; + size_t i, j; + ascii[16] = '\0'; + DEBUG_FUNCTION_LINE("0x%08X (0x0000): ", data); + for (i = 0; i < size; ++i) { + log_printf("%02X ", ((unsigned char*)data)[i]); + if (((unsigned char*)data)[i] >= ' ' && ((unsigned char*)data)[i] <= '~') { + ascii[i % 16] = ((unsigned char*)data)[i]; + } else { + ascii[i % 16] = '.'; + } + if ((i+1) % 8 == 0 || i+1 == size) { + log_printf(" "); + if ((i+1) % 16 == 0) { + log_printf("| %s \n", ascii); + if(i + 1 < size) { + DEBUG_FUNCTION_LINE("0x%08X (0x%04X); ", data + i + 1,i+1); + } + } else if (i+1 == size) { + ascii[(i+1) % 16] = '\0'; + if ((i+1) % 16 <= 8) { + log_printf(" "); + } + for (j = (i+1) % 16; j < 16; ++j) { + log_printf(" "); + } + log_printf("| %s \n", ascii); + } + } + } } diff --git a/src/utils/utils.h b/src/utils/utils.h index 729e808..26caaaf 100644 --- a/src/utils/utils.h +++ b/src/utils/utils.h @@ -2,45 +2,31 @@ #define __UTILS_H_ #include -#include "../common/types.h" #ifdef __cplusplus extern "C" { #endif -#define FlushBlock(addr) asm volatile("dcbf %0, %1\n" \ - "icbi %0, %1\n" \ - "sync\n" \ - "eieio\n" \ - "isync\n" \ - : \ - :"r"(0), "r"(((addr) & ~31)) \ - :"memory", "ctr", "lr", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12" \ - ); - #define LIMIT(x, min, max) \ ({ \ typeof( x ) _x = x; \ typeof( min ) _min = min; \ typeof( max ) _max = max; \ ( ( ( _x ) < ( _min ) ) ? ( _min ) : ( ( _x ) > ( _max ) ) ? ( _max) : ( _x ) ); \ - }) +}) #define DegToRad(a) ( (a) * 0.01745329252f ) -#define RadToDeg(a) ( (a) * 57.29577951f ) +#define RadToDeg(a) ( (a) * 57.29577951f ) #define ALIGN4(x) (((x) + 3) & ~3) -#define ALIGN32(x) (((x) + 31) & ~31) +#define ALIGN32(x) (((x) + 31) & ~31) -// those work only in powers of 2 -#define ROUNDDOWN(val, align) ((val) & ~(align-1)) -#define ROUNDUP(val, align) ROUNDDOWN(((val) + (align-1)), align) +#define le16(i) ((((uint16_t) ((i) & 0xFF)) << 8) | ((uint16_t) (((i) & 0xFF00) >> 8))) +#define le32(i) ((((uint32_t)le16((i) & 0xFFFF)) << 16) | ((uint32_t)le16(((i) & 0xFFFF0000) >> 16))) +#define le64(i) ((((uint64_t)le32((i) & 0xFFFFFFFFLL)) << 32) | ((uint64_t)le32(((i) & 0xFFFFFFFF00000000LL) >> 32))) -#define le16(i) ((((u16) ((i) & 0xFF)) << 8) | ((u16) (((i) & 0xFF00) >> 8))) -#define le32(i) ((((u32)le16((i) & 0xFFFF)) << 16) | ((u32)le16(((i) & 0xFFFF0000) >> 16))) -#define le64(i) ((((u64)le32((i) & 0xFFFFFFFFLL)) << 32) | ((u64)le32(((i) & 0xFFFFFFFF00000000LL) >> 32))) - -void SC0x25_KernelCopyData(unsigned int addr, unsigned int src, unsigned int len); +//Needs to have log_init() called beforehand. +void dumpHex(const void* data, size_t size); #ifdef __cplusplus } diff --git a/src/utils/utils_asm.S b/src/utils/utils_asm.S deleted file mode 100644 index c92f838..0000000 --- a/src/utils/utils_asm.S +++ /dev/null @@ -1,5 +0,0 @@ - .globl SC0x25_KernelCopyData -SC0x25_KernelCopyData: - li r0, 0x2500 - sc - blr diff --git a/src/video/CVideo.cpp b/src/video/CVideo.cpp deleted file mode 100644 index adef8a1..0000000 --- a/src/video/CVideo.cpp +++ /dev/null @@ -1,264 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#include -#include -#include "CVideo.h" -#include "system/memory.h" -#include "shaders/Texture2DShader.h" -#include "shaders/ColorShader.h" -#include "shaders/Shader3D.h" -#include "shaders/FXAAShader.h" - -CVideo::CVideo(s32 forceTvScanMode, s32 forceDrcScanMode) -{ - tvEnabled = false; - drcEnabled = false; - - //! allocate MEM2 command buffer memory - gx2CommandBuffer = MEM2_alloc(GX2_COMMAND_BUFFER_SIZE, 0x40); - - //! initialize GX2 command buffer - u32 gx2_init_attributes[9]; - gx2_init_attributes[0] = GX2_INIT_CMD_BUF_BASE; - gx2_init_attributes[1] = (u32)gx2CommandBuffer; - gx2_init_attributes[2] = GX2_INIT_CMD_BUF_POOL_SIZE; - gx2_init_attributes[3] = GX2_COMMAND_BUFFER_SIZE; - gx2_init_attributes[4] = GX2_INIT_ARGC; - gx2_init_attributes[5] = 0; - gx2_init_attributes[6] = GX2_INIT_ARGV; - gx2_init_attributes[7] = 0; - gx2_init_attributes[8] = GX2_INIT_END; - GX2Init(gx2_init_attributes); - - u32 scanBufferSize = 0; - u32 scaleNeeded = 0; - - s32 tvScanMode = ((forceTvScanMode >= 0) ? forceTvScanMode : (s32)GX2GetSystemTVScanMode()); - s32 drcScanMode = ((forceDrcScanMode >= 0) ? forceDrcScanMode : (s32)GX2GetSystemDRCScanMode()); - - s32 tvRenderMode; - u32 tvWidth = 0; - u32 tvHeight = 0; - - switch(tvScanMode) - { - case GX2_TV_SCAN_MODE_480I: - case GX2_TV_SCAN_MODE_480P: - tvWidth = 854; - tvHeight = 480; - tvRenderMode = GX2_TV_RENDER_MODE_WIDE_480P; - break; - case GX2_TV_SCAN_MODE_1080I: - case GX2_TV_SCAN_MODE_1080P: - tvWidth = 1920; - tvHeight = 1080; - tvRenderMode = GX2_TV_RENDER_MODE_WIDE_1080P; - break; - case GX2_TV_SCAN_MODE_720P: - default: - tvWidth = 1280; - tvHeight = 720; - tvRenderMode = GX2_TV_RENDER_MODE_WIDE_720P; - break; - } - - s32 tvAAMode = GX2_AA_MODE1X; - s32 drcAAMode = GX2_AA_MODE4X; - - //! calculate the scale factor for later texture resize - widthScaleFactor = 1.0f / (f32)tvWidth; - heightScaleFactor = 1.0f / (f32)tvHeight; - depthScaleFactor = widthScaleFactor; - - //! calculate the size needed for the TV scan buffer and allocate the buffer from bucket memory - GX2CalcTVSize((GX2TVRenderMode)tvRenderMode, GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8, GX2_BUFFERING_MODE_DOUBLE, &scanBufferSize, &scaleNeeded); - tvScanBuffer = MEMBucket_alloc(scanBufferSize, GX2_SCAN_BUFFER_ALIGNMENT); - GX2Invalidate(GX2_INVALIDATE_MODE_CPU, tvScanBuffer, scanBufferSize); - GX2SetTVBuffer(tvScanBuffer, scanBufferSize, (GX2TVRenderMode)tvRenderMode, GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8, GX2_BUFFERING_MODE_DOUBLE); - - //! calculate the size needed for the DRC scan buffer and allocate the buffer from bucket memory - GX2CalcDRCSize((GX2DrcRenderMode)drcScanMode, GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8, GX2_BUFFERING_MODE_DOUBLE, &scanBufferSize, &scaleNeeded); - drcScanBuffer = MEMBucket_alloc(scanBufferSize, GX2_SCAN_BUFFER_ALIGNMENT); - GX2Invalidate(GX2_INVALIDATE_MODE_CPU, drcScanBuffer, scanBufferSize); - GX2SetDRCBuffer(drcScanBuffer, scanBufferSize, (GX2DrcRenderMode)drcScanMode, GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8, GX2_BUFFERING_MODE_DOUBLE); - - //! Setup color buffer for TV rendering - GX2InitColorBuffer(&tvColorBuffer, GX2_SURFACE_DIM_TEXTURE_2D, tvWidth, tvHeight, 1, GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8, (GX2AAMode)tvAAMode); - tvColorBuffer.surface.image = MEM1_alloc(tvColorBuffer.surface.imageSize, tvColorBuffer.surface.alignment); - GX2Invalidate(GX2_INVALIDATE_MODE_CPU, tvColorBuffer.surface.image, tvColorBuffer.surface.imageSize); - - //! due to AA we can only use 16 bit depth buffer in MEM1 otherwise we would have to switch to mem2 for depth buffer - //! this should be ok for our purpose i guess - - //! Setup TV depth buffer (can be the same for both if rendered one after another) - u32 size, align; - GX2InitDepthBuffer(&tvDepthBuffer, GX2_SURFACE_DIM_TEXTURE_2D, tvColorBuffer.surface.width, tvColorBuffer.surface.height, 1, GX2_SURFACE_FORMAT_FLOAT_R32, (GX2AAMode)tvAAMode); - tvDepthBuffer.surface.image = MEM1_alloc(tvDepthBuffer.surface.imageSize, tvDepthBuffer.surface.alignment); - GX2Invalidate(GX2_INVALIDATE_MODE_CPU, tvDepthBuffer.surface.image, tvDepthBuffer.surface.imageSize); - - //! Setup TV HiZ buffer - GX2CalcDepthBufferHiZInfo(&tvDepthBuffer, &size, &align); - tvDepthBuffer.hiZPtr = MEM1_alloc(size, align); - GX2Invalidate(GX2_INVALIDATE_MODE_CPU, tvDepthBuffer.hiZPtr, size); - GX2InitDepthBufferHiZEnable(&tvDepthBuffer, GX2_ENABLE); - - //! Setup color buffer for DRC rendering - GX2InitColorBuffer(&drcColorBuffer, GX2_SURFACE_DIM_TEXTURE_2D, 854, 480, 1, GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8, (GX2AAMode)drcAAMode); - drcColorBuffer.surface.image = MEM1_alloc(drcColorBuffer.surface.imageSize, drcColorBuffer.surface.alignment); - GX2Invalidate(GX2_INVALIDATE_MODE_CPU, drcColorBuffer.surface.image, drcColorBuffer.surface.imageSize); - - //! Setup DRC depth buffer (can be the same for both if rendered one after another) - GX2InitDepthBuffer(&drcDepthBuffer, GX2_SURFACE_DIM_TEXTURE_2D, drcColorBuffer.surface.width, drcColorBuffer.surface.height, 1, GX2_SURFACE_FORMAT_FLOAT_R32, (GX2AAMode)drcAAMode); - drcDepthBuffer.surface.image = MEM1_alloc(drcDepthBuffer.surface.imageSize, drcDepthBuffer.surface.alignment); - GX2Invalidate(GX2_INVALIDATE_MODE_CPU, drcDepthBuffer.surface.image, drcDepthBuffer.surface.imageSize); - - //! Setup DRC HiZ buffer - GX2CalcDepthBufferHiZInfo(&drcDepthBuffer, &size, &align); - drcDepthBuffer.hiZPtr = MEM1_alloc(size, align); - GX2Invalidate(GX2_INVALIDATE_MODE_CPU, drcDepthBuffer.hiZPtr, size); - GX2InitDepthBufferHiZEnable(&drcDepthBuffer, GX2_ENABLE); - - - //! allocate auxilary buffer last as there might not be enough MEM1 left for other stuff after that - if (tvColorBuffer.surface.aa) - { - u32 auxSize, auxAlign; - GX2CalcColorBufferAuxInfo(&tvColorBuffer, &auxSize, &auxAlign); - tvColorBuffer.aaBuffer = MEM1_alloc(auxSize, auxAlign); - if(!tvColorBuffer.aaBuffer) - tvColorBuffer.aaBuffer = MEM2_alloc(auxSize, auxAlign); - - tvColorBuffer.aaSize = auxSize; - memset(tvColorBuffer.aaBuffer, GX2_AA_BUFFER_CLEAR_VALUE, auxSize); - GX2Invalidate(GX2_INVALIDATE_MODE_CPU, tvColorBuffer.aaBuffer, auxSize); - } - - if (drcColorBuffer.surface.aa) - { - u32 auxSize, auxAlign; - GX2CalcColorBufferAuxInfo(&drcColorBuffer, &auxSize, &auxAlign); - drcColorBuffer.aaBuffer = MEM1_alloc(auxSize, auxAlign); - if(!drcColorBuffer.aaBuffer) - drcColorBuffer.aaBuffer = MEM2_alloc(auxSize, auxAlign); - drcColorBuffer.aaSize = auxSize; - memset(drcColorBuffer.aaBuffer, GX2_AA_BUFFER_CLEAR_VALUE, auxSize); - GX2Invalidate(GX2_INVALIDATE_MODE_CPU, drcColorBuffer.aaBuffer, auxSize); - } - - //! allocate memory and setup context state TV - tvContextState = (GX2ContextState*)MEM2_alloc(sizeof(GX2ContextState), GX2_CONTEXT_STATE_ALIGNMENT); - GX2SetupContextStateEx(tvContextState, GX2_TRUE); - - //! allocate memory and setup context state DRC - drcContextState = (GX2ContextState*)MEM2_alloc(sizeof(GX2ContextState), GX2_CONTEXT_STATE_ALIGNMENT); - GX2SetupContextStateEx(drcContextState, GX2_TRUE); - - //! set initial context state and render buffers - GX2SetContextState(tvContextState); - GX2SetColorBuffer(&tvColorBuffer, GX2_RENDER_TARGET_0); - GX2SetDepthBuffer(&tvDepthBuffer); - - GX2SetContextState(drcContextState); - GX2SetColorBuffer(&drcColorBuffer, GX2_RENDER_TARGET_0); - GX2SetDepthBuffer(&drcDepthBuffer); - - //! set initial viewport - GX2SetViewport(0.0f, 0.0f, tvColorBuffer.surface.width, tvColorBuffer.surface.height, 0.0f, 1.0f); - GX2SetScissor(0, 0, tvColorBuffer.surface.width, tvColorBuffer.surface.height); - - //! this is not necessary but can be used for swap counting and vsyncs - GX2SetSwapInterval(1); - - //GX2SetTVGamma(0.8f); - //GX2SetDRCGamma(0.8f); - - //! initialize perspective matrix - const float cam_X_rot = 25.0f; - - projectionMtx = glm::perspective(45.0f, 1.0f, 0.1f, 100.0f); - - viewMtx = glm::mat4(1.0f); - viewMtx = glm::translate(viewMtx, glm::vec3(0.0f, 0.0f, -2.5f)); - viewMtx = glm::rotate(viewMtx, DegToRad(cam_X_rot), glm::vec3(1.0f, 0.0f, 0.0f)); - - GX2InitSampler(&aaSampler, GX2_TEX_CLAMP_MODE_CLAMP, GX2_TEX_XY_FILTER_MODE_LINEAR); - GX2InitTexture(&tvAaTexture, tvColorBuffer.surface.width, tvColorBuffer.surface.height, 1, 0, GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8, GX2_SURFACE_DIM_TEXTURE_2D, GX2_TILE_MODE_DEFAULT); - tvAaTexture.surface.image = tvColorBuffer.surface.image; - tvAaTexture.surface.imageSize = tvColorBuffer.surface.imageSize; - tvAaTexture.surface.mipmaps = tvColorBuffer.surface.mipmaps; -} - -CVideo::~CVideo() -{ - //! flush buffers - GX2Flush(); - GX2DrawDone(); - //! shutdown - GX2Shutdown(); - //! free command buffer memory - MEM2_free(gx2CommandBuffer); - //! free scan buffers - MEMBucket_free(tvScanBuffer); - MEMBucket_free(drcScanBuffer); - //! free color buffers - MEM1_free(tvColorBuffer.surface.image); - MEM1_free(drcColorBuffer.surface.image); - //! free depth buffers - MEM1_free(tvDepthBuffer.surface.image); - MEM1_free(tvDepthBuffer.hiZPtr); - MEM1_free(drcDepthBuffer.surface.image); - MEM1_free(drcDepthBuffer.hiZPtr); - //! free context buffers - MEM2_free(tvContextState); - MEM2_free(drcContextState); - //! free aux buffer - if(tvColorBuffer.aaBuffer) - { - if(((u32)tvColorBuffer.aaBuffer & 0xF0000000) == 0xF0000000) - MEM1_free(tvColorBuffer.aaBuffer); - else - MEM2_free(tvColorBuffer.aaBuffer); - } - if(drcColorBuffer.aaBuffer) - { - if(((u32)drcColorBuffer.aaBuffer & 0xF0000000) == 0xF0000000) - MEM1_free(drcColorBuffer.aaBuffer); - else - MEM2_free(drcColorBuffer.aaBuffer); - } - //! destroy shaders - ColorShader::destroyInstance(); - FXAAShader::destroyInstance(); - Shader3D::destroyInstance(); - Texture2DShader::destroyInstance(); -} - -void CVideo::renderFXAA(const GX2Texture * texture, const GX2Sampler *sampler) -{ - resolution[0] = texture->surface.width; - resolution[1] = texture->surface.height; - - GX2Invalidate((GX2InvalidateMode)(GX2_INVALIDATE_MODE_COLOR_BUFFER | GX2_INVALIDATE_MODE_TEXTURE), texture->surface.image, texture->surface.imageSize); - - GX2SetDepthOnlyControl(GX2_ENABLE, GX2_ENABLE, GX2_COMPARE_FUNC_ALWAYS); - FXAAShader::instance()->setShaders(); - FXAAShader::instance()->setAttributeBuffer(); - FXAAShader::instance()->setResolution(resolution); - FXAAShader::instance()->setTextureAndSampler(texture, sampler); - FXAAShader::instance()->draw(); - GX2SetDepthOnlyControl(GX2_ENABLE, GX2_ENABLE, GX2_COMPARE_FUNC_LEQUAL); -} diff --git a/src/video/CVideo.h b/src/video/CVideo.h deleted file mode 100644 index 2539c21..0000000 --- a/src/video/CVideo.h +++ /dev/null @@ -1,206 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#ifndef __CVIDEO_H_ -#define __CVIDEO_H_ - -#include -#include -#include -#include -#include -#include -#include - -#include "shaders/Shader.h" - -class CVideo -{ -public: - CVideo(s32 forceTvScanMode = -1, s32 forceDrcScanMode = -1); - virtual ~CVideo(); - - void prepareTvRendering(void) { - currContextState = tvContextState; - currColorBuffer = &tvColorBuffer; - currDepthBuffer = &tvDepthBuffer; - prepareRendering(); - } - - void prepareDrcRendering(void) { - currContextState = drcContextState; - currColorBuffer = &drcColorBuffer; - currDepthBuffer = &drcDepthBuffer; - prepareRendering(); - } - - void prepareRendering(void) { - GX2ClearColor(currColorBuffer, 0.0f, 0.0f, 0.0f, 1.0f); - GX2ClearDepthStencilEx(currDepthBuffer, currDepthBuffer->depthClear, currDepthBuffer->stencilClear, GX2_CLEAR_FLAGS_BOTH); - - GX2SetContextState(currContextState); - GX2SetViewport(0.0f, 0.0f, currColorBuffer->surface.width, currColorBuffer->surface.height, 0.0f, 1.0f); - GX2SetScissor(0, 0, currColorBuffer->surface.width, currColorBuffer->surface.height); - - GX2SetDepthOnlyControl(GX2_ENABLE, GX2_ENABLE, GX2_COMPARE_FUNC_LEQUAL); - GX2SetColorControl(GX2_LOGIC_OP_COPY, 1, GX2_DISABLE, GX2_ENABLE); - GX2SetBlendControl(GX2_RENDER_TARGET_0, GX2_BLEND_MODE_SRC_ALPHA, GX2_BLEND_MODE_INV_SRC_ALPHA, GX2_BLEND_COMBINE_MODE_ADD, GX2_ENABLE, GX2_BLEND_MODE_SRC_ALPHA, GX2_BLEND_MODE_INV_SRC_ALPHA, GX2_BLEND_COMBINE_MODE_ADD); - GX2SetCullOnlyControl(GX2_FRONT_FACE_CCW, GX2_DISABLE, GX2_ENABLE); - } - - void setStencilRender(bool bEnable) - { - if(bEnable) - { - GX2SetStencilMask(0xff, 0xff, 0x01, 0xff, 0xff, 0x01); - GX2SetDepthStencilControl(GX2_DISABLE, GX2_DISABLE, GX2_COMPARE_FUNC_LEQUAL, GX2_ENABLE, GX2_ENABLE, GX2_COMPARE_FUNC_ALWAYS, GX2_STENCIL_FUNCTION_KEEP, GX2_STENCIL_FUNCTION_KEEP, GX2_STENCIL_FUNCTION_REPLACE, - GX2_COMPARE_FUNC_ALWAYS, GX2_STENCIL_FUNCTION_KEEP, GX2_STENCIL_FUNCTION_KEEP, GX2_STENCIL_FUNCTION_REPLACE); - } - else - { - GX2SetStencilMask(0xff, 0xff, 0xff, 0xff, 0xff, 0xff); - GX2SetDepthStencilControl(GX2_ENABLE, GX2_ENABLE, GX2_COMPARE_FUNC_LEQUAL, GX2_DISABLE, GX2_DISABLE, GX2_COMPARE_FUNC_NEVER, GX2_STENCIL_FUNCTION_KEEP, GX2_STENCIL_FUNCTION_KEEP, GX2_STENCIL_FUNCTION_KEEP, - GX2_COMPARE_FUNC_NEVER, GX2_STENCIL_FUNCTION_KEEP, GX2_STENCIL_FUNCTION_KEEP, GX2_STENCIL_FUNCTION_KEEP); - } - } - - void drcDrawDone(void) { - //! on DRC we do a hardware AA because FXAA does not look good - //renderFXAA(&drcAaTexture, &aaSampler); - GX2CopyColorBufferToScanBuffer(&drcColorBuffer, GX2_SCAN_TARGET_DRC); - } - - void tvDrawDone(void) { - renderFXAA(&tvAaTexture, &aaSampler); - GX2CopyColorBufferToScanBuffer(&tvColorBuffer, GX2_SCAN_TARGET_TV); - GX2SwapScanBuffers(); - GX2Flush(); - } - - void waitForVSync(void) { - GX2WaitForVsync(); - frameCount++; - } - - void tvEnable(bool bEnable) { - if(tvEnabled != bEnable) - { - GX2SetTVEnable(bEnable ? GX2_ENABLE : GX2_DISABLE); - tvEnabled = bEnable; - } - } - void drcEnable(bool bEnable) { - if(drcEnabled != bEnable) - { - GX2SetDRCEnable(bEnable ? GX2_ENABLE : GX2_DISABLE); - drcEnabled = bEnable; - } - } - - u32 getFrameCount(void) const { - return frameCount; - } - - u32 getTvWidth(void) const { - return tvColorBuffer.surface.width; - } - u32 getTvHeight(void) const { - return tvColorBuffer.surface.height; - } - - u32 getDrcWidth(void) const { - return drcColorBuffer.surface.width; - } - u32 getDrcHeight(void) const { - return drcColorBuffer.surface.height; - } - - const glm::mat4 & getProjectionMtx(void) const { - return projectionMtx; - } - const glm::mat4 & getViewMtx(void) const { - return viewMtx; - } - - f32 getWidthScaleFactor(void) const { - return widthScaleFactor; - } - f32 getHeightScaleFactor(void) const { - return heightScaleFactor; - } - f32 getDepthScaleFactor(void) const { - return depthScaleFactor; - } - - void screenPosToWorldRay(f32 posX, f32 posY, glm::vec3 & rayOrigin, glm::vec3 & rayDirection) - { - //! normalize positions - posX = 2.0f * posX * getWidthScaleFactor(); - posY = 2.0f * posY * getHeightScaleFactor(); - - glm::vec4 rayStart(posX, posY, 0.0f, 1.0f); - glm::vec4 rayEnd(posX, posY, 1.0f, 1.0f); - - glm::mat4 IMV = glm::inverse(projectionMtx * viewMtx); - glm::vec4 rayStartWorld = IMV * rayStart; - rayStartWorld /= rayStartWorld.w; - - glm::vec4 rayEndWorld = IMV * rayEnd; - rayEndWorld /= rayEndWorld.w; - - glm::vec3 rayDirectionWorld(rayEndWorld - rayStartWorld); - rayDirectionWorld = glm::normalize(rayDirectionWorld); - - rayOrigin = glm::vec3(rayStartWorld); - rayDirection = glm::normalize(rayDirectionWorld); - } -private: - void renderFXAA(const GX2Texture * texture, const GX2Sampler *sampler); - - void *gx2CommandBuffer; - - void *tvScanBuffer; - void *drcScanBuffer; - - u32 frameCount; - f32 widthScaleFactor; - f32 heightScaleFactor; - f32 depthScaleFactor; - - bool tvEnabled; - bool drcEnabled; - - GX2ColorBuffer tvColorBuffer; - GX2DepthBuffer tvDepthBuffer; - GX2ColorBuffer drcColorBuffer; - GX2DepthBuffer drcDepthBuffer; - - GX2ContextState *tvContextState; - GX2ContextState *drcContextState; - - GX2ContextState *currContextState; - GX2ColorBuffer *currColorBuffer; - GX2DepthBuffer *currDepthBuffer; - - GX2Texture tvAaTexture; - GX2Sampler aaSampler; - - glm::mat4 projectionMtx; - glm::mat4 viewMtx; - glm::vec2 resolution; -}; - -#endif // __GX2_VIDEO_H_ diff --git a/src/video/shaders/ColorShader.cpp b/src/video/shaders/ColorShader.cpp deleted file mode 100644 index bc4a050..0000000 --- a/src/video/shaders/ColorShader.cpp +++ /dev/null @@ -1,167 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#include -#include -#include "ColorShader.h" - -static const u32 cpVertexShaderProgram[] = -{ - 0x00000000,0x00008009,0x20000000,0x000078a0, - 0x3c200000,0x88060094,0x00c00000,0x88062014, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00a11f00,0xfc00620f,0x02490001,0x80000040, - 0xfd041f80,0x900c0060,0x83f9223e,0x0000803f, - 0xfe282001,0x10000040,0xfe001f80,0x00080060, - 0xfeac9f80,0xfd00624f,0xdb0f49c0,0xdb0fc940, - 0xfea81f80,0x9000e02f,0x83f9223e,0x00000000, - 0xfe041f80,0x00370000,0xffa01f00,0x80000000, - 0xff101f00,0x800c0020,0x7f041f80,0x80370000, - 0x0000103f,0x00000000,0x02c51f00,0x80000000, - 0xfea41f00,0x80000020,0xffa09f00,0x80000040, - 0xff001f80,0x800c0060,0x398ee33f,0x0000103f, - 0x02c41f00,0x9000e00f,0x02c59f01,0x80000020, - 0xfea81f00,0x80000040,0x02c19f80,0x9000e06f, - 0x398ee33f,0x00000000,0x02c11f01,0x80000000, - 0x02c49f80,0x80000060,0x02e08f01,0xfe0c620f, - 0x02c01f80,0x7f00622f,0xfe242000,0x10000000, - 0xfe20a080,0x10000020,0xf2178647,0x49c0e9fb, - 0xfbbdb2ab,0x768ac733 -}; - -static const u32 cpVertexShaderRegs[] = { - 0x00000103,0x00000000,0x00000000,0x00000001, - 0xffffff00,0xffffffff,0xffffffff,0xffffffff, - 0xffffffff,0xffffffff,0xffffffff,0xffffffff, - 0xffffffff,0xffffffff,0x00000000,0xfffffffc, - 0x00000002,0x00000001,0x00000000,0x000000ff, - 0x000000ff,0x000000ff,0x000000ff,0x000000ff, - 0x000000ff,0x000000ff,0x000000ff,0x000000ff, - 0x000000ff,0x000000ff,0x000000ff,0x000000ff, - 0x000000ff,0x000000ff,0x000000ff,0x000000ff, - 0x000000ff,0x000000ff,0x000000ff,0x000000ff, - 0x000000ff,0x000000ff,0x000000ff,0x000000ff, - 0x000000ff,0x000000ff,0x000000ff,0x000000ff, - 0x000000ff,0x00000000,0x0000000e,0x00000010 -}; - -static const u32 cpPixelShaderProgram[] = -{ - 0x20000000,0x00000ca0,0x00000000,0x88062094, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00002000,0x90000000,0x0004a000,0x90000020, - 0x00082001,0x90000040,0x000ca081,0x90000060, - 0xbb7dd898,0x9746c59c,0xc69b00e7,0x03c36218 -}; -static const u32 cpPixelShaderRegs[] = { - 0x00000001,0x00000002,0x14000001,0x00000000, - 0x00000001,0x00000100,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x0000000f,0x00000001,0x00000010, - 0x00000000 -}; - -ColorShader * ColorShader::shaderInstance = NULL; - -ColorShader::ColorShader() - : vertexShader(cuAttributeCount) -{ - //! create pixel shader - pixelShader.setProgram(cpPixelShaderProgram, sizeof(cpPixelShaderProgram), cpPixelShaderRegs, sizeof(cpPixelShaderRegs)); - - colorIntensityLocation = 0; - pixelShader.addUniformVar((GX2UniformVar){ "unf_color_intensity", GX2_SHADER_VAR_TYPE_FLOAT4, 1, colorIntensityLocation, -1 }); - - //! create vertex shader - vertexShader.setProgram(cpVertexShaderProgram, sizeof(cpVertexShaderProgram), cpVertexShaderRegs, sizeof(cpVertexShaderRegs)); - - angleLocation = 0; - offsetLocation = 4; - scaleLocation = 8; - vertexShader.addUniformVar((GX2UniformVar){ "unf_angle", GX2_SHADER_VAR_TYPE_FLOAT, 1, angleLocation, -1 }); - vertexShader.addUniformVar((GX2UniformVar){ "unf_offset", GX2_SHADER_VAR_TYPE_FLOAT3, 1, offsetLocation, -1 }); - vertexShader.addUniformVar((GX2UniformVar){ "unf_scale", GX2_SHADER_VAR_TYPE_FLOAT3, 1, scaleLocation, -1 }); - - colorLocation = 1; - positionLocation = 0; - vertexShader.addAttribVar((GX2AttribVar){ "attr_color", GX2_SHADER_VAR_TYPE_FLOAT4, 0, colorLocation }); - vertexShader.addAttribVar((GX2AttribVar){ "attr_position", GX2_SHADER_VAR_TYPE_FLOAT3, 0, positionLocation }); - - //! setup attribute streams - GX2InitAttribStream(vertexShader.getAttributeBuffer(0), positionLocation, 0, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32_32); - GX2InitAttribStream(vertexShader.getAttributeBuffer(1), colorLocation, 1, 0, GX2_ATTRIB_FORMAT_UNORM_8_8_8_8); - - //! create fetch shader - fetchShader = new FetchShader(vertexShader.getAttributeBuffer(), vertexShader.getAttributesCount()); - - //! model vertex has to be align and cannot be in unknown regions for GX2 like 0xBCAE1000 - positionVtxs = (f32*)memalign(GX2_VERTEX_BUFFER_ALIGNMENT, cuPositionVtxsSize); - if(positionVtxs) - { - //! position vertex structure - int i = 0; - positionVtxs[i++] = -1.0f; positionVtxs[i++] = -1.0f; positionVtxs[i++] = 0.0f; - positionVtxs[i++] = 1.0f; positionVtxs[i++] = -1.0f; positionVtxs[i++] = 0.0f; - positionVtxs[i++] = 1.0f; positionVtxs[i++] = 1.0f; positionVtxs[i++] = 0.0f; - positionVtxs[i++] = -1.0f; positionVtxs[i++] = 1.0f; positionVtxs[i++] = 0.0f; - GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, positionVtxs, cuPositionVtxsSize); - } -} - -ColorShader::~ColorShader() -{ - if(positionVtxs) - { - free(positionVtxs); - positionVtxs = NULL; - } - - delete fetchShader; - fetchShader = NULL; -} diff --git a/src/video/shaders/ColorShader.h b/src/video/shaders/ColorShader.h deleted file mode 100644 index 35c13b6..0000000 --- a/src/video/shaders/ColorShader.h +++ /dev/null @@ -1,100 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#ifndef __COLOR_SHADER_H_ -#define __COLOR_SHADER_H_ - -#include "VertexShader.h" -#include "PixelShader.h" -#include "FetchShader.h" - -class ColorShader : public Shader -{ -private: - ColorShader(); - virtual ~ColorShader(); - - static const u32 cuAttributeCount = 2; - static const u32 cuPositionVtxsSize = 4 * cuVertexAttrSize; - - static ColorShader *shaderInstance; - - FetchShader *fetchShader; - VertexShader vertexShader; - PixelShader pixelShader; - - f32 *positionVtxs; - - u32 angleLocation; - u32 offsetLocation; - u32 scaleLocation; - u32 colorLocation; - u32 colorIntensityLocation; - u32 positionLocation; -public: - static const u32 cuColorVtxsSize = 4 * cuColorAttrSize; - - static ColorShader *instance() { - if(!shaderInstance) { - shaderInstance = new ColorShader(); - } - return shaderInstance; - } - static void destroyInstance() { - if(shaderInstance) { - delete shaderInstance; - shaderInstance = NULL; - } - } - - void setShaders(void) const - { - fetchShader->setShader(); - vertexShader.setShader(); - pixelShader.setShader(); - } - - void setAttributeBuffer(const u8 * colorAttr, const f32 * posVtxs_in = NULL, const u32 & vtxCount = 0) const - { - if(posVtxs_in && vtxCount) { - VertexShader::setAttributeBuffer(0, vtxCount * cuVertexAttrSize, cuVertexAttrSize, posVtxs_in); - VertexShader::setAttributeBuffer(1, vtxCount * cuColorAttrSize, cuColorAttrSize, colorAttr); - } - else { - VertexShader::setAttributeBuffer(0, cuPositionVtxsSize, cuVertexAttrSize, positionVtxs); - VertexShader::setAttributeBuffer(1, cuColorVtxsSize, cuColorAttrSize, colorAttr); - } - } - - void setAngle(const float & val) - { - VertexShader::setUniformReg(angleLocation, 4, &val); - } - void setOffset(const glm::vec3 & vec) - { - VertexShader::setUniformReg(offsetLocation, 4, &vec[0]); - } - void setScale(const glm::vec3 & vec) - { - VertexShader::setUniformReg(scaleLocation, 4, &vec[0]); - } - void setColorIntensity(const glm::vec4 & vec) - { - PixelShader::setUniformReg(colorIntensityLocation, 4, &vec[0]); - } -}; - -#endif // __COLOR_SHADER_H_ diff --git a/src/video/shaders/FXAAShader.cpp b/src/video/shaders/FXAAShader.cpp deleted file mode 100644 index 3b46733..0000000 --- a/src/video/shaders/FXAAShader.cpp +++ /dev/null @@ -1,230 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#include -#include -#include "FXAAShader.h" - -static const u32 cpVertexShaderProgram[] = -{ - 0x00000000,0x00008009,0x20000000,0x000004a0, - 0x3ca00000,0x88060094,0x00400000,0xff0f2094, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0xfd001f80,0x900c2060,0x0000803f,0x00000000, - 0xc1a229f5,0xd0eddc33,0x426618fd,0x8509cfe7 -}; - -static const u32 cpVertexShaderRegs[] = { - 0x00000102,0x00000000,0x00000000,0x00000001, - 0xffffffff,0xffffffff,0xffffffff,0xffffffff, - 0xffffffff,0xffffffff,0xffffffff,0xffffffff, - 0xffffffff,0xffffffff,0x00000000,0xfffffffe, - 0x00000001,0x00000000,0x000000ff,0x000000ff, - 0x000000ff,0x000000ff,0x000000ff,0x000000ff, - 0x000000ff,0x000000ff,0x000000ff,0x000000ff, - 0x000000ff,0x000000ff,0x000000ff,0x000000ff, - 0x000000ff,0x000000ff,0x000000ff,0x000000ff, - 0x000000ff,0x000000ff,0x000000ff,0x000000ff, - 0x000000ff,0x000000ff,0x000000ff,0x000000ff, - 0x000000ff,0x000000ff,0x000000ff,0x000000ff, - 0x000000ff,0x00000000,0x0000000e,0x00000010 -}; - -static const u32 cpPixelShaderProgram[] = -{ - 0x20000000,0x00003ca0,0xa0000000,0x000c8080, - 0x30000000,0x000010a1,0xa8000000,0x0010c080, - 0x75000000,0x000088a0,0x00800100,0x88062094, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00241f02,0x1000e00f,0x00241f00,0x1000e02f, - 0x00201f02,0x00000040,0x00201f00,0x00000060, - 0x00011f80,0x10332060,0xff000000,0xff102200, - 0xfd001f00,0x900cc020,0xffc09f01,0x90004040, - 0xffc01f01,0x90000060,0x00051f80,0x1033a040, - 0x0000803f,0x00000000,0xffe00f00,0x90004000, - 0xff008000,0xff102220,0xffe08f00,0x90000440, - 0x010c0000,0x010c4660,0xff008080,0xff004220, - 0x01a01f00,0x00280000,0x01a49f00,0x00280020, - 0x01a81f01,0x00280040,0xfd0c1f00,0x1028e06f, - 0x00208081,0x90002000,0x8716993e,0xa245163f, - 0xd578e93d,0x00000080,0x03a01f00,0x00280000, - 0x03a49f00,0x00280020,0x03a81f01,0x1028e04f, - 0xfd0c1f00,0x00280060,0x00a40081,0x90002020, - 0x8716993e,0xa245163f,0xd578e93d,0x00000080, - 0x04a01f00,0x00280000,0x04a49f00,0x1028a02f, - 0x04a81f01,0x00280040,0xfd0c1f00,0x00280060, - 0x7fcc1f80,0x1000c02f,0x8716993e,0xa245163f, - 0xd578e93d,0x00000080,0x02a01f00,0x1028e00f, - 0x02a49f00,0x00280020,0x02a81f01,0x00280040, - 0xfd0c1f00,0x00280060,0x7fcc1f80,0x1000e02f, - 0x8716993e,0xa245163f,0xd578e93d,0x00000080, - 0x7dc41f00,0x00020000,0x7fec0f01,0x00020020, - 0x7fc81f00,0x00000040,0x7dc41f00,0x00000060, - 0x7fec0f81,0x9001802f,0xfef88f00,0x1000e00f, - 0xfedc8f00,0x00000420,0x7de40f00,0x80010040, - 0x7ec49f01,0x00001060,0xfec41f80,0x10024060, - 0xfed49f00,0x80020000,0xfe141f00,0x900c802f, - 0xfeac1f00,0x80000040,0xfec01f02,0x80020060, - 0x7cc41f81,0x90010060,0x0000003d,0x00000000, - 0xfd001f00,0x900c6000,0xfea89f00,0x80010020, - 0xfec09f81,0x00020040,0x0000803f,0x0000003e, - 0xfec41f81,0x00000020,0xfe041f80,0x00330000, - 0x7fe01f00,0x80000040,0x7ce41f80,0x80000060, - 0xfea81f00,0x80010000,0xfeac1f80,0x80010020, - 0x000000c1,0x00000000,0xfea01f00,0x00020040, - 0xfea41f80,0x00020060,0x00000041,0x00000000, - 0x05c81f01,0x9000e00f,0x01cc9f81,0x9000e06f, - 0xfeac1f00,0x01004200,0xfea01f00,0x01044220, - 0xfeac9f00,0x01002240,0xfea09f00,0x01042260, - 0xfe8c1f80,0x01008600,0xacaa2a3e,0xaaaa2abe, - 0x7f9c1f00,0x0100a200,0x7f801f00,0x01048220, - 0x7f901f80,0x0104a240,0x02080001,0x7000a00f, - 0x02000000,0x7000c04f,0x02048000,0x7000e06f, - 0x01a81f80,0x9000e00f,0xd578e93d,0x00000000, - 0x04a80001,0x1000c00f,0x04a48000,0x00000020, - 0x04a00000,0x00000040,0xfe081f00,0xe00c0060, - 0xfe0c1f80,0xe00c0000,0x01a41f00,0x7f00620f, - 0xfea89f00,0xfe0c822f,0xfea49f00,0xff00a24f, - 0x7d001f80,0xe00c0060,0xa245163f,0x0000803e, - 0x7ea01f00,0xfe0ce20f,0x01a09f80,0xfe006a4f, - 0x0000803e,0x8716993e,0xfe088001,0x9001c00f, - 0xfe488001,0x1002e44f,0xfea01f80,0x80000000, - 0xd578e93d,0x00000000,0x7ca41f00,0x00280000, - 0x7da89f00,0x00280020,0xff201f00,0x00280040, - 0xfd081f80,0x00280060,0x8716993e,0xa245163f, - 0x00000080,0x00000000,0x7fc81f00,0x80060000, - 0xfec00f80,0x80060060,0xfec09f81,0xfb80634f, - 0xfe888f00,0x7e886300,0xfea80f01,0x7f8c6320, - 0xfee80f00,0x7d806340,0xfe680080,0x06846f60, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x10000100,0x01101df0,0x00008010,0xecdfea0d, - 0x10000200,0x03101df0,0x00002050,0xecdfea0d, - 0x10000000,0x04101df0,0x00003071,0xecdfea0d, - 0x10000200,0x02101df0,0x0000b070,0xecdfea0d, - 0x10000200,0x02101df0,0x00008010,0xecdfea0d, - 0x10000100,0x00101df0,0x0000a051,0xecdfea0d, - 0x10000400,0x04101df0,0x00008010,0xecdfea0d, - 0x10000500,0x05101df0,0x00000011,0xecdfea0d, - 0x10000100,0x01101df0,0x00008010,0xecdfea0d, - 0xfe2e963a,0x0269a9a3,0x38f88096,0x400cf48b -}; -static const u32 cpPixelShaderRegs[] = { - 0x00000007,0x00000002,0x04000101,0x00000000, - 0x00000001,0x00000100,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x0000000f,0x00000001,0x00000010, - 0x00000000 -}; - -FXAAShader * FXAAShader::shaderInstance = NULL; - -FXAAShader::FXAAShader() - : vertexShader(cuAttributeCount) -{ - //! create pixel shader - pixelShader.setProgram(cpPixelShaderProgram, sizeof(cpPixelShaderProgram), cpPixelShaderRegs, sizeof(cpPixelShaderRegs)); - - resolutionLocation = 0; - pixelShader.addUniformVar((GX2UniformVar){ "unf_resolution", GX2_SHADER_VAR_TYPE_FLOAT2, 1, resolutionLocation, -1 }); - - samplerLocation = 0; - pixelShader.addSamplerVar((GX2SamplerVar){ "sampl_texture", GX2_SAMPLER_VAR_TYPE_SAMPLER_2D, samplerLocation }); - - //! create vertex shader - vertexShader.setProgram(cpVertexShaderProgram, sizeof(cpVertexShaderProgram), cpVertexShaderRegs, sizeof(cpVertexShaderRegs)); - - positionLocation = 0; - texCoordLocation = 1; - vertexShader.addAttribVar((GX2AttribVar){ "attr_position", GX2_SHADER_VAR_TYPE_FLOAT3, 0, positionLocation }); - vertexShader.addAttribVar((GX2AttribVar){ "attr_texture_coord", GX2_SHADER_VAR_TYPE_FLOAT2, 0, texCoordLocation }); - - //! setup attribute streams - GX2InitAttribStream(vertexShader.getAttributeBuffer(0), positionLocation, 0, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32_32); - GX2InitAttribStream(vertexShader.getAttributeBuffer(1), texCoordLocation, 1, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32); - - //! create fetch shader - fetchShader = new FetchShader(vertexShader.getAttributeBuffer(), vertexShader.getAttributesCount()); - - //! model vertex has to be align and cannot be in unknown regions for GX2 like 0xBCAE1000 - posVtxs = (f32*)memalign(GX2_VERTEX_BUFFER_ALIGNMENT, ciPositionVtxsSize); - texCoords = (f32*)memalign(GX2_VERTEX_BUFFER_ALIGNMENT, ciTexCoordsVtxsSize); - - //! position vertex structure and texture coordinate vertex structure - int i = 0; - posVtxs[i++] = -1.0f; posVtxs[i++] = -1.0f; posVtxs[i++] = 0.0f; - posVtxs[i++] = 1.0f; posVtxs[i++] = -1.0f; posVtxs[i++] = 0.0f; - posVtxs[i++] = 1.0f; posVtxs[i++] = 1.0f; posVtxs[i++] = 0.0f; - posVtxs[i++] = -1.0f; posVtxs[i++] = 1.0f; posVtxs[i++] = 0.0f; - GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, posVtxs, ciPositionVtxsSize); - - i = 0; - texCoords[i++] = 0.0f; texCoords[i++] = 1.0f; - texCoords[i++] = 1.0f; texCoords[i++] = 1.0f; - texCoords[i++] = 1.0f; texCoords[i++] = 0.0f; - texCoords[i++] = 0.0f; texCoords[i++] = 0.0f; - GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, texCoords, ciTexCoordsVtxsSize); -} - -FXAAShader::~FXAAShader() -{ - if(posVtxs) - { - free(posVtxs); - posVtxs = NULL; - } - if(texCoords) - { - free(texCoords); - texCoords = NULL; - } - - delete fetchShader; - fetchShader = NULL; -} diff --git a/src/video/shaders/FXAAShader.h b/src/video/shaders/FXAAShader.h deleted file mode 100644 index 30d9c5d..0000000 --- a/src/video/shaders/FXAAShader.h +++ /dev/null @@ -1,86 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#ifndef __FXAA_SHADER_H_ -#define __FXAA_SHADER_H_ - -#include "VertexShader.h" -#include "PixelShader.h" -#include "FetchShader.h" - -class FXAAShader : public Shader -{ -public: - static FXAAShader *instance() { - if(!shaderInstance) { - shaderInstance = new FXAAShader(); - } - return shaderInstance; - } - static void destroyInstance() { - if(shaderInstance) { - delete shaderInstance; - shaderInstance = NULL; - } - } - - void setShaders(void) const - { - fetchShader->setShader(); - vertexShader.setShader(); - pixelShader.setShader(); - } - - void setAttributeBuffer() const - { - VertexShader::setAttributeBuffer(0, ciPositionVtxsSize, cuVertexAttrSize, posVtxs); - VertexShader::setAttributeBuffer(1, ciTexCoordsVtxsSize, cuTexCoordAttrSize, texCoords); - } - - void setResolution(const glm::vec2 & vec) - { - PixelShader::setUniformReg(resolutionLocation, 4, &vec[0]); - } - - void setTextureAndSampler(const GX2Texture *texture, const GX2Sampler *sampler) const { - GX2SetPixelTexture((GX2Texture*)texture, samplerLocation); - GX2SetPixelSampler((GX2Sampler*)sampler, samplerLocation); - } - -private: - FXAAShader(); - virtual ~FXAAShader(); - - static const u32 cuAttributeCount = 2; - static const u32 ciPositionVtxsSize = 4 * cuVertexAttrSize; - static const u32 ciTexCoordsVtxsSize = 4 * cuTexCoordAttrSize; - - static FXAAShader *shaderInstance; - - FetchShader *fetchShader; - VertexShader vertexShader; - PixelShader pixelShader; - - f32 *posVtxs; - f32 *texCoords; - - u32 samplerLocation; - u32 positionLocation; - u32 texCoordLocation; - u32 resolutionLocation; -}; - -#endif // __FXAA_SHADER_H_ diff --git a/src/video/shaders/FetchShader.h b/src/video/shaders/FetchShader.h deleted file mode 100644 index 8152178..0000000 --- a/src/video/shaders/FetchShader.h +++ /dev/null @@ -1,58 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#ifndef FETCH_SHADER_H -#define FETCH_SHADER_H - -#include "Shader.h" - -class FetchShader : public Shader -{ -public: - FetchShader(GX2AttribStream * attributes, u32 attrCount, GX2FetchShaderType type = GX2_FETCH_SHADER_TESSELLATION_NONE, GX2TessellationMode tess = GX2_TESSELLATION_MODE_DISCRETE) - : fetchShader(NULL) - , fetchShaderProgramm(NULL) - { - u32 shaderSize = GX2CalcFetchShaderSizeEx(attrCount, type, tess); - fetchShaderProgramm = (uint8_t*)memalign(GX2_SHADER_ALIGNMENT, shaderSize); - if(fetchShaderProgramm) - { - fetchShader = new GX2FetchShader; - GX2InitFetchShaderEx(fetchShader, fetchShaderProgramm, attrCount, attributes, type, tess); - GX2Invalidate(GX2_INVALIDATE_MODE_CPU_SHADER, fetchShaderProgramm, shaderSize); - } - } - virtual ~FetchShader() { - if(fetchShaderProgramm) - free(fetchShaderProgramm); - if(fetchShader) - delete fetchShader; - } - - GX2FetchShader *getFetchShader() const { - return fetchShader; - } - - void setShader(void) const { - GX2SetFetchShader(fetchShader); - } - -protected: - GX2FetchShader *fetchShader; - uint8_t *fetchShaderProgramm; -}; - -#endif // FETCH_SHADER_H diff --git a/src/video/shaders/PixelShader.h b/src/video/shaders/PixelShader.h deleted file mode 100644 index 8bb8a8e..0000000 --- a/src/video/shaders/PixelShader.h +++ /dev/null @@ -1,150 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#ifndef PIXEL_SHADER_H -#define PIXEL_SHADER_H - -#include "Shader.h" - -class PixelShader : public Shader -{ -public: - PixelShader() - : pixelShader((GX2PixelShader*) memalign(0x40, sizeof(GX2PixelShader))) - { - if(pixelShader) - { - memset(pixelShader, 0, sizeof(GX2PixelShader)); - pixelShader->mode = GX2_SHADER_MODE_UNIFORM_REGISTER; - } - } - virtual ~PixelShader() - { - if(pixelShader) - { - if(pixelShader->program) - free(pixelShader->program); - - for(u32 i = 0; i < pixelShader->uniformBlockCount; i++) - free((void*)pixelShader->uniformBlocks[i].name); - - if(pixelShader->uniformBlocks) - free((void*)pixelShader->uniformBlocks); - - for(u32 i = 0; i < pixelShader->uniformVarCount; i++) - free((void*)pixelShader->uniformVars[i].name); - - if(pixelShader->uniformVars) - free((void*)pixelShader->uniformVars); - - if(pixelShader->initialValues) - free((void*)pixelShader->initialValues); - - for(u32 i = 0; i < pixelShader->samplerVarCount; i++) - free((void*)pixelShader->samplerVars[i].name); - - if(pixelShader->samplerVars) - free((void*)pixelShader->samplerVars); - - if(pixelShader->loopVars) - free((void*)pixelShader->loopVars); - - free(pixelShader); - } - } - - void setProgram(const u32 * program, const u32 & programSize, const u32 * regs, const u32 & regsSize) - { - if(!pixelShader) - return; - - //! this must be moved into an area where the graphic engine has access to and must be aligned to 0x100 - pixelShader->size = programSize; - pixelShader->program = (u8*)memalign(GX2_SHADER_ALIGNMENT, pixelShader->size); - if(pixelShader->program) - { - memcpy(pixelShader->program, program, pixelShader->size); - GX2Invalidate(GX2_INVALIDATE_MODE_CPU_SHADER, pixelShader->program, pixelShader->size); - } - - memcpy(&pixelShader->regs, regs, regsSize); - } - - void addUniformVar(const GX2UniformVar & var) - { - if(!pixelShader) - return; - - u32 idx = pixelShader->uniformVarCount; - - GX2UniformVar* newVar = (GX2UniformVar*) malloc((pixelShader->uniformVarCount + 1) * sizeof(GX2UniformVar)); - if(newVar) - { - if(pixelShader->uniformVars) - { - memcpy(newVar, pixelShader->uniformVars, pixelShader->uniformVarCount * sizeof(GX2UniformVar)); - free(pixelShader->uniformVars); - } - pixelShader->uniformVars = newVar; - - memcpy(pixelShader->uniformVars + idx, &var, sizeof(GX2UniformVar)); - pixelShader->uniformVars[idx].name = (char*) malloc(strlen(var.name) + 1); - strcpy((char*)pixelShader->uniformVars[idx].name, var.name); - - pixelShader->uniformVarCount++; - } - } - - void addSamplerVar(const GX2SamplerVar & var) - { - if(!pixelShader) - return; - - u32 idx = pixelShader->samplerVarCount; - - GX2SamplerVar* newVar = (GX2SamplerVar*) malloc((pixelShader->samplerVarCount + 1) * sizeof(GX2SamplerVar)); - if(newVar) - { - if(pixelShader->samplerVars) - { - memcpy(newVar, pixelShader->samplerVars, pixelShader->samplerVarCount * sizeof(GX2SamplerVar)); - free(pixelShader->samplerVars); - } - pixelShader->samplerVars = newVar; - - memcpy(pixelShader->samplerVars + idx, &var, sizeof(GX2SamplerVar)); - pixelShader->samplerVars[idx].name = (char*) malloc(strlen(var.name) + 1); - strcpy((char*)pixelShader->samplerVars[idx].name, var.name); - - pixelShader->samplerVarCount++; - } - } - GX2PixelShader * getPixelShader() const { - return pixelShader; - } - - void setShader(void) const { - GX2SetPixelShader(pixelShader); - } - - static inline void setUniformReg(u32 location, u32 size, const void * reg) { - GX2SetPixelUniformReg(location, size, (uint32_t *)reg); - } -protected: - GX2PixelShader *pixelShader; -}; - -#endif // PIXEL_SHADER_H diff --git a/src/video/shaders/Shader.h b/src/video/shaders/Shader.h deleted file mode 100644 index 2c4f580..0000000 --- a/src/video/shaders/Shader.h +++ /dev/null @@ -1,83 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#ifndef SHADER_H_ -#define SHADER_H_ - -#include "glm/glm.hpp" -#include "glm/gtc/matrix_transform.hpp" -#include "utils/utils.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include "common/gx2_ext.h" - -class Shader -{ -protected: - Shader() {} - virtual ~Shader() {} -public: - static const u16 cuVertexAttrSize = sizeof(f32) * 3; - static const u16 cuTexCoordAttrSize = sizeof(f32) * 2; - static const u16 cuColorAttrSize = sizeof(u8) * 4; - - static void setLineWidth(const f32 & width) { - GX2SetLineWidth(width); - } - - static void draw(s32 primitive = GX2_PRIMITIVE_MODE_QUADS, u32 vtxCount = 4) - { - switch(primitive) - { - default: - case GX2_PRIMITIVE_MODE_QUADS: - { - GX2DrawEx(GX2_PRIMITIVE_MODE_QUADS, vtxCount, 0, 1); - break; - } - case GX2_PRIMITIVE_MODE_TRIANGLES: - { - GX2DrawEx(GX2_PRIMITIVE_MODE_TRIANGLES, vtxCount, 0, 1); - break; - } - case GX2_PRIMITIVE_MODE_TRIANGLE_FAN: - { - GX2DrawEx(GX2_PRIMITIVE_MODE_TRIANGLE_FAN, vtxCount, 0, 1); - break; - } - case GX2_PRIMITIVE_MODE_LINES: - { - GX2DrawEx(GX2_PRIMITIVE_MODE_LINES, vtxCount, 0, 1); - break; - } - case GX2_PRIMITIVE_MODE_LINE_STRIP: - { - GX2DrawEx(GX2_PRIMITIVE_MODE_LINE_STRIP, vtxCount, 0, 1); - break; - } - //! TODO: add other primitives later - }; - } -}; - -#endif // SHADER_H_ diff --git a/src/video/shaders/Shader3D.cpp b/src/video/shaders/Shader3D.cpp deleted file mode 100644 index 0824be6..0000000 --- a/src/video/shaders/Shader3D.cpp +++ /dev/null @@ -1,266 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#include -#include -#include "Shader3D.h" - -static const u32 cpVertexShaderProgram[] = -{ - 0x00000000,0x00008009,0x20000000,0x0000e4a1, - 0x00c00100,0x88048093,0x01c00300,0x98060014, - 0x9a000000,0x000058a0,0x3c200200,0x88062094, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x0765a101,0x9000e00f,0x0761a101,0x9000e02f, - 0x01081f00,0x900ce040,0x01041f00,0x900ce060, - 0x01001f80,0x900ce000,0x02001f00,0x900c6000, - 0x02041f00,0x900c6020,0x076da101,0x9000e04f, - 0x0769a181,0x9000e06f,0x0745a101,0x9000c00f, - 0x0741a181,0x9000c02f,0x074da101,0x9000c04f, - 0x0749a181,0x9000c06f,0x0bc9a000,0x7f00e20f, - 0x0bc92080,0x7f04e22f,0x0bc9a001,0x7f08e24f, - 0x0bc92081,0x7f0ce26f,0x0725a101,0x9000a00f, - 0x0721a181,0x9000a02f,0x072da101,0x9000a04f, - 0x0729a181,0x9000a06f,0x0ac9a000,0x7e00c20f, - 0x0ac92080,0x7e04c22f,0x0ac9a001,0x7e08c24f, - 0x0ac92081,0x7e0cc26f,0x0ba5a000,0x7f00e20f, - 0x0ba52080,0x7f04e22f,0x0ba5a001,0x7f08e24f, - 0x0ba52081,0x7f0ce26f,0x08eda000,0x9000800f, - 0x08ed2080,0x9000802f,0x08eda001,0x9000804f, - 0x08ed2081,0x9000806f,0x09c9a000,0x7d00a20f, - 0x09c92080,0x7d04a22f,0x09c9a001,0x7d08a24f, - 0x09c92081,0x7d0ca26f,0x0aa5a000,0x7e00c20f, - 0x0aa52080,0x7e04c22f,0x0aa5a001,0x7e08c24f, - 0x0aa52081,0x7e0cc26f,0x0b81a000,0x7f004200, - 0x0b812080,0x7f044220,0x0b81a001,0x7f082240, - 0x0b812081,0x7f0c0260,0x08c9a000,0x7c00820f, - 0x08c92080,0x7c04822f,0x08c9a001,0x7c08824f, - 0x08c92081,0x7c0c826f,0x09a5a000,0x7d00a20f, - 0x09a52080,0x7d04a22f,0x09a5a001,0x7d08a24f, - 0x09a52081,0x7d0ca26f,0x0a81a000,0x7e000200, - 0x0a812080,0x7e040220,0x0a81a001,0x7e080240, - 0x0a812081,0x7e0c2260,0x0240a001,0x9000c00f, - 0x0244a001,0x9000c02f,0x0148a001,0x9000c04f, - 0x004ca001,0x9000c06f,0x0264a081,0x9000e02f, - 0x0260a001,0x9000e00f,0x0224a001,0x90002020, - 0x0168a001,0x9000e04f,0x006ca001,0x9000e06f, - 0x0220a081,0x90002000,0x08a5a000,0x7c00820f, - 0x08a52080,0x7c04822f,0x08a5a001,0x7c08824f, - 0x08a52081,0x7c0c826f,0x0981a000,0x7d008200, - 0x09812080,0x7d048220,0x0981a001,0x7d084240, - 0x09812081,0x7d0c4260,0x02090000,0x7e00c20f, - 0x02098000,0x7e04c22f,0x0128a001,0x9000a04f, - 0x002ca001,0x9000c06f,0x02298081,0x7e0caa6f, - 0x03090000,0x7f00e20f,0x03098000,0x7f04e22f, - 0x02090001,0x7e08f64f,0x03298001,0x7f0ce26f, - 0x03090081,0x7f08ca4f,0x0881a000,0x7c00c200, - 0x08812080,0x7c04e220,0x0881a001,0x7c08a240, - 0x08812081,0x7c0c8260,0x0200a001,0x9000800f, - 0x0204a001,0x9000802f,0x0108a001,0x9000804f, - 0x000ca001,0x9000806f,0x01098080,0x0104aa2f, - 0x01090000,0x0100a20f,0x02858000,0x7e04c22f, - 0x01090001,0x7d08a24f,0x01298081,0x7e0cc26f, - 0x02850000,0x7e00f60f,0x03858000,0x7f04622f, - 0x02450001,0x7f08e24f,0x02458001,0x7d0ca26f, - 0x03850080,0x7f00ca0f,0x00090000,0x7c004200, - 0x00098000,0x7c04b220,0x03450001,0x7e08c24f, - 0x03458001,0x7f0ce26f,0x03e18080,0xfe042620, - 0x01850000,0x7d00a200,0x01858000,0x7d04622f, - 0x00090001,0x7c086240,0x00298081,0x7c0c0260, - 0x02c10000,0x7f000200,0x02e18000,0x7e040620, - 0x01450001,0x7d088240,0x01458001,0x7e0c6260, - 0x01e18080,0xfe04c620,0x03c10000,0x7e002200, - 0x03818001,0x7f0c4220,0x02a10001,0x7f081640, - 0x02818001,0x7d0c3660,0x03a10081,0x7e082a40, - 0x07080000,0x0100c20f,0x07088000,0x0104622f, - 0x00458001,0x000cea4f,0x07288081,0x0204f66f, - 0x00850000,0x0200620f,0x00858000,0x05046a2f, - 0x07080001,0x0108c24f,0x01818001,0x030c726f, - 0x07cc8080,0xfe04c22f,0x01c10000,0x0500660f, - 0x00e18000,0xfe04622f,0x00450001,0x0308624f, - 0x07cc9f01,0x7f0ce26f,0x00c10080,0xfe00e60f, - 0x07cc1f00,0x7e00660f,0x00a10001,0xfe08c22f, - 0x01a10001,0x0408624f,0x00818001,0x7f086a6f, - 0x07c09f80,0x7e048200,0x07e00f00,0xfe008220, - 0x07cc1f01,0x7e086a4f,0x07c09f81,0x7f0c8240, - 0x07c08f80,0xfe088260,0x2c34800d,0xe3b4f15e, - 0x7642ed30,0x7408600d -}; - -static const u32 cpVertexShaderRegs[] = { - 0x00000108,0x00000000,0x00000002,0x00000001, - 0xffff0001,0xffffffff,0xffffffff,0xffffffff, - 0xffffffff,0xffffffff,0xffffffff,0xffffffff, - 0xffffffff,0xffffffff,0x00000000,0xfffffffc, - 0x00000002,0x00000000,0x00000001,0x000000ff, - 0x000000ff,0x000000ff,0x000000ff,0x000000ff, - 0x000000ff,0x000000ff,0x000000ff,0x000000ff, - 0x000000ff,0x000000ff,0x000000ff,0x000000ff, - 0x000000ff,0x000000ff,0x000000ff,0x000000ff, - 0x000000ff,0x000000ff,0x000000ff,0x000000ff, - 0x000000ff,0x000000ff,0x000000ff,0x000000ff, - 0x000000ff,0x000000ff,0x000000ff,0x000000ff, - 0x000000ff,0x00000000,0x0000000e,0x00000010 -}; - -static const u32 cPixelShaderProgram[] = -{ - 0x20000000,0x000008a4,0x03000000,0x01004085, - 0x23000000,0x000044a8,0x35000000,0x000000a4, - 0x06000000,0x01004085,0x36000000,0x00002ca8, - 0x50000000,0x0000c080,0x42000000,0x00001ca0, - 0x00800000,0x88062094,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0xfd001f80,0x900c0060,0x0000803f,0x00000000, - 0x02011f80,0x8c110000,0xf8402000,0x9006a00f, - 0x02552001,0x00000020,0x01248082,0x80020060, - 0xfe3c1f00,0x1000e04f,0xfe041f80,0x1033c00f, - 0xfe482081,0x80060020,0xfee40f81,0x0289e30f, - 0x02c51f80,0x80060060,0xfeec0f80,0x0285634f, - 0xfec80f80,0x80000060,0xfe4ca081,0x9000e04f, - 0xfe281f00,0x80060000,0xf8c01f81,0x9006e02f, - 0xfee00f81,0xfd80636f,0x0000803f,0x00000000, - 0x7fc49f81,0xf880e34f,0xfe381f80,0x00000000, - 0x7de00f81,0xfe800360,0x01011f80,0x8c100000, - 0x00a81f00,0x9000e02f,0x00000082,0x80020060, - 0x00002040,0x00000000,0xfeac9f80,0xfd00624f, - 0x3333333f,0x00002040,0xfee88f80,0x0101620f, - 0x00cc1f80,0x9000e06f,0xf8c09f01,0x80060020, - 0xfe2c1f80,0x9006e04f,0xfee48f81,0xf880630f, - 0x7fc81f80,0xfd800360,0x0000803f,0x00000000, - 0x000ca001,0x80000000,0x00091f00,0x800c0020, - 0x00051f00,0x800c0040,0x00011f80,0x800c0060, - 0xfe2c0000,0x90002000,0xfe288000,0x90002020, - 0xfe240001,0x90002040,0xfe208081,0x90002060, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x10000100,0x01100df0,0x00008010,0xecdfea0d, - 0x99720984,0x041cab0d,0xa28a9ccd,0x95d199a5 -}; -static const u32 cPixelShaderRegs[] = { - 0x00000102,0x00000002,0x14000002,0x00000000, - 0x00000002,0x00000100,0x00000101,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x0000000f,0x00000001,0x00000010, - 0x00000000 -}; - -Shader3D * Shader3D::shaderInstance = NULL; - -Shader3D::Shader3D() - : vertexShader(cuAttributeCount) -{ - //! create pixel shader - pixelShader.setProgram(cPixelShaderProgram, sizeof(cPixelShaderProgram), cPixelShaderRegs, sizeof(cPixelShaderRegs)); - - colorIntensityLocation = 0; - fadeDistanceLocation = 4; - fadeOutLocation = 8; - pixelShader.addUniformVar((GX2UniformVar){ "unf_color_intensity", GX2_SHADER_VAR_TYPE_FLOAT4, 1, colorIntensityLocation, -1 }); - pixelShader.addUniformVar((GX2UniformVar){ "unf_fade_distance", GX2_SHADER_VAR_TYPE_FLOAT, 1, fadeDistanceLocation, -1 }); - pixelShader.addUniformVar((GX2UniformVar){ "unf_fade_out_alpha", GX2_SHADER_VAR_TYPE_FLOAT4, 1, fadeOutLocation, -1 }); - - samplerLocation = 0; - pixelShader.addSamplerVar((GX2SamplerVar){ "sampl_texture", GX2_SAMPLER_VAR_TYPE_SAMPLER_2D, samplerLocation }); - - //! create vertex shader - vertexShader.setProgram(cpVertexShaderProgram, sizeof(cpVertexShaderProgram), cpVertexShaderRegs, sizeof(cpVertexShaderRegs)); - - modelMatrixLocation = 0; - projectionMatrixLocation = 16; - viewMatrixLocation = 32; - vertexShader.addUniformVar((GX2UniformVar){ "modelMatrix", GX2_SHADER_VAR_TYPE_MATRIX4X4, 1, modelMatrixLocation, -1 }); - vertexShader.addUniformVar((GX2UniformVar){ "viewMatrix", GX2_SHADER_VAR_TYPE_MATRIX4X4, 1, projectionMatrixLocation, -1 }); - vertexShader.addUniformVar((GX2UniformVar){ "projectionMatrix", GX2_SHADER_VAR_TYPE_MATRIX4X4, 1, viewMatrixLocation, -1 }); - - positionLocation = 0; - texCoordLocation = 1; - vertexShader.addAttribVar((GX2AttribVar){ "attr_position", GX2_SHADER_VAR_TYPE_FLOAT4, 0, positionLocation }); - vertexShader.addAttribVar((GX2AttribVar){ "attr_texture_coord", GX2_SHADER_VAR_TYPE_FLOAT2, 0, texCoordLocation }); - - //! setup attribute streams - GX2InitAttribStream(vertexShader.getAttributeBuffer(0), positionLocation, 0, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32_32); - GX2InitAttribStream(vertexShader.getAttributeBuffer(1), texCoordLocation, 1, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32); - - //! create fetch shader - fetchShader = new FetchShader(vertexShader.getAttributeBuffer(), vertexShader.getAttributesCount()); - - //! initialize default quad texture vertexes as those are very commonly used - //! model vertex has to be align and cannot be in unknown regions for GX2 like 0xBCAE1000 - posVtxs = (f32*)memalign(GX2_VERTEX_BUFFER_ALIGNMENT, ciPositionVtxsSize); - texCoords = (f32*)memalign(GX2_VERTEX_BUFFER_ALIGNMENT, ciTexCoordsVtxsSize); - - //! position vertex structure and texture coordinate vertex structure - int i = 0; - posVtxs[i++] = -1.0f; posVtxs[i++] = -1.0f; posVtxs[i++] = 0.0f; - posVtxs[i++] = 1.0f; posVtxs[i++] = -1.0f; posVtxs[i++] = 0.0f; - posVtxs[i++] = 1.0f; posVtxs[i++] = 1.0f; posVtxs[i++] = 0.0f; - posVtxs[i++] = -1.0f; posVtxs[i++] = 1.0f; posVtxs[i++] = 0.0f; - GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, posVtxs, ciPositionVtxsSize); - - i = 0; - texCoords[i++] = 0.0f; texCoords[i++] = 1.0f; - texCoords[i++] = 1.0f; texCoords[i++] = 1.0f; - texCoords[i++] = 1.0f; texCoords[i++] = 0.0f; - texCoords[i++] = 0.0f; texCoords[i++] = 0.0f; - GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, texCoords, ciTexCoordsVtxsSize); -} - -Shader3D::~Shader3D() -{ - if(posVtxs) - { - free(posVtxs); - posVtxs = NULL; - } - if(texCoords) - { - free(texCoords); - texCoords = NULL; - } - - delete fetchShader; - fetchShader = NULL; -} diff --git a/src/video/shaders/Shader3D.h b/src/video/shaders/Shader3D.h deleted file mode 100644 index 1b30b3f..0000000 --- a/src/video/shaders/Shader3D.h +++ /dev/null @@ -1,119 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#ifndef SHADER_3D_H_ -#define SHADER_3D_H_ - -#include "VertexShader.h" -#include "PixelShader.h" -#include "FetchShader.h" - -class Shader3D : public Shader -{ -private: - Shader3D(); - virtual ~Shader3D(); - - static Shader3D * shaderInstance; - - static const unsigned char cuAttributeCount = 2; - static const u32 ciPositionVtxsSize = 4 * cuVertexAttrSize; - static const u32 ciTexCoordsVtxsSize = 4 * cuTexCoordAttrSize; - - FetchShader *fetchShader; - VertexShader vertexShader; - PixelShader pixelShader; - - f32 *posVtxs; - f32 *texCoords; - - u32 modelMatrixLocation; - u32 viewMatrixLocation; - u32 projectionMatrixLocation; - u32 positionLocation; - u32 texCoordLocation; - - u32 colorIntensityLocation; - u32 fadeDistanceLocation; - u32 fadeOutLocation; - u32 samplerLocation; -public: - static Shader3D *instance() { - if(!shaderInstance) { - shaderInstance = new Shader3D(); - } - return shaderInstance; - } - static void destroyInstance() { - if(shaderInstance) { - delete shaderInstance; - shaderInstance = NULL; - } - } - - void setShaders(void) const - { - fetchShader->setShader(); - vertexShader.setShader(); - pixelShader.setShader(); - } - - void setAttributeBuffer(const u32 & vtxCount = 0, const f32 * posVtxs_in = NULL, const f32 * texCoords_in = NULL) const - { - if(posVtxs_in && texCoords_in && vtxCount) - { - VertexShader::setAttributeBuffer(0, vtxCount * cuVertexAttrSize, cuVertexAttrSize, posVtxs_in); - VertexShader::setAttributeBuffer(1, vtxCount * cuTexCoordAttrSize, cuTexCoordAttrSize, texCoords_in); - } - else { - //! use default quad vertex and texture coordinates if nothing is passed - VertexShader::setAttributeBuffer(0, ciPositionVtxsSize, cuVertexAttrSize, posVtxs); - VertexShader::setAttributeBuffer(1, ciTexCoordsVtxsSize, cuTexCoordAttrSize, texCoords); - } - } - - void setProjectionMtx(const glm::mat4 & mtx) - { - VertexShader::setUniformReg(projectionMatrixLocation, 16, &mtx[0][0]); - } - void setViewMtx(const glm::mat4 & mtx) - { - VertexShader::setUniformReg(viewMatrixLocation, 16, &mtx[0][0]); - } - void setModelViewMtx(const glm::mat4 & mtx) - { - VertexShader::setUniformReg(modelMatrixLocation, 16, &mtx[0][0]); - } - void setColorIntensity(const glm::vec4 & vec) - { - PixelShader::setUniformReg(colorIntensityLocation, 4, &vec[0]); - } - void setAlphaFadeOut(const glm::vec4 & vec) - { - PixelShader::setUniformReg(fadeOutLocation, 4, &vec[0]); - } - void setDistanceFadeOut(const float & value) - { - PixelShader::setUniformReg(fadeDistanceLocation, 4, &value); - } - - void setTextureAndSampler(const GX2Texture *texture, const GX2Sampler *sampler) const { - GX2SetPixelTexture((GX2Texture*)texture, samplerLocation); - GX2SetPixelSampler((GX2Sampler*)sampler, samplerLocation); - } -}; - -#endif // SHADER_3D_H_ diff --git a/src/video/shaders/ShaderFractalColor.cpp b/src/video/shaders/ShaderFractalColor.cpp deleted file mode 100644 index db6579f..0000000 --- a/src/video/shaders/ShaderFractalColor.cpp +++ /dev/null @@ -1,373 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#include -#include -#include "ShaderFractalColor.h" - -static const u32 cpVertexShaderProgram[] = -{ - 0x00000000,0x00008009,0x20000000,0x0000eca1, - 0x00c00000,0x88068093,0x01400200,0x9a048013, - 0x9c000000,0x000044a0,0x3c200000,0x88060094, - 0x02400000,0x88062014,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x0765a101,0x9000e00f,0x0761a101,0x9000e02f, - 0x03001f00,0x900c8040,0x03041f80,0x900c8060, - 0x076da101,0x9000e04f,0x0769a181,0x9000e06f, - 0x0745a101,0x9000c00f,0x0741a181,0x9000c02f, - 0x074da101,0x9000c04f,0x0749a181,0x9000c06f, - 0x0bc9a000,0x7f00e20f,0x0bc92080,0x7f04e22f, - 0x0bc9a001,0x7f08e24f,0x0bc92081,0x7f0ce26f, - 0x0725a101,0x9000a00f,0x0721a181,0x9000a02f, - 0x072da101,0x9000a04f,0x0729a181,0x9000a06f, - 0x0ac9a000,0x7e00c20f,0x0ac92080,0x7e04c22f, - 0x0ac9a001,0x7e08c24f,0x0ac92081,0x7e0cc26f, - 0x0ba5a000,0x7f00e20f,0x0ba52080,0x7f04e22f, - 0x0ba5a001,0x7f08e24f,0x0ba52081,0x7f0ce26f, - 0x08eda000,0x9000800f,0x08ed2080,0x9000802f, - 0x08eda001,0x9000804f,0x08ed2081,0x9000806f, - 0x09c9a000,0x7d00a20f,0x09c92080,0x7d04a22f, - 0x09c9a001,0x7d08a24f,0x09c92081,0x7d0ca26f, - 0x0aa5a000,0x7e00c20f,0x0aa52080,0x7e04c22f, - 0x0aa5a001,0x7e08c24f,0x0aa52081,0x7e0cc26f, - 0x0b81a000,0x7f006200,0x0b812080,0x7f046220, - 0x0b81a001,0x7f080240,0x0b812081,0x7f0c0260, - 0x08c9a000,0x7c00820f,0x08c92080,0x7c04822f, - 0x08c9a001,0x7c08824f,0x08c92081,0x7c0c826f, - 0x09a5a000,0x7d00a20f,0x09a52080,0x7d04a22f, - 0x09a5a001,0x7d08a24f,0x09a52081,0x7d0ca26f, - 0x0a81a000,0x7e008200,0x0a812080,0x7e048220, - 0x0a81a001,0x7e086240,0x0a812081,0x7e0c4260, - 0x0340a001,0x9000c00f,0x0344a001,0x9000c02f, - 0x0048a001,0x9000c04f,0x004ca001,0x9000c06f, - 0x0364a081,0x9000e02f,0x0360a001,0x9000e00f, - 0x0324a001,0x90000020,0x0068a001,0x9000e04f, - 0x006ca001,0x9000e06f,0x0320a081,0x90000000, - 0x08a5a000,0x7c00820f,0x08a52080,0x7c04822f, - 0x08a5a001,0x7c08824f,0x08a52081,0x7c0c826f, - 0x0981a000,0x7d00a200,0x09812080,0x7d04a220, - 0x0981a001,0x7d08a240,0x09812081,0x7d0c6260, - 0x02890000,0x7e00c20f,0x02898000,0x7e04c22f, - 0x0028a001,0x9000a04f,0x002ca001,0x9000c06f, - 0x02498081,0x7e0caa6f,0x03890000,0x7f00e20f, - 0x03898000,0x7f04e22f,0x02690001,0x7e08f64f, - 0x03498001,0x7f0ce26f,0x03690081,0x7f08ca4f, - 0x0881a000,0x7c00c200,0x08812080,0x7c04c220, - 0x0881a001,0x7c08e240,0x08812081,0x7c0ca260, - 0x0300a001,0x9000800f,0x0304a001,0x9000802f, - 0x0008a001,0x9000804f,0x000ca001,0x9000806f, - 0x01898080,0x0004aa2f,0x01890000,0x0000a20f, - 0x02a58000,0x7e04c22f,0x01690001,0x7d08a24f, - 0x01498081,0x7e0cc26f,0x02a50000,0x7e00f60f, - 0x03a58000,0x7f04622f,0x02a50001,0x7f08e24f, - 0x02658001,0x7d0ca26f,0x03a50080,0x7f00ca0f, - 0x00890000,0x7c00820f,0x00898000,0x7c049220, - 0x03a50001,0x7e08c24f,0x03658001,0x7f0ce26f, - 0x03c18080,0xfe04862f,0x01a50000,0x7d008200, - 0x01a58000,0x7d04622f,0x00690001,0x7c086240, - 0x00498081,0x7c0c4260,0x02c10000,0x7f00e20f, - 0x02c18000,0x7e04c62f,0x01a50001,0x7d080240, - 0x01658001,0x7e0c0260,0x01c18080,0xfe040620, - 0x03c10000,0x7e00620f,0x03a18001,0x7f0c622f, - 0x02e10001,0x7f08764f,0x02a18001,0x7d0c766f, - 0x03e10081,0x7e084a0f,0x02e80f00,0xfe000e00, - 0x02c88f00,0x7c046220,0x02c81f01,0xff00c240, - 0x02c89f01,0xfe04c260,0x00a50080,0x7c00aa00, - 0x01c10000,0x0400760f,0x00a58000,0x0404622f, - 0x00a50001,0x0308e24f,0x00658001,0x020c626f, - 0x00c10080,0x0500ea0f,0x02c41f00,0x0000620f, - 0x00c18000,0xfe04c22f,0x01e10001,0x0008624f, - 0x01a18001,0x000c666f,0x00a18081,0xfe0ce66f, - 0x00e10001,0x7f08620f,0x02048000,0x03046a2f, - 0x02c41f01,0x06086a4f,0x02c49f01,0x060c6a6f, - 0x02e00f80,0xfe000220,0x02c08f00,0xfe040200, - 0x02e08f01,0xfe0c0240,0x02c01f80,0xfe080260, - 0x8aa480ad,0x2bfc5ca6,0xb5e05b5b,0xd48dc71c -}; - -static const u32 cpVertexShaderRegs[] = { - 0x00000108,0x00000000,0x00000004,0x00000001, - 0xff000201,0xffffffff,0xffffffff,0xffffffff, - 0xffffffff,0xffffffff,0xffffffff,0xffffffff, - 0xffffffff,0xffffffff,0x00000000,0xfffffff8, - 0x00000003,0x00000001,0x00000000,0x00000002, - 0x000000ff,0x000000ff,0x000000ff,0x000000ff, - 0x000000ff,0x000000ff,0x000000ff,0x000000ff, - 0x000000ff,0x000000ff,0x000000ff,0x000000ff, - 0x000000ff,0x000000ff,0x000000ff,0x000000ff, - 0x000000ff,0x000000ff,0x000000ff,0x000000ff, - 0x000000ff,0x000000ff,0x000000ff,0x000000ff, - 0x000000ff,0x000000ff,0x000000ff,0x000000ff, - 0x000000ff,0x00000000,0x0000000e,0x00000010 -}; - -static const u32 cpPixelShaderProgram[] = -{ - 0x20000000,0x000008a4,0x04000000,0x01004085, - 0x23000000,0x0000eca1,0x9f000000,0x0000e0a8, - 0xd8000000,0x000000a4,0x07000000,0x01004085, - 0xd9000000,0x000048a8,0xec000000,0x000000a4, - 0x0a000000,0x01004085,0xed000000,0x000050a8, - 0x02010000,0x000030a0,0x00000000,0x88062094, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0xfd001f80,0x900c0060,0x0000803f,0x00000000, - 0x03011f80,0x8c210000,0xfd001f00,0x900c0000, - 0xfd001f00,0x900ca02f,0x00000002,0x80020040, - 0x00048002,0x80020060,0xf8001f80,0x900cc04f, - 0x0000803f,0x00000000,0xfea81f00,0x9000e00f, - 0xfeac1f00,0x9000e02f,0xf8001f00,0x900c804f, - 0xf8001f80,0x900ca06f,0x00000040,0x00000000, - 0xfea01f00,0x00280000,0xfea41f00,0x00280020, - 0xfe041f00,0x00280040,0xfd041f80,0x00280060, - 0xaf67bb3e,0x00000080,0x7fc41f00,0x00000000, - 0x7fc01f80,0x00000020,0xfe041f00,0x100ac00f, - 0xfe001f80,0x100ac02f,0xfea01f00,0x00280000, - 0xfea41f00,0x00280020,0xfe041f00,0x00280040, - 0xfd041f00,0x1028e06f,0x7fc01f82,0x00000000, - 0x8c65583e,0x00000080,0x7ea41f00,0x80000000, - 0x7ea01f00,0x80000020,0xfee01f00,0x10006040, - 0x7fc48f82,0x00000860,0xa7c4623b,0x00000000, - 0xfea81f00,0x1000e00f,0x7fcc9f01,0x10006020, - 0xfe001f00,0x000a0040,0xfe041f00,0x000a0060, - 0xfea89f80,0x10008040,0x8c65583e,0x3acd13bf, - 0xfeb81f00,0x7e04c20f,0xfebc1f00,0x7e00822f, - 0x03c89f00,0x80060040,0xfea49f00,0x1000e06f, - 0xfea41f81,0x10006060,0x00809043,0x8c65583e, - 0x3acd13bf,0x00000000,0xfea81f00,0xf880a30f, - 0xfe001f00,0x900ca02f,0x7dc41f00,0x1000e04f, - 0xfe081f00,0xfd80636f,0x04081f80,0x900c800f, - 0x0000803f,0x00000000,0xfea81f00,0xf900620f, - 0xfea41f00,0xf900622f,0xfe0c1f00,0x900ca04f, - 0xfec00f00,0x1000c46f,0xfefc0f80,0x10006000, - 0x00000842,0x00000000,0xfeac1f00,0xf900620f, - 0x7fc81f00,0x9000c02f,0x7dc49f00,0x9000e04f, - 0x7df08f01,0x10008060,0x030c1f80,0x900ca02f, - 0x00000842,0x00000000,0xfea41f00,0x80000000, - 0x7ecc1f00,0x9000e02f,0x7e688000,0x80000040, - 0xfea81f00,0x80000060,0x7d6c8081,0x80000000, - 0xa7c4623b,0x00000000,0xfe001f00,0x000a0000, - 0xfe0c1f00,0x000a0020,0xfea41f00,0x80000040, - 0x03648000,0xfe08626f,0x7d648081,0xff00420f, - 0xa7c4623b,0x00000000,0xfeb01f00,0x7e04620f, - 0xfeb41f00,0x7f08662f,0x7c800001,0xff006e4f, - 0xfe081f00,0x000a0060,0x03680081,0xfe0c4e0f, - 0x00809043,0x00000000,0xfebc1f00,0x7f04620f, - 0x7cc41f00,0x00000020,0x7cc49f00,0x1000e04f, - 0xff901f00,0x00000060,0xfe981f80,0x00000000, - 0x00809043,0x00000000,0xfea81f00,0xf900620f, - 0x7cc41f00,0x00000020,0x00c09f00,0x1000c04f, - 0xfe0c1f00,0x80010060,0xff001f80,0x80010000, - 0x00000842,0x00000000,0xfea81f00,0xf900620f, - 0xfecc9f01,0x80000020,0x7fc81f00,0x9000e04f, - 0x7dc89f00,0x1000c86f,0xffe01f80,0x80000000, - 0x00000842,0x00000000,0xfeac1f00,0xf900620f, - 0x7ec81f00,0x9000802f,0xfec49f00,0x9000a040, - 0xfea89f00,0x80000060,0xffe01f80,0x9000a060, - 0x00000842,0xa7c4623b,0xfea41f00,0x80000000, - 0x7ecc1f00,0x9000e02f,0xfe0c1f00,0x000a0040, - 0x7c888081,0x80000000,0xa7c4623b,0x00000000, - 0xfe001f00,0x000a0000,0xfeb81f00,0x7f08622f, - 0xfea49f00,0x80000040,0x048c8081,0xff00420f, - 0x00809043,0xa7c4623b,0xfeb01f00,0x7c04620f, - 0x03600000,0xff00622f,0xfea49f00,0x80000040, - 0xfe081f80,0x000a0060,0x00809043,0x0ccec73c, - 0xfebc1f00,0x7f040200,0xfea09f00,0x90000020, - 0xfe941f00,0x10000040,0xfe081f80,0x30080060, - 0x00809043,0x0ccec73c,0x00041f00,0x20080000, - 0x00a01f00,0x80000020,0x002c1f02,0x1000e04f, - 0x00081f80,0x80010060,0x0ccec73c,0x00000000, - 0xfe201f02,0x1000800f,0xfec81f03,0x80020020, - 0xfe041f00,0x20080040,0xfe881f00,0x00000060, - 0xfecc9f81,0x9000a06f,0xfe0c1f00,0x000a0000, - 0xfe801f00,0x00000020,0xfec01f02,0x80020040, - 0xfe281f02,0x1000c06f,0xfe841f82,0x1000804f, - 0xfe041f00,0x000a0000,0x7fc81f02,0x00000020, - 0xfe8c1f00,0x00000040,0xfecc9f03,0x80020060, - 0xfe881f82,0x1000a00f,0x7cc01f02,0x00000000, - 0xfe8c1f02,0x1000e02f,0xfec49f00,0x80000040, - 0xfe081f00,0x000a0060,0x03c89f80,0x9000e04f, - 0x7ecc9f03,0x00000000,0xfec01f00,0x80000020, - 0x04c81f00,0x80000040,0x7c880f01,0xfe086a6f, - 0x7dac8f81,0x9000800f,0x7da00f00,0xfe04620f, - 0xfec01f00,0x80000020,0x03c01f00,0x80000840, - 0x03ac0f00,0xfe08c66f,0xfebc9f80,0xfd00420f, - 0xe07be53f,0x5c8e5a3f,0xfeb09f00,0xfd00620f, - 0x05e81f00,0x9000f02f,0x7fe48f00,0xfe04624f, - 0x04ec8f00,0xfe08626f,0x03840f81,0x7f08a20f, - 0xe07be53f,0x5c8e5a3f,0x7e0c1f00,0x900ce00f, - 0xfe0c1f00,0x900c802f,0x05cc1f00,0x9000e84f, - 0xfeb89f80,0xfd00626f,0xe07be53f,0x5c8e5a3f, - 0x7cc09f81,0x80000020,0x7fa40f00,0x00280000, - 0xfe848f00,0x00280020,0x7fe80f00,0x00280440, - 0xfd001f80,0x00280060,0x00000080,0x00000000, - 0xfdc01f80,0xf800620f,0x00000243,0x00000000, - 0xfea01f80,0x90000060,0x5555d53f,0x00000000, - 0x02011f80,0x8c110000,0x02448002,0x80020000, - 0xf8402000,0x9006a02f,0x02552081,0x00000040, - 0xfe301f00,0x1000e06f,0xfe081f80,0x1033c02f, - 0xfe4c2081,0x80060040,0xfee88f81,0x0289e32f, - 0x02c59f80,0x80060000,0xfee08f80,0x0285636f, - 0xfecc8f80,0x80000000,0xfe40a081,0x80000060, - 0x00cc9f81,0x9000e04f,0xfe281f00,0x80060000, - 0xf8c01f81,0x9006c02f,0xfee00f81,0xfd80636f, - 0x0000803f,0x00000000,0x7ec49f81,0xf880e34f, - 0xfe381f80,0x00000000,0x7de40f81,0xfe800360, - 0x00011f80,0x8c100000,0xf8001f00,0x900ce00f, - 0x00311f00,0x1000e02f,0x02a41f00,0xf910624f, - 0x02a01f00,0xf910626f,0x00011f80,0x1033e04f, - 0x00000040,0x00000000,0xfecc9f03,0x80020000, - 0xfec81f83,0x80020060,0x7fd49f01,0x00000020, - 0x7fd41f80,0x00000040,0xfe081f00,0x80010000, - 0xfe041f80,0x80010060,0xfee00f01,0x80000000, - 0xfeec0f81,0x80000020,0xfec01f00,0x00280000, - 0xfec49f00,0x00280020,0x7fe00f00,0x00280040, - 0xfd001f80,0x00280060,0x00000080,0x00000000, - 0xfe001f80,0x00350000,0x00ec1f82,0x000c0260, - 0x01011f00,0x800c0000,0x01051f00,0x800c0020, - 0x002c1f00,0x80060040,0xf8008001,0x9006e06f, - 0x01091f80,0x800c0000,0x01c01f00,0x90000000, - 0xfe088001,0xfd80632f,0x01e81f00,0x90000040, - 0x01c49f80,0x90000020,0x0000803f,0x00000000, - 0x7fcc9f80,0xf880630f,0xfe20a081,0x80000000, - 0x01cc1f80,0x90000060,0xc21e82a7,0x62ccc547, - 0x1708607c,0x73ea57a6 -}; -static const u32 cpPixelShaderRegs[] = { - 0x00000106,0x00000002,0x14000003,0x00000000, - 0x00000003,0x00000100,0x00000101,0x00000102, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x0000000f,0x00000001,0x00000010, - 0x00000000 -}; - -ShaderFractalColor * ShaderFractalColor::shaderInstance = NULL; - -ShaderFractalColor::ShaderFractalColor() - : vertexShader(cuAttributeCount) -{ - //! create pixel shader - pixelShader.setProgram(cpPixelShaderProgram, sizeof(cpPixelShaderProgram), cpPixelShaderRegs, sizeof(cpPixelShaderRegs)); - - blurLocation = 0; - colorIntensityLocation = 4; - fadeOutLocation = 8; - fractalLocation = 12; - pixelShader.addUniformVar((GX2UniformVar){ "unf_blur_border", GX2_SHADER_VAR_TYPE_FLOAT, 1, blurLocation, 0xffffffff }); - pixelShader.addUniformVar((GX2UniformVar){ "unf_color_intensity", GX2_SHADER_VAR_TYPE_FLOAT4, 1, colorIntensityLocation, 0xffffffff }); - pixelShader.addUniformVar((GX2UniformVar){ "unf_fade_out_alpha", GX2_SHADER_VAR_TYPE_FLOAT4, 1, fadeOutLocation, 0xffffffff }); - pixelShader.addUniformVar((GX2UniformVar){ "unf_fract_alpha", GX2_SHADER_VAR_TYPE_INT, 1, fractalLocation, 0xffffffff }); - - //! create vertex shader - vertexShader.setProgram(cpVertexShaderProgram, sizeof(cpVertexShaderProgram), cpVertexShaderRegs, sizeof(cpVertexShaderRegs)); - - modelMatrixLocation = 0; - projectionMatrixLocation = 16; - viewMatrixLocation = 32; - vertexShader.addUniformVar((GX2UniformVar){ "modelMatrix", GX2_SHADER_VAR_TYPE_MATRIX4X4, 1, modelMatrixLocation, 0xffffffff }); - vertexShader.addUniformVar((GX2UniformVar){ "projectionMatrix", GX2_SHADER_VAR_TYPE_MATRIX4X4, 1, projectionMatrixLocation, 0xffffffff }); - vertexShader.addUniformVar((GX2UniformVar){ "viewMatrix", GX2_SHADER_VAR_TYPE_MATRIX4X4, 1, viewMatrixLocation, 0xffffffff }); - - positionLocation = 0; - colorLocation = 1; - texCoordLocation = 2; - vertexShader.addAttribVar((GX2AttribVar){ "attr_colors", GX2_SHADER_VAR_TYPE_FLOAT4, 0, colorLocation }); - vertexShader.addAttribVar((GX2AttribVar){ "attr_position", GX2_SHADER_VAR_TYPE_FLOAT3, 0, positionLocation }); - vertexShader.addAttribVar((GX2AttribVar){ "attr_texture_coord", GX2_SHADER_VAR_TYPE_FLOAT2, 0, texCoordLocation }); - - //! setup attribute streams - GX2InitAttribStream(vertexShader.getAttributeBuffer(0), positionLocation, 0, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32_32); - GX2InitAttribStream(vertexShader.getAttributeBuffer(1), texCoordLocation, 1, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32); - GX2InitAttribStream(vertexShader.getAttributeBuffer(2), colorLocation, 2, 0, GX2_ATTRIB_FORMAT_UNORM_8_8_8_8); - - //! create fetch shader - fetchShader = new FetchShader(vertexShader.getAttributeBuffer(), vertexShader.getAttributesCount()); - - //! initialize default quad texture vertexes as those are very commonly used - //! model vertex has to be align and cannot be in unknown regions for GX2 like 0xBCAE1000 - posVtxs = (f32*)memalign(GX2_VERTEX_BUFFER_ALIGNMENT, ciPositionVtxsSize); - texCoords = (f32*)memalign(GX2_VERTEX_BUFFER_ALIGNMENT, ciTexCoordsVtxsSize); - colorVtxs = (u8*)memalign(GX2_VERTEX_BUFFER_ALIGNMENT, ciColorVtxsSize); - - //! position vertex structure and texture coordinate vertex structure - int i = 0; - posVtxs[i++] = -1.0f; posVtxs[i++] = -1.0f; posVtxs[i++] = 0.0f; - posVtxs[i++] = 1.0f; posVtxs[i++] = -1.0f; posVtxs[i++] = 0.0f; - posVtxs[i++] = 1.0f; posVtxs[i++] = 1.0f; posVtxs[i++] = 0.0f; - posVtxs[i++] = -1.0f; posVtxs[i++] = 1.0f; posVtxs[i++] = 0.0f; - GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, posVtxs, ciPositionVtxsSize); - - i = 0; - texCoords[i++] = 0.0f; texCoords[i++] = 1.0f; - texCoords[i++] = 1.0f; texCoords[i++] = 1.0f; - texCoords[i++] = 1.0f; texCoords[i++] = 0.0f; - texCoords[i++] = 0.0f; texCoords[i++] = 0.0f; - GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, texCoords, ciTexCoordsVtxsSize); - - - for(i = 0; i < (int)ciColorVtxsSize; i++) - colorVtxs[i] = 0xff; - - GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, colorVtxs, ciColorVtxsSize); -} - -ShaderFractalColor::~ShaderFractalColor() -{ - if(posVtxs) - { - free(posVtxs); - posVtxs = NULL; - } - if(texCoords) - { - free(texCoords); - texCoords = NULL; - } - if(colorVtxs) - { - free(colorVtxs); - colorVtxs = NULL; - } - - delete fetchShader; - fetchShader = NULL; -} diff --git a/src/video/shaders/ShaderFractalColor.h b/src/video/shaders/ShaderFractalColor.h deleted file mode 100644 index d3d8355..0000000 --- a/src/video/shaders/ShaderFractalColor.h +++ /dev/null @@ -1,124 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#ifndef SHADER_FRACTAL_COLOR_H_ -#define SHADER_FRACTAL_COLOR_H_ - -#include "VertexShader.h" -#include "PixelShader.h" -#include "FetchShader.h" - -class ShaderFractalColor : public Shader -{ -private: - ShaderFractalColor(); - virtual ~ShaderFractalColor(); - - static ShaderFractalColor * shaderInstance; - - static const unsigned char cuAttributeCount = 3; - static const u32 ciPositionVtxsSize = 4 * cuVertexAttrSize; - static const u32 ciTexCoordsVtxsSize = 4 * cuTexCoordAttrSize; - static const u32 ciColorVtxsSize = 4 * cuColorAttrSize; - - FetchShader *fetchShader; - VertexShader vertexShader; - PixelShader pixelShader; - - f32 *posVtxs; - f32 *texCoords; - u8 *colorVtxs; - - u32 modelMatrixLocation; - u32 viewMatrixLocation; - u32 projectionMatrixLocation; - u32 positionLocation; - u32 colorLocation; - u32 texCoordLocation; - - u32 blurLocation; - u32 colorIntensityLocation; - u32 fadeOutLocation; - u32 fractalLocation; -public: - static ShaderFractalColor *instance() { - if(!shaderInstance) { - shaderInstance = new ShaderFractalColor(); - } - return shaderInstance; - } - static void destroyInstance() { - if(shaderInstance) { - delete shaderInstance; - shaderInstance = NULL; - } - } - - void setShaders(void) const - { - fetchShader->setShader(); - vertexShader.setShader(); - pixelShader.setShader(); - } - - void setAttributeBuffer(const u32 & vtxCount = 0, const f32 * posVtxs_in = NULL, const f32 * texCoords_in = NULL, const u8 * colorVtxs_in = NULL) const - { - if(posVtxs_in && texCoords_in && vtxCount) - { - VertexShader::setAttributeBuffer(0, vtxCount * cuVertexAttrSize, cuVertexAttrSize, posVtxs_in); - VertexShader::setAttributeBuffer(1, vtxCount * cuTexCoordAttrSize, cuTexCoordAttrSize, texCoords_in); - VertexShader::setAttributeBuffer(2, vtxCount * cuColorAttrSize, cuColorAttrSize, colorVtxs_in); - } - else { - //! use default quad vertex and texture coordinates if nothing is passed - VertexShader::setAttributeBuffer(0, ciPositionVtxsSize, cuVertexAttrSize, posVtxs); - VertexShader::setAttributeBuffer(1, ciTexCoordsVtxsSize, cuTexCoordAttrSize, texCoords); - VertexShader::setAttributeBuffer(2, ciColorVtxsSize, cuColorAttrSize, colorVtxs); - } - } - - void setProjectionMtx(const glm::mat4 & mtx) - { - VertexShader::setUniformReg(projectionMatrixLocation, 16, &mtx[0][0]); - } - void setViewMtx(const glm::mat4 & mtx) - { - VertexShader::setUniformReg(viewMatrixLocation, 16, &mtx[0][0]); - } - void setModelViewMtx(const glm::mat4 & mtx) - { - VertexShader::setUniformReg(modelMatrixLocation, 16, &mtx[0][0]); - } - - void setBlurBorder(const float & blurBorderSize) - { - PixelShader::setUniformReg(blurLocation, 4, &blurBorderSize); - } - void setColorIntensity(const glm::vec4 & vec) - { - PixelShader::setUniformReg(colorIntensityLocation, 4, &vec[0]); - } - void setAlphaFadeOut(const glm::vec4 & vec) - { - PixelShader::setUniformReg(fadeOutLocation, 4, &vec[0]); - } - void setFractalColor(const int & fractalColorEnable) - { - PixelShader::setUniformReg(fractalLocation, 4, &fractalColorEnable); - } -}; - -#endif // SHADER_FRACTAL_COLOR_H_ diff --git a/src/video/shaders/Texture2DShader.cpp b/src/video/shaders/Texture2DShader.cpp deleted file mode 100644 index a1973da..0000000 --- a/src/video/shaders/Texture2DShader.cpp +++ /dev/null @@ -1,271 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#include -#include -#include "Texture2DShader.h" - -static const u32 cpVertexShaderProgram[] = -{ - 0x00000000,0x00008009,0x20000000,0x000080a0, - 0x3c200100,0x88060094,0x00400000,0x88042014, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x02290001,0x80000000,0x02041f00,0x900c0020, - 0x00a11f00,0xfc00624f,0xfd041f00,0x900c4060, - 0x02001f80,0x900c0000,0x83f9223e,0x0000803f, - 0xfe081f00,0x00080020,0xfe202081,0x10004040, - 0xfea49f80,0xfd00620f,0xdb0f49c0,0xdb0fc940, - 0xfea01f80,0x9000e06f,0x83f9223e,0x00000000, - 0xfe0c1f80,0x00370000,0xffa01f00,0x80000040, - 0xff101f00,0x800c0060,0x7f0c1f80,0x80370040, - 0x0000103f,0x00000000,0xffa01f00,0x80000000, - 0xff001f00,0x800c0020,0x02c51f01,0x80000040, - 0xfeac9f80,0x80000060,0x0000103f,0x398ee33f, - 0xfea01f00,0x80000000,0x02c19f01,0x9000e02f, - 0x01c41f01,0x9000e04f,0x02c59f80,0x80000060, - 0x398ee33f,0x00000000,0x01c49f01,0x80000020, - 0x02c11f80,0x80000040,0x01e08f00,0xfe04624f, - 0x01c01f81,0x7f08626f,0xfe2c2000,0x10004000, - 0xfe28a080,0x10004020,0xeb825790,0xb6f711be, - 0x7c0e2df2,0x81173cfa -}; - -static const u32 cpVertexShaderRegs[] = { - 0x00000103,0x00000000,0x00000000,0x00000001, - 0xffffff00,0xffffffff,0xffffffff,0xffffffff, - 0xffffffff,0xffffffff,0xffffffff,0xffffffff, - 0xffffffff,0xffffffff,0x00000000,0xfffffffc, - 0x00000002,0x00000000,0x00000001,0x000000ff, - 0x000000ff,0x000000ff,0x000000ff,0x000000ff, - 0x000000ff,0x000000ff,0x000000ff,0x000000ff, - 0x000000ff,0x000000ff,0x000000ff,0x000000ff, - 0x000000ff,0x000000ff,0x000000ff,0x000000ff, - 0x000000ff,0x000000ff,0x000000ff,0x000000ff, - 0x000000ff,0x000000ff,0x000000ff,0x000000ff, - 0x000000ff,0x000000ff,0x000000ff,0x000000ff, - 0x000000ff,0x00000000,0x0000000e,0x00000010 -}; - -static const u32 cPixelShaderProgram[] = -{ - 0x20000000,0x00000ca4,0x0b000000,0x00000085, - 0x24000000,0x000050a0,0xb0000000,0x000cc080, - 0x39000000,0x00005ca0,0xb8000000,0x000cc080, - 0x51000000,0x000078a0,0xc0000000,0x000cc080, - 0x70000000,0x000064a0,0xc8000000,0x0008c080, - 0x8a000000,0x00005ca0,0x0e000000,0x01008086, - 0xce000000,0x0000c080,0xa2000000,0x00000ca8, - 0x00800000,0x88062094,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00051f00,0x80060000,0x00011f80,0x80060040, - 0xfec81f80,0xfb802320,0x01041f80,0x8c220000, - 0x00a41f00,0xfc10620f,0x010d1f00,0x900c0021, - 0x00091f00,0x80060040,0x00a01f80,0xfc10626f, - 0x00000040,0x00000000,0xfe080000,0xfe8cc300, - 0xfe088080,0xfe80c320,0x00a11f00,0xfe000200, - 0x00a51f00,0xfe040220,0x00a19f00,0xfe000240, - 0x00a59f00,0xfe040260,0x00a11f81,0xfe002600, - 0x4260e5bc,0xa69bc4bc,0x0ad7a3bc,0x00000000, - 0x00a11f00,0x06004200,0x00a59f00,0x06042220, - 0x00a51f00,0x06044240,0x00a11f01,0x06008260, - 0x00a51f81,0x06048620,0x6f1283bc,0x0ad7a3bc, - 0xa69b44bc,0x00000000,0x00a41f00,0x80000000, - 0x00a01f00,0x80000020,0x00ac1f00,0x80000040, - 0x00a81f00,0x80000060,0x00a19f80,0x06000600, - 0xcac3123c,0x6f1203bc,0x03a41f00,0xfe00620f, - 0x03a01f00,0xfe04622f,0x03ac1f00,0xfe08624f, - 0x03a81f00,0xfe0c626f,0x00a59f80,0x06040620, - 0xcc28913b,0x6f1203bc,0x01a41f00,0xfe00620f, - 0x01a01f00,0xfe04622f,0x01ac1f00,0xfe08624f, - 0x01a81f00,0xfe0c626f,0x00a19f80,0x06002600, - 0xe8eab03c,0x6f1283bb,0x02ac1f00,0xfe084200, - 0x02a81f00,0xfe0c4220,0x02a41f00,0xfe004240, - 0x02a01f00,0xfe044260,0x00a59f80,0x06042620, - 0x92bb353d,0x6f1283bb,0x04a81f00,0x0204620f, - 0x04ac1f00,0x0200662f,0x04a41f00,0x0208624f, - 0x04a01f00,0x020c626f,0x00a19f80,0x06004600, - 0xc4139f3d,0x6f12833b,0x00a41f00,0xfe08620f, - 0x00a01f00,0xfe0c622f,0x00ac1f00,0xfe04624f, - 0x00a81f00,0xfe00626f,0x00a59f80,0x06044620, - 0xb950ed3d,0x6f12833b,0x01a41f00,0xfe00620f, - 0x01a01f00,0xfe04622f,0x01ac1f00,0xfe08624f, - 0x01a81f00,0xfe0c626f,0x00a19f80,0x06002600, - 0xecd7163e,0x6f12033c,0x03a41f00,0xfe000200, - 0x03a01f00,0xfe040220,0x03ac1f00,0xfe082240, - 0x03a81f00,0xfe0c2260,0x00a59f80,0x06042620, - 0x2168233e,0x6f12033c,0x00a11f00,0x06006200, - 0x00a51f00,0x06046220,0x00a19f00,0x06006240, - 0x00a59f00,0x06046260,0x00a11f81,0x0600e600, - 0xa69b443c,0x6f12833c,0x0ad7a33c,0x00000000, - 0x02ac1f00,0x0108620f,0x02a81f00,0x010c622f, - 0x02a41f00,0x0000624f,0x02a01f00,0x0004666f, - 0x00a59f80,0x0604e620,0xecd7163e,0x0ad7a33c, - 0x04a81f00,0xfe04620f,0x04ac1f00,0xfe00622f, - 0x04a41f00,0xfe08624f,0x04a01f00,0xfe0c626f, - 0x00a19f80,0x06008600,0xb950ed3d,0xa69bc43c, - 0x05a41f00,0xfe08620f,0x05a01f00,0xfe0c622f, - 0x05ac1f00,0xfe04624f,0x05a81f00,0xfe00626f, - 0x00a59f80,0x06048620,0xc4139f3d,0xa69bc43c, - 0x03a41f00,0xfe00a200,0x03a01f00,0xfe04a220, - 0x03ac1f00,0xfe086240,0x03a81f00,0xfe0c6260, - 0x00a19f80,0x06006600,0x92bb353d,0x4260e53c, - 0x00a51f80,0x06046220,0x4260e53c,0x00000000, - 0x07ac1f00,0x0308620f,0x07a81f00,0x030c622f, - 0x07a41f00,0x0500624f,0x07a01f80,0x0504626f, - 0xe8eab03c,0x00000000,0x04a81f00,0xfe04620f, - 0x04ac1f00,0xfe00622f,0x04a41f00,0xfe08624f, - 0x04a01f80,0xfe0c626f,0xcac3123c,0x00000000, - 0x06a41f00,0xfe08620f,0x06a01f00,0xfe0c622f, - 0x06ac1f00,0xfe04624f,0x06a81f80,0xfe00626f, - 0xcc28913b,0x00000000,0xfe20a000,0x9000e00f, - 0xfe242000,0x9000e02f,0xfe28a001,0x9000e04f, - 0xfe2c2081,0x9000e06f,0xfe28a081,0x80060020, - 0xfee48f00,0x7f842300,0xfee40f00,0x7f802320, - 0xfee48f01,0x7f8c2340,0xfee40f81,0x08842b60, - 0x00202000,0x90002000,0x0024a000,0x90002020, - 0x00282001,0x90002040,0x002ca081,0x90002060, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x10000000,0x03100df0,0x00008010,0xecdfea0d, - 0x10000000,0x00100df0,0x0000a051,0xecdfea0d, - 0x10000100,0x01100df0,0x00008010,0xecdfea0d, - 0x10000200,0x02100df0,0x00000011,0xecdfea0d, - 0x10000400,0x04100df0,0x0000b070,0xecdfea0d, - 0x10000000,0x00100df0,0x00008010,0xecdfea0d, - 0x10000100,0x01100df0,0x00008010,0xecdfea0d, - 0x10000600,0x03100df0,0x00008010,0xecdfea0d, - 0x10000200,0x02100df0,0x00008010,0xecdfea0d, - 0x10000100,0x04100df0,0x00008010,0xecdfea0d, - 0x10000300,0x05100df0,0x00008010,0xecdfea0d, - 0x10000300,0x03100df0,0x0000a051,0xecdfea0d, - 0x10000700,0x07100df0,0x00008010,0xecdfea0d, - 0x10000400,0x04100df0,0x00008010,0xecdfea0d, - 0x10000300,0x06100df0,0x00008010,0xecdfea0d, - 0x10000000,0x00100df0,0x00008010,0xecdfea0d, - 0xc8581837,0x22740275,0x281eddcc,0xfa8b9b65 -}; -static const u32 cPixelShaderRegs[] = { - 0x00000109,0x00000002,0x14000001,0x00000000, - 0x00000001,0x00000100,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x0000000f,0x00000001,0x00000010, - 0x00000000 -}; - -Texture2DShader * Texture2DShader::shaderInstance = NULL; - -Texture2DShader::Texture2DShader() - : vertexShader(cuAttributeCount) -{ - //! create pixel shader - pixelShader.setProgram(cPixelShaderProgram, sizeof(cPixelShaderProgram), cPixelShaderRegs, sizeof(cPixelShaderRegs)); - - blurLocation = 0; - colorIntensityLocation = 4; - pixelShader.addUniformVar((GX2UniformVar){ "unf_blur_texture_direction", GX2_SHADER_VAR_TYPE_FLOAT3, 1, blurLocation, -1 }); - pixelShader.addUniformVar((GX2UniformVar){ "unf_color_intensity", GX2_SHADER_VAR_TYPE_FLOAT4, 1, colorIntensityLocation, -1 }); - - samplerLocation = 0; - pixelShader.addSamplerVar((GX2SamplerVar){ "sampl_texture", GX2_SAMPLER_VAR_TYPE_SAMPLER_2D, samplerLocation }); - - //! create vertex shader - vertexShader.setProgram(cpVertexShaderProgram, sizeof(cpVertexShaderProgram), cpVertexShaderRegs, sizeof(cpVertexShaderRegs)); - - angleLocation = 0; - offsetLocation = 4; - scaleLocation = 8; - vertexShader.addUniformVar((GX2UniformVar){ "unf_angle", GX2_SHADER_VAR_TYPE_FLOAT, 1, angleLocation, -1 }); - vertexShader.addUniformVar((GX2UniformVar){ "unf_offset", GX2_SHADER_VAR_TYPE_FLOAT3, 1, offsetLocation, -1 }); - vertexShader.addUniformVar((GX2UniformVar){ "unf_scale", GX2_SHADER_VAR_TYPE_FLOAT3, 1, scaleLocation, -1 }); - - positionLocation = 0; - texCoordLocation = 1; - vertexShader.addAttribVar((GX2AttribVar){ "attr_position", GX2_SHADER_VAR_TYPE_FLOAT3, 0, positionLocation }); - vertexShader.addAttribVar((GX2AttribVar){ "attr_texture_coord", GX2_SHADER_VAR_TYPE_FLOAT2, 0, texCoordLocation }); - - //! setup attribute streams - GX2InitAttribStream(vertexShader.getAttributeBuffer(0), positionLocation, 0, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32_32); - GX2InitAttribStream(vertexShader.getAttributeBuffer(1), texCoordLocation, 1, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32); - - //! create fetch shader - fetchShader = new FetchShader(vertexShader.getAttributeBuffer(), vertexShader.getAttributesCount()); - - //! model vertex has to be align and cannot be in unknown regions for GX2 like 0xBCAE1000 - posVtxs = (f32*)memalign(GX2_VERTEX_BUFFER_ALIGNMENT, ciPositionVtxsSize); - texCoords = (f32*)memalign(GX2_VERTEX_BUFFER_ALIGNMENT, ciTexCoordsVtxsSize); - - //! defaults for normal square - //! position vertex structure and texture coordinate vertex structure - int i = 0; - posVtxs[i++] = -1.0f; posVtxs[i++] = -1.0f; posVtxs[i++] = 0.0f; - posVtxs[i++] = 1.0f; posVtxs[i++] = -1.0f; posVtxs[i++] = 0.0f; - posVtxs[i++] = 1.0f; posVtxs[i++] = 1.0f; posVtxs[i++] = 0.0f; - posVtxs[i++] = -1.0f; posVtxs[i++] = 1.0f; posVtxs[i++] = 0.0f; - GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, posVtxs, ciPositionVtxsSize); - - i = 0; - texCoords[i++] = 0.0f; texCoords[i++] = 1.0f; - texCoords[i++] = 1.0f; texCoords[i++] = 1.0f; - texCoords[i++] = 1.0f; texCoords[i++] = 0.0f; - texCoords[i++] = 0.0f; texCoords[i++] = 0.0f; - GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, texCoords, ciTexCoordsVtxsSize); -} - -Texture2DShader::~Texture2DShader() -{ - if(posVtxs) - { - free(posVtxs); - posVtxs = NULL; - } - if(texCoords) - { - free(texCoords); - texCoords = NULL; - } - - delete fetchShader; - fetchShader = NULL; -} diff --git a/src/video/shaders/Texture2DShader.h b/src/video/shaders/Texture2DShader.h deleted file mode 100644 index 3ce80de..0000000 --- a/src/video/shaders/Texture2DShader.h +++ /dev/null @@ -1,112 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#ifndef __TEXTURE_2D_SHADER_H_ -#define __TEXTURE_2D_SHADER_H_ - -#include "VertexShader.h" -#include "PixelShader.h" -#include "FetchShader.h" - -class Texture2DShader : public Shader -{ -private: - Texture2DShader(); - virtual ~Texture2DShader(); - - static const u32 cuAttributeCount = 2; - static const u32 ciPositionVtxsSize = 4 * cuVertexAttrSize; - static const u32 ciTexCoordsVtxsSize = 4 * cuTexCoordAttrSize; - - static Texture2DShader *shaderInstance; - - FetchShader *fetchShader; - VertexShader vertexShader; - PixelShader pixelShader; - - f32 *posVtxs; - f32 *texCoords; - - u32 angleLocation; - u32 offsetLocation; - u32 scaleLocation; - u32 colorIntensityLocation; - u32 blurLocation; - u32 samplerLocation; - u32 positionLocation; - u32 texCoordLocation; -public: - static Texture2DShader *instance() { - if(!shaderInstance) { - shaderInstance = new Texture2DShader(); - } - return shaderInstance; - } - static void destroyInstance() { - if(shaderInstance) { - delete shaderInstance; - shaderInstance = NULL; - } - } - - void setShaders(void) const - { - fetchShader->setShader(); - vertexShader.setShader(); - pixelShader.setShader(); - } - - void setAttributeBuffer(const f32 * texCoords_in = NULL, const f32 * posVtxs_in = NULL, const u32 & vtxCount = 0) const - { - if(posVtxs_in && texCoords_in && vtxCount) - { - VertexShader::setAttributeBuffer(0, vtxCount * cuVertexAttrSize, cuVertexAttrSize, posVtxs_in); - VertexShader::setAttributeBuffer(1, vtxCount * cuTexCoordAttrSize, cuTexCoordAttrSize, texCoords_in); - } - else { - VertexShader::setAttributeBuffer(0, ciPositionVtxsSize, cuVertexAttrSize, posVtxs); - VertexShader::setAttributeBuffer(1, ciTexCoordsVtxsSize, cuTexCoordAttrSize, texCoords); - } - } - - void setAngle(const float & val) - { - VertexShader::setUniformReg(angleLocation, 4, &val); - } - void setOffset(const glm::vec3 & vec) - { - VertexShader::setUniformReg(offsetLocation, 4, &vec[0]); - } - void setScale(const glm::vec3 & vec) - { - VertexShader::setUniformReg(scaleLocation, 4, &vec[0]); - } - void setColorIntensity(const glm::vec4 & vec) - { - PixelShader::setUniformReg(colorIntensityLocation, 4, &vec[0]); - } - void setBlurring(const glm::vec3 & vec) - { - PixelShader::setUniformReg(blurLocation, 4, &vec[0]); - } - - void setTextureAndSampler(const GX2Texture *texture, const GX2Sampler *sampler) const { - GX2SetPixelTexture((GX2Texture*)texture, samplerLocation); - GX2SetPixelSampler((GX2Sampler*)sampler, samplerLocation); - } -}; - -#endif // __TEXTURE_2D_SHADER_H_ diff --git a/src/video/shaders/VertexShader.h b/src/video/shaders/VertexShader.h deleted file mode 100644 index bcd0f13..0000000 --- a/src/video/shaders/VertexShader.h +++ /dev/null @@ -1,178 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 Dimok - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - ****************************************************************************/ -#ifndef VERTEX_SHADER_H -#define VERTEX_SHADER_H - -#include -#include "Shader.h" - -class VertexShader : public Shader -{ -public: - VertexShader(u32 numAttr) - : attributesCount( numAttr ) - , attributes( new GX2AttribStream[attributesCount] ) - , vertexShader( (GX2VertexShader*) memalign(0x40, sizeof(GX2VertexShader)) ) - { - if(vertexShader) - { - memset(vertexShader, 0, sizeof(GX2VertexShader)); - vertexShader->mode = GX2_SHADER_MODE_UNIFORM_REGISTER; - } - } - - virtual ~VertexShader() { - delete [] attributes; - - if(vertexShader) - { - if(vertexShader->program) - free(vertexShader->program); - - for(u32 i = 0; i < vertexShader->uniformBlockCount; i++) - free((void*)vertexShader->uniformBlocks[i].name); - - if(vertexShader->uniformBlocks) - free((void*)vertexShader->uniformBlocks); - - for(u32 i = 0; i < vertexShader->uniformVarCount; i++) - free((void*)vertexShader->uniformVars[i].name); - - if(vertexShader->uniformVars) - free((void*)vertexShader->uniformVars); - - if(vertexShader->initialValues) - free((void*)vertexShader->initialValues); - - for(u32 i = 0; i < vertexShader->samplerVarCount; i++) - free((void*)vertexShader->samplerVars[i].name); - - if(vertexShader->samplerVars) - free((void*)vertexShader->samplerVars); - - for(u32 i = 0; i < vertexShader->attribVarCount; i++) - free((void*)vertexShader->attribVars[i].name); - - if(vertexShader->attribVars) - free((void*)vertexShader->attribVars); - - if(vertexShader->loopVars) - free((void*)vertexShader->loopVars); - - free(vertexShader); - } - } - - void setProgram(const u32 * program, const u32 & programSize, const u32 * regs, const u32 & regsSize) - { - if(!vertexShader) - return; - - //! this must be moved into an area where the graphic engine has access to and must be aligned to 0x100 - vertexShader->size = programSize; - vertexShader->program = (u8*) memalign(GX2_SHADER_ALIGNMENT, vertexShader->size); - if(vertexShader->program) - { - memcpy(vertexShader->program, program, vertexShader->size); - GX2Invalidate(GX2_INVALIDATE_MODE_CPU_SHADER, vertexShader->program, vertexShader->size); - } - - memcpy(&vertexShader->regs, regs, regsSize); - } - - void addUniformVar(const GX2UniformVar & var) - { - if(!vertexShader) - return; - - u32 idx = vertexShader->uniformVarCount; - - GX2UniformVar* newVar = (GX2UniformVar*) malloc((vertexShader->uniformVarCount + 1) * sizeof(GX2UniformVar)); - if(newVar) - { - if(vertexShader->uniformVarCount > 0) - { - memcpy(newVar, vertexShader->uniformVars, vertexShader->uniformVarCount * sizeof(GX2UniformVar)); - free(vertexShader->uniformVars); - } - vertexShader->uniformVars = newVar; - - memcpy(vertexShader->uniformVars + idx, &var, sizeof(GX2UniformVar)); - vertexShader->uniformVars[idx].name = (char*) malloc(strlen(var.name) + 1); - strcpy((char*)vertexShader->uniformVars[idx].name, var.name); - - vertexShader->uniformVarCount++; - } - } - - void addAttribVar(const GX2AttribVar & var) - { - if(!vertexShader) - return; - - u32 idx = vertexShader->attribVarCount; - - GX2AttribVar* newVar = (GX2AttribVar*) malloc((vertexShader->attribVarCount + 1) * sizeof(GX2AttribVar)); - if(newVar) - { - if(vertexShader->attribVarCount > 0) - { - memcpy(newVar, vertexShader->attribVars, vertexShader->attribVarCount * sizeof(GX2AttribVar)); - free(vertexShader->attribVars); - } - vertexShader->attribVars = newVar; - - memcpy(vertexShader->attribVars + idx, &var, sizeof(GX2AttribVar)); - vertexShader->attribVars[idx].name = (char*) malloc(strlen(var.name) + 1); - strcpy((char*)vertexShader->attribVars[idx].name, var.name); - - vertexShader->attribVarCount++; - } - } - - static inline void setAttributeBuffer(u32 bufferIdx, u32 bufferSize, u32 stride, const void * buffer) { - GX2SetAttribBuffer(bufferIdx, bufferSize, stride, (void*)buffer); - } - - GX2VertexShader *getVertexShader() const { - return vertexShader; - } - - void setShader(void) const { - GX2SetVertexShader(vertexShader); - } - - GX2AttribStream * getAttributeBuffer(u32 idx = 0) const { - if(idx >= attributesCount) { - return NULL; - } - return &attributes[idx]; - } - u32 getAttributesCount() const { - return attributesCount; - } - - static void setUniformReg(u32 location, u32 size, const void * reg) { - GX2SetVertexUniformReg(location, size, (uint32_t*)reg); - } -protected: - u32 attributesCount; - GX2AttribStream *attributes; - GX2VertexShader *vertexShader; -}; - -#endif // VERTEX_SHADER_H