##############################################################################
#           Makefile for use by LiveData developers                          #
#                                                                            #
#  NOTE: "vcvarsall amd64" must be run before attempting to compile the API  #
#  examples. Please see the API documentation for information.               #
#                                                                            #
##############################################################################

#
# If the location of the Alias libraries and header files are
# different from $ALIAS_LOCATION, set it here.
#
ALIAS_LOCATION=C:\Program Files\Autodesk\Alias2021

EXAMPLES = \
			polygonHistoryExample.plugin 		\
			constrainCVExample.plugin 			\
			sunShine.plugin 					\
			resetTransforms.plugin 				\
			createTree.plugin 					\
			createSurface.plugin 				\
			createSphereExample.plugin 			\
			createTree2.plugin 					\
			createHelixExample.plugin 			\
			createMeshExample.plugin 			\
			createPerspCameraVector.plugin	\
			deleteDagExample.plugin 			\
			continuousFuncExample.plugin 		\
			controlExample.plugin 				\
			simpleEditorExample.plugin 			\
			curve2polygonExample.plugin 		\
			createCylinderExample.plugin 		\
			printPickCountExample.plugin 		\
			launchPaint.plugin 					\
			linkObjectExample.plugin 			\
			deletePolygons.plugin 				\
			duplicatePolygons.plugin 			\
			exportMTL.plugin 					\
			toggleObjectInvisibility.plugin 	\
			hiliteNSidedPolygon.plugin 			\
			printPolygonData.plugin 			\
			exportCameraData.plugin 			\
			statusListener.plugin				\
			bakeAnimation.plugin				\
			viewFrameExample.plugin				\
			printWorldExample.plugin			\
			calcDistanceExample.plugin			\
			setNormalFreeze.plugin				\
			intersectionExample.plugin			\
			winMsgBoxExample.plugin				\
			winDialogBoxExample.plugin			\
			statusListener.plugin				\
			pickMultiSpanSurfaces.plugin		\
			blindData.plugin				\
			dynamicEditorExample.plugin


#
# Run vcvarsall to properly configure the 
# development environment.
#
CC = cl.exe
CPLUSPLUS = cl.exe
LINK = link.exe
RC = rc.exe
INCLUDES = /I. /I"$(ALIAS_LOCATION)\ODS\Common\include"

#
# Some code is conditionally compiled because it produces a lot of output.
# (see AlPrint.cpp for example) Uncomment the following line if you would
# like to see all the output.
#
# COPIOUS_OUTPUT = /DCOPIOUS_OUTPUT

#
# Debug Flags - uncomment to remove debug information.
#
CDBFLAG = /DEBUG /Z7
LDBFLAG = /DEBUG

#
# Flags
#
CFLAGS = /nologo /MD $(CDBFLAG) $(INCLUDES) $(COPIOUS_OUTPUT)
CPLUSPLUSFLAGS = $(CFLAGS) /EHsc

# 
# The 'libAlisCore.lib' is used for resolving the plug-ins symbols.
#
PLUGINFLAGS = /nologo  /DLL /opt:noref /incremental:no \
	"$(ALIAS_LOCATION)\lib\libAliasCore.lib" $(LDBFLAG)
	
LFLAGS=

# Extra link libraries
EXTRA_LIBS = kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib

#
# Rules for building.
#
.SUFFIXES: .plugin .obj .cpp .c

.cpp.plugin: 
	$(CPLUSPLUS) -c $(CPLUSPLUSFLAGS) $<
	$(LINK) $(PLUGINFLAGS) /out:.\lib\$*.plugin $*.obj

.obj.plugin: 
	$(LINK) $(PLUGINFLAGS) /out:.\lib\$*.plugin $<

.cpp.obj:
	$(CPLUSPLUS) -c $(CPLUSPLUSFLAGS) $*.cpp

.c.obj:
	$(CC) -c $(CFLAGS) $*.c

.c.i:
	 $(CC) -E $(CFLAGS) $*.c | sed -e '/^[    ]*$$/d' > $*.i

.cpp.i:
	$(CPLUSPLUS) -E $(CPLUSPLUSFLAGS) $*.cpp | sed -e '/^[  ]*$$/d' > $*.i

#
# Build all the examples.
#
default: $(EXAMPLES)

