/*
 * Imakefile for the Hyper-G 3D Scene Viewer
 *
 *
 * Author :  Keith Andrews, IICM, TU Graz, Austria
 *            <kandrews@iicm.tu-graz.ac.at>
 *
 * Changes:  Michael Pichler <mpichler@iicm.tu-graz.ac.at>
 *
 * Created:  20 Mar 92
 *
 * Changed:  22 Sep 94  (adaption for Open-GL)
 * Changed:  15 Mar 95  (added Mesa support)
 * Changed:  24 Apr 95  (VRML support)
 * Changed:  20 Jul 95  (Mosaic CCI)
 * Changed:   3 Mar 96  (Georg Meszaros: BSP tree)
 * Changed:  20 May 97
 *
 * $Id: Imakefile,v 1.31 1997/05/20 13:06:32 mpichler Exp mpichler $
 *
 */


#ifdef InObjectCodeDir

/* #define IICMINTERNAL */
/* #if defined(SunArchitecture) && (OSMajorVersion >= 5) */
/* #define PURIFY */
/* #endif */

SHELL = /bin/sh
# HARMBINDIR = $(HARINSTROOT)/bin/$(ARCH)
# IICMBINDIR = /usr2/pluto/iicm/bin/$(ARCH)
/* install standalone VRweb in Harmony bin dir too */
HARMBINDIR = $(HARINSTBIN)
IICMBINDIR = $(HARINSTBIN)

# build and install standalone viewer and harmony scene daemon depending on GL version

/* activate MAKE_CCI to build Mosaic CCI version */
/* (includes unpublished source of NCSA) */
/* instrumented release (instrumented.h): harscened only */
/* harscened only built with MAKE_HARSCENED */
/* (includes unpublished HyperWave libraries) */
#ifdef IICMINTERNAL
/* #define INSTRUMENTED */
/* #define MAKE_CCI */
#define MAKE_HARSCENED
#endif

/* activate Spaceball support on SGI */
/* for include and lib directories see gl.conf */
#ifdef IICMINTERNAL
#ifdef SGIArchitecture
#define SPACEBALL
#endif
#endif

#include <gl.conf>

#ifdef OPEN_GL
OGL_CONTEXT = oglcontext
OGL_LIBS = -lGLU -lGL
OGL_GE3D = ge3dOGL
AllTarget(vrweb-ogl)
# ifdef MAKE_CCI
AllTarget(vrwebmc.ogl)
# endif
# ifndef INSTRUMENTED
InstallProgram(vrweb-ogl,$(IICMBINDIR),vrweb-ogl)
# endif
# ifdef MAKE_HARSCENED
AllTarget(harscened-ogl)
InstallProgram(harscened-ogl,$(HARMBINDIR),harscened-ogl)
# endif
#endif

#ifdef IRIS_GL
GL_CONTEXT = gecontext
GL_LIBS = -lgl_s -lc_s
GL_GE3D = ge3d
AllTarget(vrweb-gl)
# ifdef MAKE_CCI
AllTarget(vrwebmc.gl)
# endif
# ifndef INSTRUMENTED
InstallProgram(vrweb-gl,$(IICMBINDIR),vrweb-gl)
# endif
# ifdef MAKE_HARSCENED
AllTarget(harscened-gl)
InstallProgram(harscened-gl,$(HARMBINDIR),harscened-gl)
# endif
#endif

#ifdef MESA_GL
MESA_CONTEXT = mesacontext
MESA_LIBS = -lMesaGLU -lMesaGL
MESA_GE3D = ge3dMESA
AllTarget(vrweb-mesa)
# ifdef MAKE_CCI
AllTarget(vrwebmc.mesa)
# endif
# ifndef INSTRUMENTED
InstallProgram(vrweb-mesa,$(IICMBINDIR),vrweb-mesa)
# endif
# ifdef MAKE_HARSCENED
AllTarget(harscened-mesa)
InstallProgram(harscened-mesa,$(HARMBINDIR),harscened-mesa)
# endif
#endif


