diff --git a/Rmakefile b/Rmakefile index 7be50f6..20d5756 100644 --- a/Rmakefile +++ b/Rmakefile @@ -1,494 +1,497 @@ # RCSid: $Id: Rmakefile,v 2.87 2021/01/19 23:31:47 greg Exp $ # # Compiles for ray tracing programs. # OPT = -O MACH = -DBSD CFLAGS = -I../common -L../lib $(OPT) $(MACH) SPECIAL = CC = cc AR = ar MLIB = -lm LINT = lint LINTFLAGS = -DBSD # # The following are user-definable: # DESTDIR = . INSTDIR = /usr/local/bin INSTALL = cp # # The following paths must exist and be relative to root: # DEVDIR = $(INSTDIR)/dev LIBDIR = /usr/local/lib/ray # # Library routines: # RLIB = ../lib/libradiance.a RCLIB = ../lib/libraycalls.a LIBS = -lrtrad $(MLIB) # # Device drivers for rvu (see also devtable.c): # DOBJS = devtable.o devcomm.o editline.o x11.o x11twind.o \ colortab.o DSRC = devtable.c devcomm.c editline.c x11.c x11twind.c \ colortab.c DLIBS = -lX11 # # Standard object files: # RTOBJS = rtmain.o rtrace.o duphead.o persist.o RTSRC = rtmain.c rtrace.c duphead.c persist.c RPOBJS = rpmain.o rpict.o srcdraw.o duphead.o persist.o RPSRC = rpmain.c rpict.c srcdraw.c duphead.c persist.c RVOBJS = rvmain.o rview.o rv2.o rv3.o $(DOBJS) RVSRC = rvmain.c rview.c rv2.c rv3.c $(DSRC) RCOBJS = rcmain.o rcontrib.o rc2.o rc3.o RCSRC = rcmain.c rcontrib.c rc2.c rc3.c RLOBJS = raycalls.o raypcalls.o rayfifo.o RLSRC = raycalls.c raypcalls.c rayfifo.c ROBJS = $(RAYOBJS) $(SURFOBJS) $(MATOBJS) \ $(MODOBJS) $(SUPPOBJS) $(PMOBJS) RSRC = $(RAYSRC) $(SURFSRC) $(MATSRC) \ $(MODSRC) $(SUPPSRC) RAYOBJS = ambcomp.o ambient.o ambio.o freeobjmem.o initotypes.o \ preload.o raytrace.o renderopts.o RAYSRC = ambcomp.c ambient.c ambio.c freeobjmem.c initotypes.c \ preload.c raytrace.c renderopts.c SURFOBJS = source.o sphere.o srcobstr.o srcsupp.o srcsamp.o virtuals.o \ o_face.o o_cone.o o_instance.o o_mesh.o SURFSRC = sphere.c source.c srcobstr.c srcsupp.c srcsamp.c virtuals.c \ o_face.c srcsamp.c o_cone.c o_instance.c o_mesh.c MATOBJS = aniso.o normal.o dielectric.o m_clip.o glass.o m_brdf.o \ m_mirror.o m_direct.o m_mist.o fprism.o m_alias.o m_bsdf.o \ ashikhmin.o MATSRC = aniso.c normal.c dielectric.c m_clip.c glass.c m_brdf.c \ m_mirror.c m_direct.c m_mist.c fprism.c m_alias.c m_bsdf.c \ ashikhmin.c MODOBJS = p_func.o t_func.o p_data.o t_data.o text.o mx_func.o mx_data.o MODSRC = p_func.c t_func.c p_data.c t_data.c text.c mx_func.c mx_data.c SUPPOBJS = func.o noise3.o data.o SUPPSRC = func.c noise3.c data.c PMOBJS = pmap.o pmapsrc.o pmapmat.o pmaprand.o pmapio.o pmapdata.o \ pmapdens.o pmapbias.o pmapparm.o pmapamb.o pmapray.o \ pmapopt.o pmapdiag.o pmaptype.o morton.o oococt.o oocsort.o \ oocbuild.o oocnn.o ooccache.o pmutil.o pmaproi.o pmapfilt.o \ wavelet2.o mrgbe.o pmapcontrib.o pmcontrib2.o pmcontrib3.o PMSRC = pmap.c pmapsrc.c pmapmat.c pmaprand.c pmapio.c pmapdata.c \ pmapdens.c pmapbias.c pmapparm.c pmapamb.c pmapray.c \ pmapopt.c pmapdiag.c pmaptype.c morton.c oococt.c oocsort.c \ oocbuild.c oocnn.c ooccache.c pmutil.c pmapfilt.c pmaproi.c \ pmapkdt.c pmaptkdt.c pmapooc.c wavelet2.c mrgbe.c \ pmapcontrib.c pmcontrib2.c pmcontrib3.c HEADERS = ambient.h ray.h data.h otspecial.h source.h # # What this makefile produces: # PROGS = $(DESTDIR)/rtrace $(DESTDIR)/rpict $(DESTDIR)/rvu $(DESTDIR)/rcontrib \ $(DESTDIR)/lookamb $(DESTDIR)/mkpmap $(DESTDIR)/pmapdump all: $(PROGS) $(RCLIB) $(SPECIAL) install: all rayinit.cal $(INSTALL) $(PROGS) $(INSTDIR) rm -f $(LIBDIR)/rayinit.cal cp rayinit.cal $(LIBDIR) ogl: clean: set nonomatch; rm -f $(PROGS) *.o lint: $(RVSRC) $(LINT) $(LINTFLAGS) -DRVIEW $(RVSRC) $(LIBS) # Pmap unit tests wavelet-test: wavelet2.c wavelet2.h $(CC) $(CFLAGS) -DWAVELET_TEST -DWAVELET_DBG \ -o wavelet-test -g wavelet2.c +mrgbe-test: mrgbe.c mrgbe.h + $(CC) $(CFLAGS) -DmRGBE_TEST -o mrgbe-test -g mrgbe.c $(LIBS) + pmapcontrib-test: pmapcontrib.c pmapcontrib.h $(CC) $(CFLAGS) -DPMAP_CONTRIB_TEST -o pmapcontrib-test \ -g pmapcontrib.c $(LIBS) # # Links: # $(DESTDIR)/rtrace: $(RTOBJS) $(RCLIB) $(RLIB) $(CC) $(CFLAGS) -o $(DESTDIR)/rtrace $(RTOBJS) $(RCLIB) $(RLIB) $(LIBS) $(DESTDIR)/rpict: $(RPOBJS) $(RLIB) $(CC) $(CFLAGS) -o $(DESTDIR)/rpict $(RPOBJS) $(RLIB) $(LIBS) $(DESTDIR)/rvu: $(RVOBJS) $(RCLIB) $(RLIB) $(CC) $(CFLAGS) -o $(DESTDIR)/rvu $(RVOBJS) $(RCLIB) \ $(RLIB) $(LIBS) $(DLIBS) $(DESTDIR)/rcontrib: $(RCOBJS) $(RLIB) $(CC) $(CFLAGS) -o $(DESTDIR)/rcontrib $(RCOBJS) $(RLIB) $(LIBS) $(DESTDIR)/lookamb: lookamb.o ambio.o $(CC) $(CFLAGS) -o $(DESTDIR)/lookamb lookamb.o ambio.o $(LIBS) $(DESTDIR)/mkpmap: mkpmap.o $(RLIB) $(CC) $(CFLAGS) -o $(DESTDIR)/mkpmap mkpmap.o $(RLIB) $(LIBS) $(DESTDIR)/pmapdump: pmapdump.o pmaptype.o pmapparm.o $(CC) $(CFLAGS) -o pmapdump pmapdump.o pmaptype.o pmapparm.o $(LIBS) $(RLIB): $(ROBJS) Version.o rm -f $(RLIB) $(AR) rc $(RLIB) $(ROBJS) Version.o -ranlib $(RLIB) $(RCLIB): $(RLOBJS) rm -f $(RCLIB) $(AR) rc $(RCLIB) $(RLOBJS) -ranlib $(RCLIB) # # Uncomment the following to model dispersion: # dielectric.o: dielectric.c source.h $(CC) $(CFLAGS) -DDISPERSE -c dielectric.c # end of dispersion compiles. devcomm.o: devcomm.c $(CC) $(CFLAGS) -DDEVPATH=\"$(DEVDIR)\" -c devcomm.c # # Version module: # Version.c: VERSION $(RSRC) $(HEADERS) ( cat VERSION ; date ; whoami ; hostname ) > Version.c ed - Version.c < verscript.ed || rm Version.c # # Include dependencies: # ambio.o colortab.o data.o devcomm.o \ devmain.o lookamb.o rview.o x11.o: ../common/color.h freeobjmem.o o_cone.o srcsupp.o: ../common/cone.h data.o freeobjmem.o m_brdf.o mx_data.o \ p_data.o raycalls.o t_data.o: data.h devcomm.o devmain.o devtable.o \ editline.o x11.o: driver.h freeobjmem.o o_face.o srcsupp.o: ../common/face.h ambient.o raytrace.o rpmain.o rtmain.o \ rtrace.o rvmain.o rv2.o rv3.o: ../common/octree.h o_instance.o: ../common/instance.h ambient.o aniso.o ashikhmin.o dielectric.o freeobjmem.o func.o glass.o \ initotypes.o m_brdf.o m_bsdf.o m_direct.o m_mirror.o normal.o o_cone.o \ preload.o raycalls.o raytrace.o rtrace.o rv2.o source.o sphere.o \ srcsupp.o text.o srcdraw.o srcobstr.o virtuals.o: ../common/otypes.h ambient.o ambcomp.o aniso.o ashikhmin.o normal.o raycalls.o raytrace.o \ rpict.o rvmain.o rtmain.o rpmain.o rcmain.o persist.o source.o rv3.o \ srcsamp.o virtuals.o: ../common/random.h ambcomp.o ambient.o aniso.o ashikhmin.o dielectric.o freeobjmem.o func.o \ glass.o m_bsdf.o m_brdf.o m_clip.o m_direct.o m_mirror.o m_mist.o mx_data.o \ o_mesh.o mx_func.o normal.o o_cone.o o_face.o o_instance.o p_data.o p_func.o \ raycalls.o raypcalls.o rayfifo.o raytrace.o rpict.o rtrace.o rv2.o rv3.o rview.o \ source.o sphere.o srcdraw.o srcobstr.o srcsamp.o srcsupp.o t_data.o t_func.o \ text.o rpmain.o rtmain.o rvmain.o virtuals.o m_alias.o rcmain.o \ rcontrib.o rc2.o rc3.o: ray.h \ ../common/standard.h ../common/rtmisc.h ../common/rtio.h ../common/rtmath.h \ ../common/rterror.h ../common/octree.h \ ../common/mat4.h ../common/fvect.h ../common/object.h ../common/color.h rv2.o rv3.o rview.o: rpaint.h driver.h ../common/view.h ../common/resolu.h m_direct.o m_mirror.o m_mist.o dielectric.o raycalls.o \ rpict.o rpmain.o rtmain.o rvmain.o source.o srcdraw.o \ srcobstr.o srcsamp.o srcsupp.o virtuals.o: source.h cone.o data.o devcomm.o initotypes.o fprism.o preload.o \ duphead.o octree.o: ../common/standard.h ../common/rtmisc.h \ ../common/rtio.h ../common/rtmath.h \ ../common/rterror.h ../common/mat4.h ../common/fvect.h ambio.o: ../common/fvect.h ambient.o initotypes.o m_alias.o pmapcontrib.o pmapdata.o pmapsrc.o \ pmcontrib2.o raytrace.o rtrace.o rv2.o rv3.o source.o \ srcdraw.o srcobstr.o virtuals.o: otspecial.h rpmain.o rtmain.o rvmain.o rpict.o \ srcdraw.o: ../common/view.h ../common/resolu.h rpict.o: ../common/hilbert.h x11.o x11twind.o: x11twind.h x11.o: x11icon.h ambient.o ambcomp.o ambio.o lookamb.o raycalls.o: ambient.h data.o rpmain.o rtmain.o rvmain.o rpict.o rtrace.o \ rv2.o: ../common/resolu.h aniso.o func.o m_brdf.o m_direct.o mx_data.o mx_func.o p_data.o \ p_func.o t_data.o t_func.o: func.h ../common/calcomp.h preload.o: data.h func.h ../common/object.h ../common/face.h \ ../common/cone.h ../common/instance.h ../common/mesh.h \ ../common/color.h ../common/bsdf.h ../common/otypes.h rtmain.o rpmain.o rvmain.o persist.o duphead.o \ renderopts.o rpict.o: ../common/paths.h freeobjmem.o raycalls.o text.o: ../common/font.h raypcalls.o: ../common/selcall.h o_mesh.o: ../common/mesh.h noise3.o: ../common/calcomp.h aniso.o ashikhmin.o dielectric.o freeobjmem.o glass.o initotypes.o \ m_alias.o m_brdf.o m_clip.o m_direct.o m_mirror.o m_mist.o \ mx_data.o mx_func.o normal.o o_cone.o o_face.o o_instance.o \ o_mesh.o p_data.o p_func.o source.o sphere.o t_data.o t_func.o \ srcobstr.o text.o: rtotypes.h m_bsdf.o: ambient.h source.h func.h \ ../common/calcomp.h ../common/bsdf.h ../common/random.h rcmain.o rcontrib.o rc2.o rc3.o: rcontrib.h \ ../common/platform.h ../common/paths.h ../common/lookup.h \ func.h ../common/calcomp.h ../common/rtprocess.h ambient.o rcmain.o: ambient.h rcmain.o: source.h rcontrib.o: source.h ../common/otypes.h rc2.o: ../common/resolu.h rc3.o: ../common/selcall.h # # Photon map include dependencies (via 'gcc -MM -I../common') # TODO: Update after adding pmaproi module! # ambient.o: pmapparm.h pmaptype.h pmapamb.h pmapdata.h dielectric.o glass.o normal.o m_brdf.o m_bsdf.o ashikhmin.o aniso.o: \ pmapparm.h pmaptype.h pmapmat.h pmap.h pmapdata.h raycalls.o rpmain.o rcmain.o rtmain.o rvmain.o: \ pmapparm.h pmaptype.h pmapray.h rcmain.o: pmapparm.h pmaptype.h pmapray.h pmapcontrib.h pmapdata.h raytrace.o: pmapparm.h pmaptype.h pmap.h pmapdata.h renderopts.o: pmapparm.h pmaptype.h pmapopt.h rpict.o: pmapparm.h pmaptype.h pmapbias.h pmapdata.h pmapdiag.h source.o: pmapparm.h pmaptype.h pmap.h pmapdata.h pmapsrc.h pmapbias.o: pmapbias.c pmapbias.h pmapdata.h ray.h ../common/standard.h \ ../common/copyright.h ../common/rtio.h ../common/rtmisc.h \ ../common/rtmath.h ../common/tiff.h ../common/mat4.h ../common/fvect.h \ ../common/rterror.h ../common/octree.h ../common/object.h \ ../common/color.h pmapparm.h pmaptype.h ../common/lookup.h pmap.h \ pmaprand.h pmapcontrib.o: pmapcontrib.c pmapcontrib.h pmapdata.h ray.h \ ../common/standard.h ../common/copyright.h ../common/rtio.h \ ../common/rtmisc.h ../common/rtmath.h ../common/tiff.h ../common/mat4.h \ ../common/fvect.h ../common/rterror.h ../common/octree.h \ ../common/object.h ../common/color.h pmapparm.h pmaptype.h \ ../common/paths.h ../common/lookup.h pmapmat.h pmap.h pmapsrc.h \ source.h pmaprand.h pmapio.h pmapdiag.h ../common/platform.h \ rcontrib.h ../common/rtprocess.h ../common/paths.h func.h \ ../common/calcomp.h ../common/otypes.h \ pmapkdt.h pmapkdt.c pmapooc.h pmapooc.c pmapdiag.o: pmapdiag.c pmapdiag.h ../common/platform.h pmapdata.h ray.h \ ../common/standard.h ../common/copyright.h ../common/rtio.h \ ../common/rtmisc.h ../common/rtmath.h ../common/tiff.h ../common/mat4.h \ ../common/fvect.h ../common/rterror.h ../common/octree.h \ ../common/object.h ../common/color.h pmapparm.h pmaptype.h \ ../common/lookup.h pmapio.o: pmapio.c pmapio.h pmapdata.h ray.h ../common/standard.h \ ../common/copyright.h ../common/rtio.h ../common/rtmisc.h \ ../common/rtmath.h ../common/tiff.h ../common/mat4.h ../common/fvect.h \ ../common/rterror.h ../common/octree.h ../common/object.h \ ../common/color.h pmapparm.h pmaptype.h ../common/paths.h \ ../common/lookup.h pmapdiag.h ../common/platform.h ../common/resolu.h \ pmapkdt.h pmapkdt.c pmapooc.h pmapooc.c pmapray.o: pmapray.c pmapray.h ray.h ../common/standard.h \ ../common/copyright.h ../common/rtio.h ../common/rtmisc.h \ ../common/rtmath.h ../common/tiff.h ../common/mat4.h ../common/fvect.h \ ../common/rterror.h ../common/octree.h ../common/object.h \ ../common/color.h pmapparm.h pmaptype.h pmap.h pmapdata.h \ ../common/lookup.h pmaptype.o: pmaptype.c pmaptype.h ooccache.o: ooccache.c ooccache.h oocsort.o: oocsort.c oocsort.h ../common/fvect.h morton.h oocbuild.o: oocbuild.c oococt.h morton.h ../common/fvect.h ooccache.h \ oocsort.h oococt.o: oococt.c oococt.h morton.h ../common/fvect.h ooccache.h \ ../common/rtio.h oocnn.o: oocnn.c oocnn.h oococt.h morton.h ../common/fvect.h \ ooccache.h pmapfilt.h ../common/lookup.h oocsort.h pmapfilt.o: pmapfilt.c pmapfilt.h ../common/lookup.h pmapdata.h ray.h \ ../common/standard.h ../common/copyright.h ../common/rtio.h \ ../common/rtmisc.h ../common/rtmath.h ../common/tiff.h ../common/mat4.h \ ../common/fvect.h ../common/rterror.h ../common/octree.h \ ../common/object.h ../common/color.h pmapparm.h pmaptype.h \ ../common/paths.h ../common/random.h source.h otspecial.h \ pmapkdt.h pmapkdt.c pmapooc.h pmapooc.c pmapdens.o: pmapdens.c pmapdens.h pmap.h pmapparm.h pmaptype.h pmapdata.h \ ray.h ../common/standard.h ../common/copyright.h ../common/rtio.h \ ../common/rtmisc.h ../common/rtmath.h ../common/tiff.h ../common/mat4.h \ ../common/fvect.h ../common/rterror.h ../common/octree.h \ ../common/object.h ../common/color.h ../common/paths.h \ ../common/lookup.h pmapbias.h ../common/otypes.h \ pmapkdt.h pmapkdt.c pmaptkdt.h pmaptkdt.c pmapooc.h pmapooc.c pmapdump.o: pmapdump.c pmap.h pmapparm.h pmaptype.h pmapdata.h ray.h \ ../common/standard.h ../common/copyright.h ../common/rtio.h \ ../common/rtmisc.h ../common/rtmath.h ../common/tiff.h ../common/mat4.h \ ../common/fvect.h ../common/rterror.h ../common/octree.h \ ../common/object.h ../common/color.h ../common/paths.h \ ../common/lookup.h pmapio.h ../common/rtio.h \ ../common/resolu.h ../common/random.h \ pmapkdt.h pmapkdt.c pmaptkdt.h pmaptkdt.c pmapooc.h pmapooc.c pmapdata.o: pmapdata.c pmapdata.h ray.h ../common/standard.h \ ../common/copyright.h ../common/rtio.h ../common/rtmisc.h \ ../common/rtmath.h ../common/tiff.h ../common/mat4.h ../common/fvect.h \ ../common/rterror.h ../common/octree.h ../common/object.h \ ../common/color.h pmapparm.h pmaptype.h ../common/paths.h \ ../common/lookup.h pmapdens.h pmap.h pmaprand.h pmapmat.h \ ../common/otypes.h ../common/random.h source.h otspecial.h \ pmapkdt.h pmapkdt.c pmaptkdt.h pmaptkdt.c pmapooc.h pmapooc.c pmap.o: pmap.c pmap.h pmapparm.h pmaptype.h pmapdata.h ray.h \ ../common/standard.h ../common/copyright.h ../common/rtio.h \ ../common/rtmisc.h ../common/rtmath.h ../common/tiff.h ../common/mat4.h \ ../common/fvect.h ../common/rterror.h ../common/octree.h \ ../common/object.h ../common/color.h ../common/paths.h \ ../common/lookup.h pmapmat.h pmapsrc.h source.h pmaprand.h pmapio.h \ pmapdens.h pmapbias.h pmapdiag.h ../common/platform.h ../common/otypes.h \ pmapkdt.h pmapkdt.c pmaptkdt.h pmaptkdt.c pmapooc.h pmapooc.c pmapamb.o: pmapamb.c pmapamb.h pmapdata.h ray.h ../common/standard.h \ ../common/copyright.h ../common/rtio.h ../common/rtmisc.h \ ../common/rtmath.h ../common/tiff.h ../common/mat4.h ../common/fvect.h \ ../common/rterror.h ../common/octree.h ../common/object.h \ ../common/color.h pmapparm.h pmaptype.h ../common/paths.h \ ../common/lookup.h pmap.h \ pmapkdt.h pmapkdt.c pmapooc.h pmapooc.c pmapmat.o: pmapmat.c pmapmat.h pmap.h pmapparm.h pmaptype.h pmapdata.h \ ray.h ../common/standard.h ../common/copyright.h ../common/rtio.h \ ../common/rtmisc.h ../common/rtmath.h ../common/tiff.h ../common/mat4.h \ ../common/fvect.h ../common/rterror.h ../common/octree.h \ ../common/object.h ../common/color.h ../common/paths.h \ ../common/lookup.h pmaprand.h ../common/otypes.h data.h func.h \ ../common/calcomp.h ../common/bsdf.h ../common/ccolor.h \ ../common/platform.h \ pmapkdt.h pmapkdt.c pmapooc.h pmapooc.c pmapsrc.o: pmapsrc.c pmapsrc.h ray.h ../common/standard.h \ ../common/copyright.h ../common/rtio.h ../common/rtmisc.h \ ../common/rtmath.h ../common/tiff.h ../common/mat4.h ../common/fvect.h \ ../common/rterror.h ../common/octree.h ../common/object.h \ ../common/color.h pmapparm.h pmaptype.h source.h pmap.h pmapdata.h \ ../common/paths.h ../common/lookup.h pmaprand.h \ ../common/otypes.h otspecial.h \ pmapkdt.h pmapkdt.c pmapooc.h pmapooc.c pmapopt.o: pmapopt.c ray.h ../common/standard.h ../common/copyright.h \ ../common/rtio.h ../common/rtmisc.h ../common/rtmath.h ../common/tiff.h \ ../common/mat4.h ../common/fvect.h ../common/rterror.h \ ../common/octree.h ../common/object.h ../common/color.h pmapparm.h \ pmaptype.h pmapparm.o: pmapparm.c pmapparm.h pmaptype.h pmapdata.h ray.h \ ../common/standard.h ../common/copyright.h ../common/rtio.h \ ../common/rtmisc.h ../common/rtmath.h ../common/tiff.h ../common/mat4.h \ ../common/fvect.h ../common/rterror.h ../common/octree.h \ ../common/object.h ../common/color.h ../common/paths.h ../common/lookup.h \ pmapkdt.h pmapkdt.c pmapooc.h pmapooc.c pmutil.o: pmutil.h pmutil.c pmap.h pmapparm.h pmaptype.h pmapdata.h ray.h \ ../common/standard.h ../common/copyright.h ../common/rtio.h \ ../common/rtmisc.h ../common/rtmath.h ../common/tiff.h ../common/mat4.h \ ../common/fvect.h ../common/rterror.h ../common/octree.h \ ../common/object.h ../common/color.h ../common/paths.h \ ../common/lookup.h pmapio.h \ pmapkdt.h pmapkdt.c pmapooc.h pmapooc.c pmaproi.o: pmaproi.c pmaproi.h ray.h ../common/standard.h \ ../common/copyright.h ../common/rtio.h ../common/rtmisc.h \ ../common/rtmath.h ../common/tiff.h ../common/mat4.h ../common/fvect.h \ ../common/rterror.h ../common/octree.h ../common/object.h \ ../common/color.h pmapparm.h pmaptype.h otspecial.h ../common/otypes.h mkpmap.o: mkpmap.c pmap.h pmapparm.h pmaptype.h ray.h \ ../common/standard.h ../common/copyright.h ../common/rtio.h \ ../common/rtmisc.h ../common/rtmath.h ../common/tiff.h ../common/mat4.h \ ../common/fvect.h ../common/rterror.h ../common/octree.h \ ../common/object.h ../common/color.h pmapdata.h ../common/paths.h \ ../common/lookup.h pmapkdt.h pmapfilt.h ../common/fvect.h pmaptkdt.h \ pmutil.h pmapmat.h pmapsrc.h source.h pmapcontrib.h mrgbe.h rcontrib.h \ ../common/platform.h ../common/rtprocess.h ../common/paths.h func.h \ ../common/calcomp.h pmaprand.h pmaproi.h pmapio.h ambient.h \ ../common/resolu.h mrgbe.o: mrgbe.c mrgbe.h wavelet2.o: wavelet2.c wavelet2.h diff --git a/mrgbe.c b/mrgbe.c index 7b39e64..1d3f7f7 100644 --- a/mrgbe.c +++ b/mrgbe.c @@ -1,342 +1,342 @@ /* ========================================================================= mRGBE (miniRGBE): reduced RGBE encoding of normalised RGB floats plus associated integer payload data. See mrgbe.h for encoding details. Compile with -DmRGBE_TEST to enable unit test (requires libm) Roland Schregle (roland.schregle@{hslu.ch, gmail.com}) (c) Lucerne University of Applied Sciences and Arts, supported by the Swiss National Science Foundation (SNSF #179067, "Light Fields for Spatio-Temporal Glare Assessment") ========================================================================= $Id$ */ #include "mrgbe.h" #include #include #include #define min(a,b) ((a) < (b) ? (a) : (b)) #define max(a,b) ((a) > (b) ? (a) : (b)) mRGBERange *mRGBEinit (mRGBERange *range, double rgbMin [3], double rgbMax [3] ) /* Initialise range state for mRGBEencode()/mRGBEdecode() with the specified * float input ranges [rgbMin, rgbMax] in _absolute_ values per colour * channel. This sets the offset and normalisation for the encoding. */ { unsigned i; for (i = 0; i < 3; i++) { range -> min [i] = rgbMin [i]; range -> max [i] = rgbMax [i]; if (rgbMin [i] >= rgbMax [i]) { fprintf(stderr, "ERROR - invalid mRGBE range\n"); return NULL; } range -> norm [i] = mRGBE_RANGE / (rgbMax [i] - rgbMin [i]); if (range -> norm [i] < mRGBE_MIN) { fprintf(stderr, "ERROR - Zero mRGBE normalisation\n"); return NULL; } } return range; } mRGBE mRGBEencode (double rgb [3], const mRGBERange *range, unsigned data) /* Encode signed float RGB tuple to mRGBE along with payload data. The * supplied range state must be previously initialised with mRGBEinit(). * A warning is issued if rgb lies outside the initialised range. */ { #define sgn(a, b) ((a) >= 0 ? (b) : -(b)) mRGBE mrgbe = {0, 0, 0, 0}; double rgbRange [3], rgbNorm [3], mantNorm; int i, exp; /* Check payload data */ if (data > mRGBE_DATAMAX) { fprintf(stderr, "ERROR - mRGBE data overflow"); return mrgbe; } if (!range) { fprintf(stderr, "ERROR - mRGBE range not initialised\n"); return mrgbe; } /* Offset and normalise RGB according to initialised range; note rgbNorm * is in ABSOLUTE VALUES */ for (i = 0; i < 3; i++) { rgbNorm [i] = fabs(rgb [i]); /* Check range */ if (rgbNorm [i] < range -> min [i] || rgbNorm [i] > range -> max [i]) { fprintf(stderr, "ERROR - mRGBE input outside range\n"); return mrgbe; } rgbNorm [i] = (rgbNorm [i] - range -> min [i]) * range -> norm [i]; if (fabs(rgbNorm [i] - mRGBE_MAX) < mRGBE_MIN) /* Normalisation to maxmimum. This must be avoided by offsetting by minimum, otherwise frexp() returns a positive exponent. Normalisation to >mRGBE_MAX is caught by overflow check below */ rgbNorm [i] = mRGBE_RANGE; } /* Mantissa normalisation factor (= RGB maximum) */ mantNorm = max(max(rgbNorm [0], rgbNorm [1]), rgbNorm [2]); /* Get normalised mantissa and exponent to base 2 */ mantNorm = mantNorm < mRGBE_MIN ? 0 : frexp(mantNorm, &exp) * mRGBE_MANTMAX / mantNorm; /* Set RGB integer mantissas, adding excess (zero offset) and rounding up or down, depending on sign. Set sign according to original value. Clamp to mRGBE_MANTOVF to prevent rounding beyond overflow into negative! */ mrgbe.red = min( (int)(sgn(rgb [0], rgbNorm [0] * mantNorm + 0.5) + mRGBE_MANTMAX), mRGBE_MANTOVF ); mrgbe.grn = min( (int)(sgn(rgb [1], rgbNorm [1] * mantNorm + 0.5) + mRGBE_MANTMAX), mRGBE_MANTOVF ); mrgbe.blu = min( (int)(sgn(rgb [2], rgbNorm [2] * mantNorm + 0.5) + mRGBE_MANTMAX), mRGBE_MANTOVF ); /* Drop the exponent sign, since implicitly negative */ mrgbe.exp = abs(exp); /* Set payload data */ mrgbe.dat = data; return mrgbe; #undef sgn } unsigned mRGBEdecode (mRGBE mrgbe, const mRGBERange *range, double rgb [3]) /* Decode mRGBE, returning signed float RGB tuple in array rgb. The * associated payload data is decoded as return value. The supplied range * state must be previously initialised with mRGBEinit(). */ { #define sgn(a, b) ((a) >= mRGBE_MANTMAX ? (b) : -(b)) double mantNorm; if (!range) { fprintf(stderr, "ERROR - mRGBE range not initialised\n"); return 0; } /* Mantissa normalisation factor; exponent is implicitly negative */ mantNorm = ldexp(1.0, -mrgbe.exp) / mRGBE_MANTMAX; /* Decode and set RGB components, subtracting excess (zero offset) and * adding jitter to break up quantisation artefacts. Clamp to -mRGBE_MAX * in case jitter underflows. Finally denormalise and offset to original * range with saved state. */ rgb [0] = max( (mrgbe.red - mRGBE_MANTMAX - sgn(mrgbe.red, 0.5 * drand48())) * mantNorm / range -> norm [0] + sgn(mrgbe.red, range -> min[0]), -mRGBE_MAX ); rgb [1] = max( (mrgbe.grn - mRGBE_MANTMAX - sgn(mrgbe.grn, 0.5 * drand48())) * mantNorm / range -> norm [1] + sgn(mrgbe.grn, range -> min [1]), -mRGBE_MAX ); rgb [2] = max( (mrgbe.blu - mRGBE_MANTMAX - sgn(mrgbe.blu, 0.5 * drand48())) * mantNorm / range -> norm [2] + sgn(mrgbe.blu, range -> min [2]), -mRGBE_MAX ); /* Return payload data */ return mrgbe.dat; #undef sgn } #ifdef mRGBE_TEST /* Build standalone to run unit test */ #define RGBMIN 0.5 #define RGBMAX 1 int main (int argc, char **argv) { double rgb [3] = {0, 0, 0}, rgbDec [3], rgbMin [3] = {0, 0, 0}, rgbMax [3] = {1, 1, 1}, rgbAbs, relDiff, rmse, rmseSum; unsigned numTests, i, j, k, data, dataDec; const short rndState0 [3] = {11, 23, 31}; short encFlag = 0, rndState [3]; mRGBERange mrgbeRange; mRGBE mrgbe; #if 0 rgb [0] = 0.1999; rgb [1] = 0.0751; rgb [2] = 0.0367; rgbMin [0] = 0.190; rgbMin [1] = 0.070; rgbMin [2] = 0.030; rgbMax [0] = 0.983; rgbMax [1] = 0.452; rgbMax [2] = 0.737; mRGBEinit(&mrgbeRange, rgbMin, rgbMax); mrgbe = mRGBEencode(rgb, &mrgbeRange, 0); printf("% 7.4f\t% 7.4f\t% 7.4f\t%4d\t-->\t" "%02d:%02d:%02d:%02d\t-->\t", rgb [0], rgb [1], rgb [2], 0, mrgbe.red, mrgbe.grn, mrgbe.blu, mrgbe.exp ); /* Decode */ dataDec = mRGBEdecode(mrgbe, &mrgbeRange, rgbDec); for (j = rmse = 0; j < 3; j++) { relDiff = 1 - rgbDec [j] / rgb [j]; rmse += relDiff * relDiff; } rmseSum += rmse = sqrt(rmse / 3); printf("% 7.4f\t% 7.4f\t% 7.4f\t%4d\tRMSE = %.1f%%\n", rgbDec [0], rgbDec [1], rgbDec [2], dataDec, 100 * rmse ); return 0; #endif if (argc > 1 && (numTests = atoi(argv [1])) > 0) { /* Test range checks */ mRGBEinit(&mrgbeRange, rgbMin, rgbMax); puts("Check data overflow"); rgb [0] = rgb [1] = rgb [2] = mRGBE_MAX / 2; mRGBEencode(rgb, &mrgbeRange, mRGBE_DATAMAX << 1); puts("\nCheck underflow"); rgb [0] = rgb [1] = rgb [2] = mRGBE_MIN / 2; mRGBEencode(rgb, &mrgbeRange, 0); puts("\nCheck overflow (positive)"); rgb [0] = rgb [1] = rgb [2] = 2 * mRGBE_MAX; mRGBEencode(rgb, &mrgbeRange, 0); puts("\nCheck overflow (negative)"); rgb [0] = rgb [1] = rgb [2] = -2 * mRGBE_MAX; mRGBEencode(rgb, &mrgbeRange, 0); puts("\nCheck empty range"); rgbMax [0] = rgbMax [1] = rgbMax [2] = 0; mRGBEinit(&mrgbeRange, rgbMin, rgbMax); putchar('\n'); rgbMin [0] = rgbMin [1] = rgbMin [2] = RGBMAX; rgbMax [0] = rgbMax [1] = rgbMax [2] = RGBMIN; /* Iterate twice with same random RGB tuples; gather minimum and * maximum in 1st pass, then initialise and run encode/decode tests * in 2nd pass. */ do { /* Initialise RNG state so this can be restored to obtain the same RGB tuple sequence in both passes. This state needs to be kept separate from the RNG used for jittering in the encode/decode routines. */ for (i = 0; i < 3; i++) rndState [i] = rndState0 [i]; /* Random encode vs. decode */ for (k = 0, rmseSum = 0; k < numTests; k++) { data = (unsigned)(mRGBE_DATAMAX * erand48(rndState)); for (i = 0; i < 3; i++) { rgb [i] = (erand48(rndState) > 0.5 ? 1 : -1) * ((RGBMAX - RGBMIN) * erand48(rndState) + RGBMIN); - #if 0 + #if 0 /* Correlate RGB */ if (i > 0) rgb [i] = rgb [0] * (0.1 + 0.9 * erand48(rndState)); #endif } if (encFlag) { /* Encode */ mrgbe = mRGBEencode(rgb, &mrgbeRange, data); printf("% 7.4f\t% 7.4f\t% 7.4f\t%4d\t-->\t" "%02d:%02d:%02d:%02d\t-->\t", rgb [0], rgb [1], rgb [2], data, mrgbe.red, mrgbe.grn, mrgbe.blu, mrgbe.exp ); /* Decode */ dataDec = mRGBEdecode(mrgbe, &mrgbeRange, rgbDec); for (j = rmse = 0; j < 3; j++) { relDiff = 1 - rgbDec [j] / rgb [j]; rmse += relDiff * relDiff; } rmseSum += rmse = sqrt(rmse / 3); printf("% 7.4f\t% 7.4f\t% 7.4f\t%4d\tRMSE = %.1f%%\n", rgbDec [0], rgbDec [1], rgbDec [2], dataDec, 100 * rmse ); } else { /* Update RGB minimum and maximum */ for (i = 0; i < 3; i++) { rgbAbs = fabs(rgb [i]); if (rgbAbs > rgbMax [i]) rgbMax [i] = rgbAbs; if (rgbAbs < rgbMin [i]) rgbMin [i] = rgbAbs; } } } /* Dump results */ if (!encFlag) { /* Initialise mRGBE encoding state with min/max */ if (!mRGBEinit(&mrgbeRange, rgbMin, rgbMax)) return -1; printf( "RGB Range = [%.3f, %.3f, %.3f] - [%.3f, %.3f, %.3f]\n\n", rgbMin [0], rgbMin [1], rgbMin [2], rgbMax [0], rgbMax [1], rgbMax [2] ); } else printf("\nAvg RMSE = %.1f%%\n", 100 * rmseSum / numTests); } while (encFlag = !encFlag); return 0; } else { printf("Usage: %s \n", argv [0]); return -1; } } #endif