@@ -1,30 +1,22 @@ | |||||
ARCH ?= linux | |||||
CFLAGS = -MMD -g -Wall -O2 | |||||
CXXFLAGS = -MMD -g -Wall -std=c++11 -O3 -msse -mfpmath=sse -ffast-math -fno-exceptions \ | |||||
ARCH ?= lin | |||||
FLAGS = -g -Wall -O3 -msse -mfpmath=sse -ffast-math \ | |||||
-I./ext -I./include | -I./ext -I./include | ||||
LDFLAGS = | |||||
CXXFLAGS = -fno-exceptions | |||||
SOURCES = $(wildcard src/*.cpp src/*/*.cpp) \ | SOURCES = $(wildcard src/*.cpp src/*/*.cpp) \ | ||||
ext/nanovg/src/nanovg.c | ext/nanovg/src/nanovg.c | ||||
# Linux | |||||
ifeq ($(ARCH), linux) | |||||
CC = gcc | |||||
CXX = g++ | |||||
ifeq ($(ARCH), lin) | |||||
SOURCES += ext/noc/noc_file_dialog.c | SOURCES += ext/noc/noc_file_dialog.c | ||||
CFLAGS += -DNOC_FILE_DIALOG_GTK $(shell pkg-config --cflags gtk+-2.0) | CFLAGS += -DNOC_FILE_DIALOG_GTK $(shell pkg-config --cflags gtk+-2.0) | ||||
CXXFLAGS += -DLINUX | |||||
LDFLAGS += -rdynamic \ | LDFLAGS += -rdynamic \ | ||||
-lpthread -lGL -lGLEW -lglfw -ldl -ljansson -lportaudio -lportmidi -lsamplerate \ | -lpthread -lGL -lGLEW -lglfw -ldl -ljansson -lportaudio -lportmidi -lsamplerate \ | ||||
$(shell pkg-config --libs gtk+-2.0) | $(shell pkg-config --libs gtk+-2.0) | ||||
TARGET = Rack | TARGET = Rack | ||||
endif | endif | ||||
# Apple | |||||
ifeq ($(ARCH), apple) | |||||
CC = clang | |||||
CXX = clang++ | |||||
ifeq ($(ARCH), mac) | |||||
SOURCES += ext/noc/noc_file_dialog.m | SOURCES += ext/noc/noc_file_dialog.m | ||||
CFLAGS += -DNOC_FILE_DIALOG_OSX | CFLAGS += -DNOC_FILE_DIALOG_OSX | ||||
CXXFLAGS += -DAPPLE -stdlib=libc++ -I$(HOME)/local/include | CXXFLAGS += -DAPPLE -stdlib=libc++ -I$(HOME)/local/include | ||||
@@ -32,13 +24,10 @@ LDFLAGS += -stdlib=libc++ -L$(HOME)/local/lib -lpthread -lglew -lglfw3 -framewor | |||||
TARGET = Rack | TARGET = Rack | ||||
endif | endif | ||||
# Windows | |||||
ifeq ($(ARCH), windows) | |||||
CC = x86_64-w64-mingw32-gcc | |||||
CXX = x86_64-w64-mingw32-g++ | |||||
ifeq ($(ARCH), win) | |||||
SOURCES += ext/noc/noc_file_dialog.c | SOURCES += ext/noc/noc_file_dialog.c | ||||
CFLAGS += -DNOC_FILE_DIALOG_WIN32 | CFLAGS += -DNOC_FILE_DIALOG_WIN32 | ||||
CXXFLAGS += -DWINDOWS -D_USE_MATH_DEFINES -DGLEW_STATIC \ | |||||
CXXFLAGS += -DGLEW_STATIC \ | |||||
-I$(HOME)/pkg/portaudio-r1891-build/include | -I$(HOME)/pkg/portaudio-r1891-build/include | ||||
LDFLAGS += \ | LDFLAGS += \ | ||||
-Wl,-Bstatic,--whole-archive \ | -Wl,-Bstatic,--whole-archive \ | ||||
@@ -1,4 +1,31 @@ | |||||
FLAGS += -MMD | |||||
CXXFLAGS += -std=c++11 | |||||
ifeq ($(ARCH), lin) | |||||
CC ?= gcc | |||||
CXX ?= g++ | |||||
FLAGS += -DLINUX | |||||
endif | |||||
ifeq ($(ARCH), mac) | |||||
CC ?= clang | |||||
CXX ?= clang++ | |||||
FLAGS += -DAPPLE | |||||
CXXFLAGS += -stdlib=libc++ | |||||
LDFLAGS += -stdlib=libc++ | |||||
endif | |||||
ifeq ($(ARCH), win) | |||||
CC ?= x86_64-w64-mingw32-gcc | |||||
CXX ?= x86_64-w64-mingw32-g++ | |||||
FLAGS += -DWINDOWS -D_USE_MATH_DEFINES | |||||
endif | |||||
CFLAGS := $(FLAGS) $(CFLAGS) | |||||
CXXFLAGS := $(FLAGS) $(CXXFLAGS) | |||||
OBJECTS += $(patsubst %, build/%.o, $(SOURCES)) | OBJECTS += $(patsubst %, build/%.o, $(SOURCES)) | ||||
DEPS = $(patsubst %, build/%.d, $(SOURCES)) | DEPS = $(patsubst %, build/%.d, $(SOURCES)) | ||||
@@ -5,59 +5,84 @@ | |||||
namespace rack { | namespace rack { | ||||
//////////////////// | //////////////////// | ||||
// knobs | |||||
// Knobs | |||||
//////////////////// | //////////////////// | ||||
struct KnobDavies1900h : SpriteKnob { | struct KnobDavies1900h : SpriteKnob { | ||||
KnobDavies1900h() { | KnobDavies1900h() { | ||||
// box.size = Vec(36, 36); | |||||
// spriteOffset = Vec(-8, -8); | |||||
// spriteSize = Vec(64, 64); | |||||
// minIndex = 44; | |||||
// maxIndex = -46; | |||||
// spriteCount = 120; | |||||
box.size = Vec(42, 42); | |||||
spriteOffset = Vec(-9, -9); | |||||
spriteSize = Vec(60, 60); | |||||
minIndex = 0; | |||||
maxIndex = 119; | |||||
box.size = Vec(36, 36); | |||||
spriteOffset = Vec(-2, -2); | |||||
spriteSize = Vec(42, 42); | |||||
minIndex = 44; | |||||
maxIndex = -46; | |||||
spriteCount = 120; | spriteCount = 120; | ||||
spriteImage = Image::load("res/Black Plastic small 01.png"); | |||||
} | } | ||||
}; | }; | ||||
struct KnobDavies1900hWhite : KnobDavies1900h { | struct KnobDavies1900hWhite : KnobDavies1900h { | ||||
KnobDavies1900hWhite() { | KnobDavies1900hWhite() { | ||||
// spriteImage = Image::load("res/ComponentLibrary/Davies1900hWhite.png"); | |||||
spriteImage = Image::load("res/ComponentLibrary/Davies1900hWhite.png"); | |||||
} | } | ||||
}; | }; | ||||
struct KnobDavies1900hBlack : KnobDavies1900h { | struct KnobDavies1900hBlack : KnobDavies1900h { | ||||
KnobDavies1900hBlack() { | KnobDavies1900hBlack() { | ||||
// spriteImage = Image::load("res/ComponentLibrary/Davies1900hBlack.png"); | |||||
spriteImage = Image::load("res/ComponentLibrary/Davies1900hBlack.png"); | |||||
} | } | ||||
}; | }; | ||||
struct KnobDavies1900hRed : KnobDavies1900h { | struct KnobDavies1900hRed : KnobDavies1900h { | ||||
KnobDavies1900hRed() { | KnobDavies1900hRed() { | ||||
// spriteImage = Image::load("res/ComponentLibrary/Davies1900hRed.png"); | |||||
spriteImage = Image::load("res/ComponentLibrary/Davies1900hRed.png"); | |||||
} | |||||
}; | |||||
struct BefacoBigKnob : SpriteKnob { | |||||
BefacoBigKnob() { | |||||
box.size = Vec(75, 75); | |||||
spriteOffset = Vec(-2, -2); | |||||
spriteSize = Vec(81, 81); | |||||
minIndex = 44; | |||||
maxIndex = -46; | |||||
spriteCount = 120; | |||||
spriteImage = Image::load("res/ComponentLibrary/BefacoBigKnob.png"); | |||||
} | |||||
}; | |||||
struct BefacoTinyKnob : SpriteKnob { | |||||
BefacoTinyKnob() { | |||||
box.size = Vec(26, 26); | |||||
spriteOffset = Vec(-2, -2); | |||||
spriteSize = Vec(32, 32); | |||||
minIndex = 44; | |||||
maxIndex = -46; | |||||
spriteCount = 120; | |||||
spriteImage = Image::load("res/ComponentLibrary/BefacoTinyKnob.png"); | |||||
} | |||||
}; | |||||
struct BefacoSlidePot : SpriteKnob { | |||||
BefacoSlidePot() { | |||||
box.size = Vec(12, 122); | |||||
spriteOffset = Vec(-2, -6); | |||||
spriteSize = Vec(18, 134); | |||||
minIndex = 97; | |||||
maxIndex = 0; | |||||
spriteCount = 98; | |||||
spriteImage = Image::load("res/ComponentLibrary/BefacoSlidePot.png"); | |||||
} | } | ||||
}; | }; | ||||
//////////////////// | //////////////////// | ||||
// ports | |||||
// Jacks | |||||
//////////////////// | //////////////////// | ||||
struct PJ301M : SpriteWidget { | struct PJ301M : SpriteWidget { | ||||
PJ301M() { | PJ301M() { | ||||
// box.size = Vec(24, 24); | |||||
// spriteOffset = Vec(-10, -10); | |||||
// spriteSize = Vec(48, 48); | |||||
// spriteImage = Image::load("res/ComponentLibrary/PJ301M.png"); | |||||
box.size = Vec(26, 26); | |||||
spriteOffset = Vec(-16, -16); | |||||
spriteSize = Vec(56, 56); | |||||
spriteImage = Image::load("res/port.png"); | |||||
box.size = Vec(24, 24); | |||||
spriteOffset = Vec(-2, -2); | |||||
spriteSize = Vec(30, 30); | |||||
spriteImage = Image::load("res/ComponentLibrary/PJ301M.png"); | |||||
} | } | ||||
}; | }; | ||||
struct InputPortPJ301M : InputPort, PJ301M {}; | struct InputPortPJ301M : InputPort, PJ301M {}; | ||||
@@ -65,14 +90,10 @@ struct OutputPortPJ301M: OutputPort, PJ301M {}; | |||||
struct PJ3410 : SpriteWidget { | struct PJ3410 : SpriteWidget { | ||||
PJ3410() { | PJ3410() { | ||||
// box.size = Vec(31, 31); | |||||
// spriteOffset = Vec(-9, -9); | |||||
// spriteSize = Vec(54, 54); | |||||
// spriteImage = Image::load("res/ComponentLibrary/PJ3410.png"); | |||||
box.size = Vec(26, 26); | |||||
spriteOffset = Vec(-12, -12); | |||||
spriteSize = Vec(56, 56); | |||||
spriteImage = Image::load("res/port.png"); | |||||
box.size = Vec(32, 32); | |||||
spriteOffset = Vec(-1, -1); | |||||
spriteSize = Vec(36, 36); | |||||
spriteImage = Image::load("res/ComponentLibrary/PJ3410.png"); | |||||
} | } | ||||
}; | }; | ||||
struct InputPortPJ3410 : InputPort, PJ3410 {}; | struct InputPortPJ3410 : InputPort, PJ3410 {}; | ||||
@@ -80,25 +101,40 @@ struct OutputPortPJ3410: OutputPort, PJ3410 {}; | |||||
struct CL1362 : SpriteWidget { | struct CL1362 : SpriteWidget { | ||||
CL1362() { | CL1362() { | ||||
// box.size = Vec(33, 29); | |||||
// spriteOffset = Vec(-10, -10); | |||||
// spriteSize = Vec(57, 54); | |||||
// spriteImage = Image::load("res/ComponentLibrary/CL1362.png"); | |||||
box.size = Vec(26, 26); | |||||
spriteOffset = Vec(-12, -12); | |||||
spriteSize = Vec(56, 56); | |||||
spriteImage = Image::load("res/port.png"); | |||||
box.size = Vec(33, 29); | |||||
spriteOffset = Vec(-2, -2); | |||||
spriteSize = Vec(39, 36); | |||||
spriteImage = Image::load("res/ComponentLibrary/CL1362.png"); | |||||
} | } | ||||
}; | }; | ||||
struct InputPortCL1362 : InputPort, CL1362 {}; | struct InputPortCL1362 : InputPort, CL1362 {}; | ||||
struct OutputPortCL1362 : OutputPort, CL1362 {}; | struct OutputPortCL1362 : OutputPort, CL1362 {}; | ||||
//////////////////// | //////////////////// | ||||
// panels | |||||
// Misc | |||||
//////////////////// | //////////////////// | ||||
/** If you don't add these to your ModuleWidget, it will fall out of the rack... */ | |||||
struct Screw : SpriteWidget { | |||||
Screw() { | |||||
box.size = Vec(15, 14); | |||||
spriteOffset = Vec(0, 0); | |||||
spriteSize = Vec(15, 14); | |||||
} | |||||
}; | |||||
struct BlackScrew : Screw { | |||||
BlackScrew() { | |||||
spriteImage = Image::load("res/ComponentLibrary/ScrewBlack.png"); | |||||
} | |||||
}; | |||||
struct SilverScrew : Screw { | |||||
SilverScrew() { | |||||
spriteImage = Image::load("res/ComponentLibrary/ScrewSilver.png"); | |||||
} | |||||
}; | |||||
struct LightPanel : Panel { | struct LightPanel : Panel { | ||||
LightPanel() { | LightPanel() { | ||||
backgroundColor = nvgRGB(0xe8, 0xe8, 0xe8); | backgroundColor = nvgRGB(0xe8, 0xe8, 0xe8); | ||||
@@ -61,9 +61,9 @@ OutputPort *createOutput(Vec pos, Module *module, int outputId) { | |||||
return port; | return port; | ||||
} | } | ||||
inline | |||||
template <class TScrew> | |||||
Screw *createScrew(Vec pos) { | Screw *createScrew(Vec pos) { | ||||
Screw *screw = new Screw(); | |||||
Screw *screw = new TScrew(); | |||||
screw->box.pos = pos; | screw->box.pos = pos; | ||||
return screw; | return screw; | ||||
} | } | ||||
@@ -104,16 +104,11 @@ struct Panel : TransparentWidget { | |||||
// params | // params | ||||
//////////////////// | //////////////////// | ||||
struct Light : TransparentWidget, SpriteWidget { | |||||
struct Light : TransparentWidget { | |||||
NVGcolor color; | NVGcolor color; | ||||
void draw(NVGcontext *vg); | void draw(NVGcontext *vg); | ||||
}; | }; | ||||
// If you don't add these to your ModuleWidget, it will fall out of the RackWidget | |||||
struct Screw : TransparentWidget { | |||||
Screw(); | |||||
}; | |||||
struct ParamWidget : OpaqueWidget, QuantityWidget { | struct ParamWidget : OpaqueWidget, QuantityWidget { | ||||
Module *module = NULL; | Module *module = NULL; | ||||
int paramId; | int paramId; | ||||
@@ -69,8 +69,10 @@ struct Widget { | |||||
Gives ownership of widget to this widget instance. | Gives ownership of widget to this widget instance. | ||||
*/ | */ | ||||
void addChild(Widget *widget); | void addChild(Widget *widget); | ||||
// Does not delete widget but transfers ownership to caller | |||||
// Silenty fails if widget is not a child | |||||
/** Removes widget from list of children if it exists. | |||||
Does not delete widget but transfers ownership to caller | |||||
Silently fails if widget is not a child | |||||
*/ | |||||
void removeChild(Widget *widget); | void removeChild(Widget *widget); | ||||
void clearChildren(); | void clearChildren(); | ||||
@@ -3,37 +3,35 @@ | |||||
namespace rack { | namespace rack { | ||||
void Light::draw(NVGcontext *vg) { | |||||
SpriteWidget::draw(vg); | |||||
if (color.a == 0.0) | |||||
return; | |||||
// Draw glow | |||||
void Light::draw(NVGcontext *vg) { | |||||
NVGcolor colorOutline = nvgLerpRGBA(color, nvgRGBf(0.0, 0.0, 0.0), 0.5); | |||||
Vec c = box.getCenter(); | Vec c = box.getCenter(); | ||||
float radius = box.size.x / 2.0; | |||||
NVGcolor icol, ocol; | |||||
NVGpaint paint; | |||||
// Inner glow | |||||
icol = nvgRGBf(1.0, 1.0, 1.0); | |||||
icol.a = clampf(color.a, 0.0, 1.0); | |||||
ocol = color; | |||||
ocol.a = clampf(color.a, 0.0, 1.0); | |||||
paint = nvgRadialGradient(vg, c.x+1, c.y+3, 0.0, radius, icol, ocol); | |||||
nvgFillPaint(vg, paint); | |||||
Vec r = box.size.div(2.0); | |||||
nvgBeginPath(vg); | nvgBeginPath(vg); | ||||
nvgCircle(vg, c.x, c.y, radius); | |||||
nvgEllipse(vg, c.x, c.y, r.x, r.y); | |||||
nvgFillColor(vg, colorOutline); | |||||
nvgFill(vg); | nvgFill(vg); | ||||
// Outer glow | |||||
icol = color; | |||||
icol.a = clampf(color.a / 10.0, 0.0, 1.0); | |||||
ocol = color; | |||||
ocol.a = 0.0; | |||||
float oradius = radius + 20.0; | |||||
paint = nvgRadialGradient(vg, c.x, c.y, radius, oradius, icol, ocol); | |||||
nvgFillPaint(vg, paint); | |||||
nvgBeginPath(vg); | nvgBeginPath(vg); | ||||
nvgRect(vg, c.x - oradius, c.y - oradius, 2*oradius, 2*oradius); | |||||
nvgEllipse(vg, c.x, c.y, r.x - 1.0, r.y - 1.0); | |||||
nvgFillColor(vg, color); | |||||
nvgFill(vg); | nvgFill(vg); | ||||
// float radius = box.size.x / 2.0; | |||||
// NVGcolor icol, ocol; | |||||
// NVGpaint paint; | |||||
// icol = color; | |||||
// icol.a = clampf(color.a / 10.0, 0.0, 1.0); | |||||
// ocol = color; | |||||
// ocol.a = 0.0; | |||||
// float oradius = radius + 20.0; | |||||
// paint = nvgRadialGradient(vg, c.x, c.y, radius, oradius, icol, ocol); | |||||
// nvgFillPaint(vg, paint); | |||||
// nvgBeginPath(vg); | |||||
// nvgRect(vg, c.x - oradius, c.y - oradius, 2*oradius, 2*oradius); | |||||
// nvgFill(vg); | |||||
} | } | ||||
@@ -1,16 +0,0 @@ | |||||
#include "scene.hpp" | |||||
namespace rack { | |||||
Screw::Screw() { | |||||
// box.size = Vec(15, 15); | |||||
// spriteOffset = Vec(-7, -7); | |||||
// spriteSize = Vec(29, 29); | |||||
// spriteImage = Image::load("res/screw.png"); | |||||
// index = randomu32() % 5; | |||||
} | |||||
} // namespace rack |