# debugging with debug_malloc -- only link again (rm executable)
# #define debug_malloc

# debugging with memleak (works not well with InterViews) -- must compile again (rm *.o)
# #define debug_memleak

APP_CCINCLUDES = 

#ifdef debug_malloc
APP_CCLDLIBS = -ldbmalloc
#else
APP_CCLDLIBS = 
#endif


#ifdef OPEN_GL
OGL_CCLDLIBS = $(APP_CCLDLIBS) -l$(OGL_GE3D) $(OGL_LIBS) $(IV_CCLDLIBS) $(EXTRA_CCLDLIBS)
OGL_CCDEPLIBS = $(HGLIBDIR)/lib$(OGL_GE3D).a
#endif
#ifdef IRIS_GL
GL_CCLDLIBS = $(APP_CCLDLIBS) -l$(GL_GE3D) $(GL_LIBS) $(IV_CCLDLIBS) $(EXTRA_CCLDLIBS)
GL_CCDEPLIBS = $(HGLIBDIR)/lib$(GL_GE3D).a
#endif
#ifdef MESA_GL
MESA_CCLDLIBS = $(APP_CCLDLIBS) -l$(MESA_GE3D) $(MESA_LIBS) $(IV_CCLDLIBS) $(EXTRA_CCLDLIBS)
MESA_CCDEPLIBS = $(HGLIBDIR)/lib$(MESA_GE3D).a $(HGLIBDIR)/libMesaGL.a $(HGLIBDIR)/libMesaGLU.a
#endif

# Mosaic CCI
MC_CCLDLIBS = -lCCI
MC_CCDEPLIBS = $(HGLIBDIR)/libCCI.a

#ifdef debug_memleak
APP_CCDEFINES = -DMEMLEAK -D$(ARCH)
MEMLEAK_OBJ = memleak.o
#else
APP_CCDEFINES = -D$(ARCH) -DVERBOSE -DASSERT
MEMLEAK_OBJ =
#endif

#ifdef PURIFY
OPTIMIZE_CCFLAGS=-g
/* might link purify_stubs for purify API */
#else
OPTIMIZE_CCFLAGS=-O
#endif

# do Optimization; issue Warnings
# remove -pedantic-errors when you risk compiling with implicit declarations
#if (defined(HasGcc) || defined(HasGcc2)) && defined(IICMINTERNAL)
APP_CCFLAGS = $(OPTIMIZE_CCFLAGS) -pedantic-er\rors  \
  -W -Wimplicit -Wreturn-type -Wunused -Wswitch -Wformat -Wuninitialized  \
  -Woverloaded-virtual 
#else
APP_CCFLAGS = $(OPTIMIZE_CCFLAGS)
#endif
APP_CCLDFLAGS =


# storage/display of 3D scene

SCENE_GENERAL = \
  $(MEMLEAK_OBJ) \
  slist.o \
  vecutil.o \
  camera.o \
  strarray.o \
  scene3d.o

SCENE_SDF = \
  object3d.o \
  sdfcam.o \
  geomobj.o \
  srcanch.o \
  light.o \
  polyhed.o \
  material.o \
  dummyobj.o \
  sdfscene.o \
  readscene.o \
  writescene.o \
  writevrml.o \
  scenepick.o

SCENE_VRML = \
  vrmlscene.o \
  asmooth.o \
  triangulate.o \
  monotone.o \
  fonts.o \
  vrmledit.o \
  wrltraverse.o \
  wrlbuild.o \
  wrlpick.o \
  wrldraw.o \
  wrlpass.o
/* wrlsave.o moved to libvrmlQv */

SCENE_BSP = \
  polygon.o \
  faceattr.o \
  bsptree.o \
  clipping.o \
  attributes.o \
  lightlist.o \
  bspbuild.o \
  bspdraw.o \
  svbsptree.o

