OSX_BUILD cleaned commit

This commit is contained in:
Hyenadae 2020-05-16 15:30:27 -04:00
parent 8722b09bb4
commit 5dd43ad674
8 changed files with 89 additions and 32 deletions

View File

@ -22,8 +22,9 @@ TARGET_N64 = 0
# Build and optimize for Raspberry Pi(s) # Build and optimize for Raspberry Pi(s)
TARGET_RPI ?= 0 TARGET_RPI ?= 0
# Compiler to use (ido or gcc)
COMPILER ?= ido # Makeflag to enable OSX fixes
OSX_BUILD ?= 0
# Disable better camera by default # Disable better camera by default
BETTERCAMERA ?= 0 BETTERCAMERA ?= 0
@ -141,6 +142,10 @@ ifeq ($(TARGET_RPI),1) # Define RPi to change SDL2 title & GLES2 hints
VERSION_CFLAGS += -DUSE_GLES VERSION_CFLAGS += -DUSE_GLES
endif endif
ifeq ($(OSX_BUILD),1) # Modify GFX & SDL2 for OSX GL
VERSION_CFLAGS += -DOSX_BUILD
endif
VERSION_ASFLAGS := --defsym AVOID_UB=1 VERSION_ASFLAGS := --defsym AVOID_UB=1
COMPARE := 0 COMPARE := 0
@ -167,7 +172,7 @@ endif
endif endif
# Make tools if out of date # Make tools if out of date
DUMMY != make -s -C tools >&2 || echo FAIL DUMMY != make -C tools >&2 || echo FAIL
ifeq ($(DUMMY),FAIL) ifeq ($(DUMMY),FAIL)
$(error Failed to build tools) $(error Failed to build tools)
endif endif
@ -228,10 +233,6 @@ GODDARD_SRC_DIRS := src/goddard src/goddard/dynlists
MIPSISET := -mips2 MIPSISET := -mips2
MIPSBIT := -32 MIPSBIT := -32
ifeq ($(COMPILER),gcc)
MIPSISET := -mips3
endif
ifeq ($(VERSION),eu) ifeq ($(VERSION),eu)
OPT_FLAGS := -O2 OPT_FLAGS := -O2
else else
@ -250,9 +251,8 @@ ifeq ($(TARGET_WEB),1)
endif endif
# Use a default opt flag for gcc, then override if RPi # Use a default opt flag for gcc, then override if RPi
ifeq ($(COMPILER),gcc) # OPT_FLAGS := -O2 # -O2 opt breaks sound on x86?
OPT_FLAGS := -O2 # Breaks sound on x86?
endif
ifeq ($(TARGET_RPI),1) ifeq ($(TARGET_RPI),1)
machine = $(shell sh -c 'uname -m 2>/dev/null || echo unknown') machine = $(shell sh -c 'uname -m 2>/dev/null || echo unknown')
@ -415,6 +415,10 @@ ENDIAN_BITWIDTH := $(BUILD_DIR)/endian-and-bitwidth
AS := as AS := as
ifeq ($(OSX_BUILD),1)
AS := i686-w64-mingw32-as
endif
ifneq ($(TARGET_WEB),1) # As in, not-web PC port ifneq ($(TARGET_WEB),1) # As in, not-web PC port
CC := $(CROSS)gcc CC := $(CROSS)gcc
CXX := $(CROSS)g++ CXX := $(CROSS)g++
@ -431,11 +435,19 @@ endif
ifeq ($(WINDOWS_BUILD),1) # fixes compilation in MXE on Linux and WSL ifeq ($(WINDOWS_BUILD),1) # fixes compilation in MXE on Linux and WSL
CPP := cpp -P CPP := cpp -P
OBJCOPY := objcopy OBJCOPY := objcopy
OBJDUMP := $(CROSS)objdump
else else
ifeq ($(OSX_BUILD),1)
CPP := cpp-9 -P
OBJDUMP := i686-w64-mingw32-objdump
OBJCOPY := i686-w64-mingw32-objcopy
else # Linux & other builds
CPP := $(CROSS)cpp -P CPP := $(CROSS)cpp -P
OBJCOPY := $(CROSS)objcopy OBJCOPY := $(CROSS)objcopy
OBJDUMP := $(CROSS)objdump
endif endif
OBJDUMP := $(CROSS)objdump endif
PYTHON := python3 PYTHON := python3
SDLCONFIG := $(CROSS)sdl2-config SDLCONFIG := $(CROSS)sdl2-config
@ -498,9 +510,12 @@ else ifeq ($(TARGET_RPI),1)
# Linux / Other builds below # Linux / Other builds below
LDFLAGS := $(OPT_FLAGS) -lm -lGLESv2 `$(SDLCONFIG) --libs` -no-pie LDFLAGS := $(OPT_FLAGS) -lm -lGLESv2 `$(SDLCONFIG) --libs` -no-pie
else else
ifeq ($(OSX_BUILD),1)
LDFLAGS := -lm -framework OpenGL `$(SDLCONFIG) --libs` -no-pie -lpthread `pkg-config --libs libusb-1.0 glfw3 glew`
else
LDFLAGS := $(BITS) -march=$(TARGET_ARCH) -lm -lGL `$(SDLCONFIG) --libs` -no-pie -lpthread LDFLAGS := $(BITS) -march=$(TARGET_ARCH) -lm -lGL `$(SDLCONFIG) --libs` -no-pie -lpthread
endif endif
endif # End of LDFLAGS
# Prevent a crash with -sopt # Prevent a crash with -sopt
export LANG := C export LANG := C
@ -711,7 +726,6 @@ $(BUILD_DIR)/assets/mario_anim_data.c: $(wildcard assets/anims/*.inc.c)
$(BUILD_DIR)/assets/demo_data.c: assets/demo_data.json $(wildcard assets/demos/*.bin) $(BUILD_DIR)/assets/demo_data.c: assets/demo_data.json $(wildcard assets/demos/*.bin)
$(PYTHON) tools/demo_data_converter.py assets/demo_data.json $(VERSION_CFLAGS) > $@ $(PYTHON) tools/demo_data_converter.py assets/demo_data.json $(VERSION_CFLAGS) > $@
ifeq ($(COMPILER),ido)
# Source code # Source code
$(BUILD_DIR)/levels/%/leveldata.o: OPT_FLAGS := -g $(BUILD_DIR)/levels/%/leveldata.o: OPT_FLAGS := -g
$(BUILD_DIR)/actors/%.o: OPT_FLAGS := -g $(BUILD_DIR)/actors/%.o: OPT_FLAGS := -g
@ -753,8 +767,6 @@ $(BUILD_DIR)/src/audio/%.acpp: src/audio/%.c
$(BUILD_DIR)/src/audio/%.copt: $(BUILD_DIR)/src/audio/%.acpp $(BUILD_DIR)/src/audio/%.copt: $(BUILD_DIR)/src/audio/%.acpp
$(QEMU_IRIX) -silent -L $(IRIX_ROOT) $(IRIX_ROOT)/usr/lib/copt -signed -I=$< -CMP=$@ -cp=i -scalaroptimize=1 $(QEMU_IRIX) -silent -L $(IRIX_ROOT) $(IRIX_ROOT)/usr/lib/copt -signed -I=$< -CMP=$@ -cp=i -scalaroptimize=1
endif endif
endif
# Rebuild files with 'GLOBAL_ASM' if the NON_MATCHING flag changes. # Rebuild files with 'GLOBAL_ASM' if the NON_MATCHING flag changes.
$(GLOBAL_ASM_O_FILES): $(GLOBAL_ASM_DEP).$(NON_MATCHING) $(GLOBAL_ASM_O_FILES): $(GLOBAL_ASM_DEP).$(NON_MATCHING)

View File

@ -3,8 +3,13 @@
#include "ultratypes.h" #include "ultratypes.h"
#ifdef OSX_BUILD
#include <strings.h> // OSX doesn't like it not being included?
#else
// Old deprecated functions from strings.h, replaced by memcpy/memset. // Old deprecated functions from strings.h, replaced by memcpy/memset.
extern void bcopy(const void *, void *, size_t); extern void bcopy(const void *, void *, size_t);
extern void bzero(void *, size_t); extern void bzero(void *, size_t);
#endif
#endif /* !_OS_LIBC_H_ */ #endif /* !_OS_LIBC_H_ */

View File

@ -1,6 +1,7 @@
#include "libultra_internal.h" #include "libultra_internal.h"
#include <stdlib.h> #include <stdlib.h>
#ifndef OSX_BUILD
lldiv_t lldiv(long long num, long long denom) { lldiv_t lldiv(long long num, long long denom) {
lldiv_t ret; lldiv_t ret;
@ -13,6 +14,7 @@ lldiv_t lldiv(long long num, long long denom) {
return ret; return ret;
} }
#endif // OSX_BUILD cannot use this
ldiv_t ldiv(long num, long denom) { ldiv_t ldiv(long num, long denom) {
ldiv_t ret; ldiv_t ret;

View File

@ -33,6 +33,7 @@ static const du pilo = {
static const fu zero = {0.0}; static const fu zero = {0.0};
extern const fu NAN; extern const fu NAN;
#ifndef OSX_BUILD
float cosf(float x) float cosf(float x)
{ {
double dx; // double x double dx; // double x
@ -92,3 +93,5 @@ float cosf(float x)
return zero.f; return zero.f;
} }
#endif // OSX_BUILD cannot use this

View File

@ -18,12 +18,19 @@
#include <SDL2/SDL.h> #include <SDL2/SDL.h>
#define GL_GLEXT_PROTOTYPES 1 #define GL_GLEXT_PROTOTYPES 1
#include <SDL2/SDL_opengl.h> #include <SDL2/SDL_opengl.h>
#else #else
#include <SDL2/SDL.h> #include <SDL2/SDL.h>
#define GL_GLEXT_PROTOTYPES 1 #define GL_GLEXT_PROTOTYPES 1
#ifdef OSX_BUILD
#include <SDL2/SDL_opengl.h>
#else
#include <SDL2/SDL_opengles2.h> #include <SDL2/SDL_opengles2.h>
#endif #endif
#endif
#include "gfx_cc.h" #include "gfx_cc.h"
#include "gfx_rendering_api.h" #include "gfx_rendering_api.h"
@ -49,7 +56,7 @@ static bool gfx_opengl_z_is_from_0_to_1(void) {
static void gfx_opengl_vertex_array_set_attribs(struct ShaderProgram *prg) { static void gfx_opengl_vertex_array_set_attribs(struct ShaderProgram *prg) {
size_t num_floats = prg->num_floats; size_t num_floats = prg->num_floats;
size_t pos = 0; size_t pos = 0;
for (int i = 0; i < prg->num_attribs; i++) { for (int i = 0; i < prg->num_attribs; i++) {
glEnableVertexAttribArray(prg->attrib_locations[i]); glEnableVertexAttribArray(prg->attrib_locations[i]);
glVertexAttribPointer(prg->attrib_locations[i], prg->attrib_sizes[i], GL_FLOAT, GL_FALSE, num_floats * sizeof(float), (void *)(pos * sizeof(float))); glVertexAttribPointer(prg->attrib_locations[i], prg->attrib_sizes[i], GL_FLOAT, GL_FALSE, num_floats * sizeof(float), (void *)(pos * sizeof(float)));
@ -179,15 +186,19 @@ static struct ShaderProgram *gfx_opengl_create_and_load_new_shader(uint32_t shad
bool do_multiply[2] = {c[0][1] == 0 && c[0][3] == 0, c[1][1] == 0 && c[1][3] == 0}; bool do_multiply[2] = {c[0][1] == 0 && c[0][3] == 0, c[1][1] == 0 && c[1][3] == 0};
bool do_mix[2] = {c[0][1] == c[0][3], c[1][1] == c[1][3]}; bool do_mix[2] = {c[0][1] == c[0][3], c[1][1] == c[1][3]};
bool color_alpha_same = (shader_id & 0xfff) == ((shader_id >> 12) & 0xfff); bool color_alpha_same = (shader_id & 0xfff) == ((shader_id >> 12) & 0xfff);
char vs_buf[1024]; char vs_buf[1024];
char fs_buf[1024]; char fs_buf[1024];
size_t vs_len = 0; size_t vs_len = 0;
size_t fs_len = 0; size_t fs_len = 0;
size_t num_floats = 4; size_t num_floats = 4;
// Vertex shader // Vertex shader
#ifdef OSX_BUILD
append_line(vs_buf, &vs_len, "");
#else
append_line(vs_buf, &vs_len, "#version 100"); append_line(vs_buf, &vs_len, "#version 100");
#endif
append_line(vs_buf, &vs_len, "attribute vec4 aVtxPos;"); append_line(vs_buf, &vs_len, "attribute vec4 aVtxPos;");
if (used_textures[0] || used_textures[1]) { if (used_textures[0] || used_textures[1]) {
append_line(vs_buf, &vs_len, "attribute vec2 aTexCoord;"); append_line(vs_buf, &vs_len, "attribute vec2 aTexCoord;");
@ -216,10 +227,15 @@ static struct ShaderProgram *gfx_opengl_create_and_load_new_shader(uint32_t shad
} }
append_line(vs_buf, &vs_len, "gl_Position = aVtxPos;"); append_line(vs_buf, &vs_len, "gl_Position = aVtxPos;");
append_line(vs_buf, &vs_len, "}"); append_line(vs_buf, &vs_len, "}");
// Fragment shader // Fragment shader
#ifdef OSX_BUILD
append_line(fs_buf, &fs_len, "");
#else
append_line(fs_buf, &fs_len, "#version 100"); append_line(fs_buf, &fs_len, "#version 100");
append_line(fs_buf, &fs_len, "precision mediump float;"); append_line(fs_buf, &fs_len, "precision mediump float;");
#endif
if (used_textures[0] || used_textures[1]) { if (used_textures[0] || used_textures[1]) {
append_line(fs_buf, &fs_len, "varying vec2 vTexCoord;"); append_line(fs_buf, &fs_len, "varying vec2 vTexCoord;");
} }
@ -464,7 +480,11 @@ static void gfx_opengl_init(void) {
#if FOR_WINDOWS #if FOR_WINDOWS
glewInit(); glewInit();
#endif #endif
#ifdef OSX_BUILD
glewInit();
#endif
glGenBuffers(1, &opengl_vbo); glGenBuffers(1, &opengl_vbo);
glBindBuffer(GL_ARRAY_BUFFER, opengl_vbo); glBindBuffer(GL_ARRAY_BUFFER, opengl_vbo);

View File

@ -13,9 +13,15 @@
#else #else
#include <SDL2/SDL.h> #include <SDL2/SDL.h>
#define GL_GLEXT_PROTOTYPES 1 #define GL_GLEXT_PROTOTYPES 1
#ifdef OSX_BUILD
#include <SDL2/SDL_opengl.h>
#else
#include <SDL2/SDL_opengles2.h> #include <SDL2/SDL_opengles2.h>
#endif #endif
#endif // End of OS-Specific GL defines
#include "gfx_window_manager_api.h" #include "gfx_window_manager_api.h"
#include "gfx_screen_config.h" #include "gfx_screen_config.h"
#include "../configfile.h" #include "../configfile.h"
@ -30,7 +36,7 @@ static bool cur_fullscreen;
static uint32_t cur_width, cur_height; static uint32_t cur_width, cur_height;
const SDL_Scancode windows_scancode_table[] = const SDL_Scancode windows_scancode_table[] =
{ {
/* 0 1 2 3 4 5 6 7 */ /* 0 1 2 3 4 5 6 7 */
/* 8 9 A B C D E F */ /* 8 9 A B C D E F */
SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_ESCAPE, SDL_SCANCODE_1, SDL_SCANCODE_2, SDL_SCANCODE_3, SDL_SCANCODE_4, SDL_SCANCODE_5, SDL_SCANCODE_6, /* 0 */ SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_ESCAPE, SDL_SCANCODE_1, SDL_SCANCODE_2, SDL_SCANCODE_3, SDL_SCANCODE_4, SDL_SCANCODE_5, SDL_SCANCODE_6, /* 0 */
@ -53,7 +59,7 @@ const SDL_Scancode windows_scancode_table[] =
SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_F13, SDL_SCANCODE_F14, SDL_SCANCODE_F15, SDL_SCANCODE_F16, /* 6 */ SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_F13, SDL_SCANCODE_F14, SDL_SCANCODE_F15, SDL_SCANCODE_F16, /* 6 */
SDL_SCANCODE_F17, SDL_SCANCODE_F18, SDL_SCANCODE_F19, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, /* 6 */ SDL_SCANCODE_F17, SDL_SCANCODE_F18, SDL_SCANCODE_F19, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, /* 6 */
SDL_SCANCODE_INTERNATIONAL2, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_INTERNATIONAL1, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, /* 7 */ SDL_SCANCODE_INTERNATIONAL2, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_INTERNATIONAL1, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, /* 7 */
SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_INTERNATIONAL4, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_INTERNATIONAL5, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_INTERNATIONAL3, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN /* 7 */ SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_INTERNATIONAL4, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_INTERNATIONAL5, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_INTERNATIONAL3, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN /* 7 */
}; };
@ -98,16 +104,16 @@ static void gfx_sdl_init(void) {
Uint32 window_flags = 0; Uint32 window_flags = 0;
SDL_Init(SDL_INIT_VIDEO); SDL_Init(SDL_INIT_VIDEO);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
#ifdef USE_GLES #ifdef USE_GLES
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); // These attributes allow for hardware acceleration on RPis. SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); // These attributes allow for hardware acceleration on RPis.
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
#endif #endif
//SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1); //SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
//SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4); //SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4);
@ -122,9 +128,9 @@ static void gfx_sdl_init(void) {
} }
SDL_DisplayMode sdl_displaymode; SDL_DisplayMode sdl_displaymode;
SDL_GetCurrentDisplayMode(0, &sdl_displaymode); SDL_GetCurrentDisplayMode(0, &sdl_displaymode);
const char* window_title = const char* window_title =
#ifndef USE_GLES #ifndef USE_GLES
"Super Mario 64 PC port (OpenGL)"; "Super Mario 64 PC port (OpenGL)";
#else #else
@ -140,10 +146,10 @@ static void gfx_sdl_init(void) {
DESIRED_SCREEN_WIDTH, DESIRED_SCREEN_HEIGHT, window_flags); DESIRED_SCREEN_WIDTH, DESIRED_SCREEN_HEIGHT, window_flags);
SDL_ShowCursor(SDL_ENABLE); SDL_ShowCursor(SDL_ENABLE);
} }
SDL_GL_CreateContext(wnd); SDL_GL_CreateContext(wnd);
SDL_GL_SetSwapInterval(1); // We have a double buffered GL context, it makes no sense to want tearing. SDL_GL_SetSwapInterval(1); // We have a double buffered GL context, it makes no sense to want tearing.
for (size_t i = 0; i < sizeof(windows_scancode_table) / sizeof(SDL_Scancode); i++) { for (size_t i = 0; i < sizeof(windows_scancode_table) / sizeof(SDL_Scancode); i++) {
inverted_scancode_table[windows_scancode_table[i]] = i; inverted_scancode_table[windows_scancode_table[i]] = i;
} }

View File

@ -1,5 +1,10 @@
UNAME := $(shell uname)
ifeq ($(UNAME),Darwin)
OSX_BUILD := -DOSX_BUILD
endif
CC := gcc CC := gcc
CFLAGS := -Llib -Iinclude -I . -Wall -Wextra -Wno-unused-parameter -pedantic -std=c99 -O3 -s CFLAGS := -Llib -Iinclude -I . -Wall -Wextra -Wno-unused-parameter $(OSX_BUILD) -pedantic -std=c99 -O3 -s
PROGRAMS := n64graphics n64graphics_ci mio0 n64cksum textconv patch_libultra_math iplfontutil aifc_decode aiff_extract_codebook vadpcm_enc tabledesign extract_data_for_mio skyconv PROGRAMS := n64graphics n64graphics_ci mio0 n64cksum textconv patch_libultra_math iplfontutil aifc_decode aiff_extract_codebook vadpcm_enc tabledesign extract_data_for_mio skyconv
n64graphics_SOURCES := n64graphics.c utils.c n64graphics_SOURCES := n64graphics.c utils.c
@ -43,7 +48,7 @@ clean:
define COMPILE define COMPILE
$(1): $($1_SOURCES) $(1): $($1_SOURCES)
$(CC) $(CFLAGS) $$^ -lm -o $$@ $($1_CFLAGS) $(CC) $(CFLAGS) $(OSX_BUILD) $$^ -lm -o $$@ $($1_CFLAGS)
endef endef
$(foreach p,$(PROGRAMS),$(eval $(call COMPILE,$(p)))) $(foreach p,$(PROGRAMS),$(eval $(call COMPILE,$(p))))

View File

@ -23,7 +23,11 @@ SOFTWARE.
*/ */
#include "exoquant.h" #include "exoquant.h"
#ifndef OSX_BUILD // OSX build cannot have malloc defined
#include <malloc.h> #include <malloc.h>
#endif
#include <math.h> #include <math.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
@ -705,4 +709,4 @@ exq_float exq_sort_by_dir(const exq_histogram *pHist)
pHist->color.g * exq_sort_dir.g + pHist->color.g * exq_sort_dir.g +
pHist->color.b * exq_sort_dir.b + pHist->color.b * exq_sort_dir.b +
pHist->color.a * exq_sort_dir.a; pHist->color.a * exq_sort_dir.a;
} }