CXX = g++
TARGET = ray pviewer
PVDIR = PhotonViewer
OBJECTS = main.o sampling.o camera.o environment.o disk.o plane.o sphere.o \
          phong_brdf.o hsa_brdf.o directional_light.o point_light.o \
          spot_light.o sphere_area_light.o disk_area_light.o scene.o tracer.o \
          path_tracer.o whitted_tracer.o rgbe.o kd_tree.o photon_tracer.o \
          photonmap.o
DEPENDS = $(OBJECTS:.o=.d)
CXXFLAGS = -std=c++11 -pedantic -Wall -DGLM_FORCE_RADIANS -fopenmp -DUSE_CPP11_RANDOM -fno-builtin #-DENABLE_KD_TREE -DSAVE_FILES
LDLIBS = -lfreeimage -ljson_spirit

.PHONY: all
all: CXXFLAGS += -O3 -DNDEBUG
all: $(TARGET)

.PHONY: debug
debug: CXXFLAGS += -g
debug: $(TARGET)

ray: $(OBJECTS)
	$(CXX) -o $@ $^ $(CXXFLAGS) $(LDLIBS)

-include $(DEPENDS)

%.o: %.cpp
	$(CXX) -c $(CXXFLAGS) $*.cpp -o $*.o
	$(CXX) -MM $(CXXFLAGS) $*.cpp > $*.d

.PHONY: pviewer
pviewer:
	$(MAKE) $(MFLAGS) -C $(PVDIR)

.PHONY: clean
clean:
	$(RM) ray $(OBJECTS) $(DEPENDS)
	$(MAKE) $(MFLAGS) -C $(PVDIR) clean