SCENE_OBJS = compdate.o $(SCENE_GENERAL) $(SCENE_SDF) $(SCENE_VRML) $(SCENE_BSP)

# user interface: InterViews
IV_OBJS = \
  stranslate.o \
  icons.o \
  themenus.o \
  dialogs.o \
  editdlg.o \
  hgptrhand.o \
  delhand.o \
  scenewin.o \
  httpreader.o

/* httpreader.o only because of configurable proxy (should be in WWW_OBJS) */

# integrated viewers for texts, images (to become anachronisms)
VWR_OBJS = \
  imgview.o \
  txtview.o

# WWW specific stuff
WWW_OBJS = \
  urlserver.o \
  remote.o

#ifdef OPEN_GL
OGL_HG3D_OBJS   = $(SCENE_OBJS) $(IV_OBJS) $(OGL_CONTEXT).o $(VWR_OBJS) $(WWW_OBJS) main.o
OGL_HG3DVD_OBJS = $(SCENE_OBJS) $(IV_OBJS) $(OGL_CONTEXT).o iv3dvw.o hg3dvw.o imgserver.o hg3dvd.o
OGL_MOCCI_OBJS  = $(SCENE_OBJS) $(IV_OBJS) $(OGL_CONTEXT).o cciCaller.o momain.o
#endif
#ifdef IRIS_GL
GL_HG3D_OBJS   = $(SCENE_OBJS) $(IV_OBJS) $(GL_CONTEXT).o $(VWR_OBJS) $(WWW_OBJS) main.o
GL_HG3DVD_OBJS = $(SCENE_OBJS) $(IV_OBJS) $(GL_CONTEXT).o iv3dvw.o hg3dvw.o imgserver.o hg3dvd.o
GL_MOCCI_OBJS  = $(SCENE_OBJS) $(IV_OBJS) $(GL_CONTEXT).o cciCaller.o momain.o
#endif
#ifdef MESA_GL
MESA_HG3D_OBJS   = $(SCENE_OBJS) $(IV_OBJS) $(MESA_CONTEXT).o $(VWR_OBJS) $(WWW_OBJS) main.o
MESA_HG3DVD_OBJS = $(SCENE_OBJS) $(IV_OBJS) $(MESA_CONTEXT).o iv3dvw.o hg3dvw.o imgserver.o hg3dvd.o
MESA_MOCCI_OBJS  = $(SCENE_OBJS) $(IV_OBJS) $(MESA_CONTEXT).o cciCaller.o momain.o
#endif

# InterViews Libraries (including -lm)
Use_libInterViews()

# Starbase Libraries
SB_LIBS = -ldd98705 -lXwindow -lsb -L/usr/lib/X11R4 -lXhp11 -lX11 -ldld

WWW_LIBS = -lHgHttp -lHgWWWTools
# VRweb libraries
VR_LIBS = -L$(HGLIBDIR) -lHgWidgets $(WWW_LIBS) -lHgHyperg -lvrmlQv -lXmu
# Hyper-G Viewer Daemon Libraries
HG_LIBS = -L$(HGLIBDIR) -lHgWidgets $(WWW_LIBS) -lHgDcCommon -lHarUtils -lHgViewerStubs -lHgHyperg -lvrmlQv -lXmu
# HgDcCommon only needed for mosaic CCI support (see main.C)

# Spaceball libraries
#ifdef SPACEBALL
SPACEBALL_LIBS = SpaceballLDFlags
#else
SPACEBALL_LIBS = 
#endif

# dependend libraries (without graphics libs)
#ifdef IICMINTERNAL
HG_DEPLIBS = \
  $(HGLIBDIR)/libHarUtils.a \
  $(HGLIBDIR)/HgLibName(ViewerStubs,1.0) \
  $(HGLIBDIR)/HgLibName(DcCommon,1.0)
#else
HG_DEPLIBS =
#endif

