From 927189550ab836d104f2f892f59f00ed038df712 Mon Sep 17 00:00:00 2001 From: zeromus Date: Thu, 3 Oct 2013 16:50:30 +0000 Subject: [PATCH] add test for sprite blending --- tools/ds_tests/spriteblend/Makefile | 138 ++++++++++++++++++ .../spriteblend/data/drunkenlogo.grit | 5 + .../ds_tests/spriteblend/data/drunkenlogo.png | Bin 0 -> 28875 bytes tools/ds_tests/spriteblend/source/template.c | 97 ++++++++++++ 4 files changed, 240 insertions(+) create mode 100644 tools/ds_tests/spriteblend/Makefile create mode 100644 tools/ds_tests/spriteblend/data/drunkenlogo.grit create mode 100644 tools/ds_tests/spriteblend/data/drunkenlogo.png create mode 100644 tools/ds_tests/spriteblend/source/template.c diff --git a/tools/ds_tests/spriteblend/Makefile b/tools/ds_tests/spriteblend/Makefile new file mode 100644 index 000000000..954a45596 --- /dev/null +++ b/tools/ds_tests/spriteblend/Makefile @@ -0,0 +1,138 @@ +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- + +ifeq ($(strip $(DEVKITARM)),) +$(error "Please set DEVKITARM in your environment. export DEVKITARM=devkitARM") +endif + +include $(DEVKITARM)/ds_rules + +#--------------------------------------------------------------------------------- +# 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 := $(shell basename $(CURDIR)) +BUILD := build +SOURCES := source +DATA := +INCLUDES := include +GRAPHICS := data + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- +ARCH := -mthumb -mthumb-interwork + +CFLAGS := -g -Wall -O2\ + -march=armv5te -mtune=arm946e-s -fomit-frame-pointer\ + -ffast-math \ + $(ARCH) + +CFLAGS += $(INCLUDE) -DARM9 +CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions + +ASFLAGS := -g $(ARCH) +LDFLAGS = -specs=ds_arm9.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) + +#--------------------------------------------------------------------------------- +# any extra libraries we wish to link with the project +#--------------------------------------------------------------------------------- +LIBS := -lnds9 + + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(LIBNDS) + +#--------------------------------------------------------------------------------- +# 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 OUTPUT := $(CURDIR)/$(TARGET) + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) \ + $(foreach dir,$(GRAPHICS),$(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)/*.*))) +PNGFILES := $(foreach dir,$(GRAPHICS),$(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 := $(addsuffix .o,$(BINFILES)) \ + $(PNGFILES:.png=.o) \ + $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) + +export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + -I$(CURDIR)/$(BUILD) + +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) + +.PHONY: $(BUILD) clean + +#--------------------------------------------------------------------------------- +$(BUILD): + @[ -d $@ ] || mkdir -p $@ + @make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... + @rm -fr $(BUILD) $(TARGET).elf $(TARGET).nds $(TARGET).ds.gba + + +#--------------------------------------------------------------------------------- +else + +DEPENDS := $(OFILES:.o=.d) + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +$(OUTPUT).nds : $(OUTPUT).elf +$(OUTPUT).elf : $(OFILES) + +#--------------------------------------------------------------------------------- +%.bin.o : %.bin +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + +#--------------------------------------------------------------------------------- +%.s %.h : %.png %.grit +#--------------------------------------------------------------------------------- + grit $< -fts -o$* + + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------------- diff --git a/tools/ds_tests/spriteblend/data/drunkenlogo.grit b/tools/ds_tests/spriteblend/data/drunkenlogo.grit new file mode 100644 index 000000000..f3358514b --- /dev/null +++ b/tools/ds_tests/spriteblend/data/drunkenlogo.grit @@ -0,0 +1,5 @@ +# 8 bit bitmap +-gB8 + +# bitmap format +-gb diff --git a/tools/ds_tests/spriteblend/data/drunkenlogo.png b/tools/ds_tests/spriteblend/data/drunkenlogo.png new file mode 100644 index 0000000000000000000000000000000000000000..ea66c9e42ff141680a1592f8e6fe6eb59678b24b GIT binary patch literal 28875 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 V7?UKU`Fp_kBQ35VRwZH>^gpR2&UpX; literal 0 HcmV?d00001 diff --git a/tools/ds_tests/spriteblend/source/template.c b/tools/ds_tests/spriteblend/source/template.c new file mode 100644 index 000000000..0a0111b40 --- /dev/null +++ b/tools/ds_tests/spriteblend/source/template.c @@ -0,0 +1,97 @@ +#include +#include +#include +#include +#include + +#include "drunkenlogo.h" + +int main(void) +{ + //--------------------------------------------------------------------------------- + int i = 0; + touchPosition touch; + + videoSetMode(MODE_5_2D); + videoSetModeSub(MODE_0_2D); + + vramSetBankA(VRAM_A_MAIN_BG_0x06000000); + vramSetBankB(VRAM_B_MAIN_SPRITE); + + oamInit(&oamMain, SpriteMapping_1D_32, false); + /*oamInit(&oamSub, SpriteMapping_1D_32, false);*/ + consoleDemoInit(); + int bg3 = bgInit(3, BgType_Bmp8, BgSize_B8_256x256, 0,0); + + dmaCopy(drunkenlogoBitmap, bgGetGfxPtr(bg3), drunkenlogoBitmapLen); + dmaCopy(drunkenlogoPal, BG_PALETTE, 256*2); + + u16* gfx = oamAllocateGfx(&oamMain, SpriteSize_16x16, SpriteColorFormat_16Color); + /*u16* gfxSub = oamAllocateGfx(&oamSub, SpriteSize_16x16, SpriteColorFormat_256Color);*/ + REG_BLDCNT = (1<<11) | (1<<6); + + REG_WININ = 0x3F; //display everything, including color special effects, in window 0 + REG_WINOUT = 0x1F; //display everything, excluding color special effects, outside window 0 + REG_WIN0H = (0<<8) | 128; //window is x (0..128) + REG_WIN0V = (0<<8) | 128; //window is y (0..128) + REG_DISPCNT |= (1<<13); //enable use of window 0 + + for(i = 0; i < 16 * 16 / 2; i+=1) + { + gfx[i] = 0x1111; + } + + + SPRITE_PALETTE[1] = RGB15(31,31,31); + + u8 eva = 0xf, evb = 0xf; + + while(1) + { + + scanKeys(); + u32 keys = keysDown(); + + if(keysHeld() & KEY_TOUCH) + touchRead(&touch); + if(keys & KEY_LEFT && evb > 0) + evb--; + if(keys & KEY_RIGHT && evb < 0xf) + evb++; + if(keys & KEY_UP && eva > 0) + eva--; + if(keys & KEY_DOWN && eva < 0xf) + eva++; + + consoleClear(); + printf("eva %x evb %x\n", eva, evb); + + oamSet(&oamMain, //main graphics engine context + 0, //oam index (0 to 127) + touch.px, touch.py, //x and y pixle location of the sprite + 0, //priority, lower renders last (on top) + 0, //this is the palette index if multiple palettes or the alpha value if bmp sprite + SpriteSize_16x16, + SpriteColorFormat_16Color, + gfx, //pointer to the loaded graphics + -1, //sprite rotation data + false, //double the size when rotating? + false, //hide the sprite? + false, false, //vflip, hflip + false //apply mosaic + ); + + + /*REG_BLDCNT = 0;*/ + REG_BLDALPHA = evb<<8|eva; + + oamMain.oamMemory[0].blendMode = OBJMODE_BLENDED; + + swiWaitForVBlank(); + + bgUpdate(); + oamUpdate(&oamMain); + } + + return 0; +}