#
# Copy all the source files for the examples, ignoring errors ( - option )
#
copy:
	- copy "$(ALIAS_LOCATION)\ODS\OpenAlias\examples\*.cpp" .
	- copy "$(ALIAS_LOCATION)\ODS\OpenAlias\examples\*.c" .
	- copy "$(ALIAS_LOCATION)\ODS\OpenAlias\examples\*.h" .
	- copy "$(ALIAS_LOCATION)\ODS\OpenAlias\examples\*.rc" .
	- mkdir scm  
	- mkdir lib
	- copy "$(ALIAS_LOCATION)\ODS\OpenAlias\examples\scm\*" scm
	- copy "$(ALIAS_LOCATION)\ODS\Common\examples\*.cpp" .
	- copy "$(ALIAS_LOCATION)\ODS\Common\examples\*.c" .
	- copy "$(ALIAS_LOCATION)\ODS\Common\examples\*.h" .

#
# Clean up.
#
clean:
	del *.obj lib\*.plugin lib\*.exp lib\*.lib
	
#
# Rules for building specific examples.
#
createTree.plugin: createTree.obj AlVector.obj
	$(LINK) $(PLUGINFLAGS) /out:.\lib\$@ createTree.obj AlVector.obj

createSurface.plugin: createSurface.obj AlVector.obj 
	$(LINK) $(PLUGINFLAGS) /out:.\lib\$@ createSurface.obj AlVector.obj

printWorldExample.plugin: printWorldExample.obj AlPrint.obj AlPrint2.obj
	$(LINK) $(PLUGINFLAGS) /out:.\lib\$@ printWorldExample.obj AlPrint.obj AlPrint2.obj

createTree2.plugin: createTree2.obj AlVector.obj 
	$(LINK) $(PLUGINFLAGS) /out:.\lib\$@ createTree2.obj AlVector.obj

bakeAnimation.plugin: bakeAnimation.obj WalkTree.obj
	$(LINK) $(PLUGINFLAGS) /out:.\lib\$@ bakeAnimation.obj WalkTree.obj

sunShine.plugin: sunShine.obj Tsun.obj
	$(LINK) $(PLUGINFLAGS) /out:.\lib\$@ sunShine.obj Tsun.obj

resetTransforms.plugin: resetTransforms.obj WalkTree.obj
	$(LINK) $(PLUGINFLAGS) /out:.\lib\$@ resetTransforms.obj WalkTree.obj

pickMultiSpanSurfaces.plugin: pickMultiSpanSurfaces.obj WalkTree.obj
	$(LINK) $(PLUGINFLAGS) /out:.\lib\$@ pickMultiSpanSurfaces.obj WalkTree.obj

deletePolygons.plugin: deletePolygons.obj
	 $(LINK) $(PLUGINFLAGS) /out:.\lib\$@ deletePolygons.obj

duplicatePolygons.plugin: duplicatePolygons.obj
	$(LINK) $(PLUGINFLAGS) /out:.\lib\$@ duplicatePolygons.obj

exportMTL.plugin: exportMTL.obj
	$(LINK) $(PLUGINFLAGS) /out:.\lib\$@ exportMTL.obj

toggleObjectInvisibility.plugin: toggleObjectInvisibility.obj
	$(LINK) $(PLUGINFLAGS) /out:.\lib\$@ toggleObjectInvisibility.obj

hiliteNSidedPolygon.plugin: hiliteNSidedPolygon.obj
	$(LINK) $(PLUGINFLAGS) /out:.\lib\$@ hiliteNSidedPolygon.obj

printPolygonData.plugin: printPolygonData.obj 
	$(LINK) $(PLUGINFLAGS) /out:.\lib\$@ printPolygonData.obj

exportCameraData.plugin: exportCameraData.obj
	$(LINK) $(PLUGINFLAGS) /out:.\lib\$@ exportCameraData.obj

winMsgBoxExample.plugin: winMsgBoxExample.obj
	$(LINK) $(PLUGINFLAGS) /out:.\lib\$@ winMsgBoxExample.obj $(EXTRA_LIBS)

winDialogBoxExample.plugin: winDialogBoxExample.obj winDialogBoxExampleRC.obj
	$(LINK) $(PLUGINFLAGS) /out:.\lib\$@ winDialogBoxExample.obj winDialogBoxExampleRC.obj $(EXTRA_LIBS)

winDialogBoxExampleRC.obj: winDialogBoxExampleRC.rc winDialogBoxExample.h
	$(RC) /i"." /fo"winDialogBoxExampleRC.obj" /l 0x409 winDialogBoxExampleRC.rc