APP_CCDEPLIBS = \
  $(HGLIBDIR)/HgLibName(Utilities,2.0) \
  $(HGLIBDIR)/HgLibName(Hyperg,1.0) \
  $(HG_DEPLIBS) \
  $(HGLIBDIR)/HgLibName(WWWTools,1.0) \
  $(HGLIBDIR)/HgLibName(Http,1.0) \
  $(HGLIBDIR)/HgLibName(Widgets,1.0) \
  $(HGLIBDIR)/libvrmlQv.a

#ifdef PURIFY
# undef BuildProgram
# define BuildProgram(program,depobjs,ldobjs,deplibs,ldlibs)		@@\
program: depobjs deplibs						@@\
	RemoveIfUnwritable($@)						@@\
	@echo "purify $(CCDRIVER) $(CCLDFLAGS) -o $@ ldobjs ldlibs"	@@\
	@purify $(CCDRIVER) $(CCLDFLAGS) -o $@ ldobjs ldlibs || ($(RM) $@; exit 1)
#endif

/* the programs to make: */

# hg3d_sb: 3D Scene Viewer, Starbase -- currently not executable
BuildProgram(hg3d_sb,$(HG3D_OBJS),$(HG3D_OBJS),$(HG_LIBS) $(CCLDLIBS) $(SB_LIBS),$(HG_LIBS) $(CCLDLIBS) $(SB_LIBS))

#ifdef OPEN_GL
VR_OGL_LIBS = $(VR_LIBS) $(SPACEBALL_LIBS) $(OGL_CCLDLIBS)
HG_OGL_LIBS = $(HG_LIBS) $(SPACEBALL_LIBS) $(OGL_CCLDLIBS)
/* VRweb, standalone, OpenGL */
BuildProgram(vrweb-ogl,$(OGL_HG3D_OBJS),$(OGL_HG3D_OBJS),$(CCDEPLIBS) $(OGL_CCDEPLIBS),$(VR_OGL_LIBS))
/* Hyper-G Scene Viewer Daemon, OpenGL */
BuildProgram(harscened-ogl,$(OGL_HG3DVD_OBJS),$(OGL_HG3DVD_OBJS),$(CCDEPLIBS) $(OGL_CCDEPLIBS),$(HG_OGL_LIBS))
#  ifdef MAKE_CCI
/* VRweb with Mosaic CCI, OpenGL */
BuildProgram(vrwebmc.ogl,$(OGL_MOCCI_OBJS),$(OGL_MOCCI_OBJS),$(CCDEPLIBS) $(OGL_CCDEPLIBS) $(MC_CCDEPLIBS),$(MC_CCLDLIBS) $(VR_OGL_LIBS))
#  endif
#endif

#ifdef IRIS_GL
VR_GL_LIBS = $(VR_LIBS) $(SPACEBALL_LIBS) $(GL_CCLDLIBS)
HG_GL_LIBS = $(HG_LIBS) $(SPACEBALL_LIBS) $(GL_CCLDLIBS)
/* VRweb, standalone, IrisGL */
BuildProgram(vrweb-gl,$(GL_HG3D_OBJS),$(GL_HG3D_OBJS),$(CCDEPLIBS) $(GL_CCDEPLIBS),$(VR_GL_LIBS))
/* Hyper-G Scene Viewer Daemon, IrisGL */
BuildProgram(harscened-gl,$(GL_HG3DVD_OBJS),$(GL_HG3DVD_OBJS),$(CCDEPLIBS) $(GL_CCDEPLIBS),$(HG_GL_LIBS))
/* hg3d_gl1: old main (no user interface, no InterViews), IrisGL */
BuildProgram(hg3d_gl1,$(SCENE_OBJS) main1.o,$(SCENE_OBJS) main1.o,$(CCDEPLIBS) $(GL_CCDEPLIBS),$(VR_GL_LIBS))
#  ifdef MAKE_CCI
/* VRweb with Mosaic CCI, IrisGL */
BuildProgram(vrwebmc.gl,$(GL_MOCCI_OBS),$(GL_MOCCI_OBJS),$(CCDEPLIBS) $(GL_CCDEPLIBS) $(MC_CCDEPLIBS),$(MC_CCLDLIBS) $(VR_GL_LIBS))
#  endif
#endif

#ifdef MESA_GL
VR_MESA_LIBS = $(VR_LIBS) $(SPACEBALL_LIBS) $(MESA_CCLDLIBS)
HG_MESA_LIBS = $(HG_LIBS) $(SPACEBALL_LIBS) $(MESA_CCLDLIBS)
/* VRweb, standalone, Mesa lib */
BuildProgram(vrweb-mesa,$(MESA_HG3D_OBJS),$(MESA_HG3D_OBJS),$(CCDEPLIBS) $(MESA_CCDEPLIBS),$(VR_MESA_LIBS))
/* Hyper-G Scene Viewer Daemon, Mesa lib */
BuildProgram(harscened-mesa,$(MESA_HG3DVD_OBJS),$(MESA_HG3DVD_OBJS),$(CCDEPLIBS) $(MESA_CCDEPLIBS),$(HG_MESA_LIBS))
#  ifdef MAKE_CCI
/* VRweb with Mosaic CCI, Mesa lib */
BuildProgram(vrwebmc.mesa,$(MESA_MOCCI_OBJS),$(MESA_MOCCI_OBJS),$(CCDEPLIBS) $(MESA_CCDEPLIBS) $(MC_CCDEPLIBS),$(MC_CCLDLIBS) $(VR_MESA_LIBS))
#  endif
#endif

# scene management (independent of file format)
MakeObjectFromSrc(slist)
MakeObjectFromSrc(vecutil)
MakeObjectFromSrc(camera)
MakeObjectFromSrc(strarray)
MakeObjectFromSrc(scene3d)

# SDF scenes
MakeObjectFromSrc(object3d)
MakeObjectFromSrc(sdfcam)
MakeObjectFromSrc(geomobj)
MakeObjectFromSrc(srcanch)
MakeObjectFromSrc(light)
#if defined(AlphaArchitecture) && !defined(HasGcc)
MakeObjectFromSrcFlags(polyhed,-Olimit 1024)  /* for cxx to optimize readObjFile */
#else
MakeObjectFromSrc(polyhed)
#endif
MakeObjectFromSrc(material)
MakeObjectFromSrc(dummyobj)
MakeObjectFromSrc(sdfscene)
MakeObjectFromSrc(readscene)
MakeObjectFromSrc(writescene)
MakeObjectFromSrc(writevrml)
MakeObjectFromSrc(scenepick)

# VRML scenes
MakeObjectFromSrc(vrmlscene)
MakeObjectFromSrc(asmooth)
MakeObjectFromSrc(triangulate)
MakeObjectFromSrc(monotone)
MakeObjectFromSrc(fonts)
MakeObjectFromSrc(vrmledit)
MakeObjectFromSrc(wrltraverse)
MakeObjectFromSrc(wrlbuild)
MakeObjectFromSrc(wrlpick)
MakeObjectFromSrc(wrldraw)
MakeObjectFromSrc(wrlpass)

# BSP tree
MakeObjectFromSrc(polygon)
MakeObjectFromSrc(faceattr)
MakeObjectFromSrc(bsptree)
MakeObjectFromSrc(clipping)
MakeObjectFromSrc(attributes)
MakeObjectFromSrc(lightlist)
MakeObjectFromSrc(bspbuild)
MakeObjectFromSrc(bspdraw)
MakeObjectFromSrc(svbsptree)

# InterViews stuff (user interface)
MakeObjectFromSrc(icons)
#ifdef SPACEBALL
MakeObjectFromSrcFlags(stranslate,SpaceballCCFlags)
MakeObjectFromSrcFlags(themenus,SpaceballCCFlags)
MakeObjectFromSrcFlags(dialogs,SpaceballCCFlags)
MakeObjectFromSrcFlags(hgptrhand,SpaceballCCFlags)
MakeObjectFromSrcFlags(scenewin,SpaceballCCFlags)
#else
MakeObjectFromSrc(stranslate)
MakeObjectFromSrc(themenus)
MakeObjectFromSrc(dialogs)
MakeObjectFromSrc(hgptrhand)
MakeObjectFromSrc(scenewin)
#endif
MakeObjectFromSrc(editdlg)
# hlsutil moved to HgWidgets
#ifdef OPEN_GL
MakeObjectFromSrcFlags($(OGL_CONTEXT),-DGE3DTEXT)
#endif
#ifdef IRIS_GL
MakeObjectFromSrc($(GL_CONTEXT))
#endif
#ifdef MESA_GL
MakeObjectFromSrcFlags($(MESA_CONTEXT),-DGE3DTEXT)
#endif

# stubs of other viewers for standalone version
MakeObjectFromSrc(imgview)
MakeObjectFromSrc(txtview)
MakeObjectFromSrc(delhand)

# real Harmony viewer stuff (daemon)
MakeObjectFromSrc(iv3dvw)
MakeObjectFromSrc(hg3dvw)
MakeObjectFromSrc(hg3dvd)
MakeObjectFromSrc(imgserver)

# Mosaic CCI stuff
MakeObjectFromSrc(cciCaller)
MakeObjectFromSrc(momain)
MakeObjectFromSrc(compdate)

/* includes AOUT: compdate.o dependency; following rule would compile without:
compdate.o: $(SRC)/compdate.C
	@$(RM) compdate.o compdate..c
	$(CCDRIVER) $(CCFLAGS) -c $(SRC)/compdate.C
*/

# mains for WWW version (also usable standalone)
MakeObjectFromSrc(httpreader)
MakeObjectFromSrc(urlserver)
MakeObjectFromSrc(remote)
MakeObjectFromSrc(main)
#ifdef IICMINTERNAL
MakeObjectFromSrc(main1)    /* sorry, not yet ported to OpenGL */
#endif

/*
 * #if ((defined(SunArchitecture) && (OSMajorVersion <= 4)) || defined(UltrixArchitecture))
 * # simpler date format, used on SUN4 and PMAX
 * DATEFORMAT='+%a %d %h %y'
 * #else
 * # date parameters are machine dependent, this one works for SGI, DEC ALPHA, SUN5, HPUX
 * DATEFORMAT='+%a %e %b %Y'
 * #endif
 * # the following echo commands can be executed by any shell
 */

$(SRC)/compdate.C: compdate
compdate:
	mkcompdate $(SRC)

/*
	@echo 'writing compile date "'"`date $(DATEFORMAT)`"'" to' $(SRC)/compdate.C
	@echo '#include "compdate.h"' > $(SRC)/compdate.C
	@echo 'const char* compDate () { return "'"`date $(DATEFORMAT)`"'"; }' >> $(SRC)/compdate.C
*/

# rules for make depend
DependTarget()



#else

MakeInObjectCodeDir()

/* common targets for upper level (I)makefile: */
IntoSubdirs(compdate,$(ARCH),"making compate (compilation date in compdate.C)")
IntoSubdirs(compdate.o,$(ARCH),"making compate.o (compilation date)")
/* VRweb */
IntoSubdirs(vrweb-ogl,$(ARCH),"making VRweb (OpenGL)")
IntoSubdirs(vrweb-mesa,$(ARCH),"making VRweb (Mesa)")
/* Harmony Scene Daemon */
IntoSubdirs(harscened-ogl,$(ARCH),"making harscened (OpenGL)")
IntoSubdirs(harscened-mesa,$(ARCH),"making harscened (Mesa)")

/* scripts for choosing appropriate version */
/* InstallScript(vrweb,$(HARINSTBIN)) */
/* InstallScript(harscened,$(HARINSTBIN)) */

#endif /* if compiling in subdirectory */
