Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
Submission for
Third Annual ICFP Programming Contest
Entry data
==========
Team name: PLClubIN
Captain: Jerome Vouillon
Postal address:
University of Pennsylvania
Dept. of Computer & Information Science
200 South 33rd Street
Philadelphia, PA 19104-6389
Team members:
Vladimir Gapeyev
Haruo Hosoya
Eijiro Sumii
Programming language: OCaml 3.00
GML tier implemented: 3
Differences among our submissions
=================================
We have four submissions: PLClubIN, PLClubIP, PLClubCN, and PLClubCP,
which (we believe) are significantly different in two orthogonal
aspects:
- Compiler vs. interpreter: PLClubIN and PLClubIP _interpret_ a GML
program, while PLClubCN and PLClubCP first translate it into a Caml
program and then _compile_ it into a binary at runtime.
- With vs. without interpolation: PLClubIN and PLClubCN computes all
pixels by ray tracing, while PLClubIP and PLClubCP first compute a
subset of the pixels and then interpolate the other pixels (if
possible).
Below is relevant to only this submission (PLClubIN, Interpreter with
No interpolation).
Our optimizations
=================
- De Bruijn indices: the interpreter uses an environment stack
besides the execution stack, and accesses the variables by their
precomputed indices.
- Bounding spheres: objects are grouped to a certain heuristics, and
each group of objects is bound by a virtual sphere, so that
several intersection checks can be replaced by one intersection check.
- Constant function detection: when the renderer calls a surface
function, it checks whether the function uses its arguments: if not,
the function is a constant function, so the renderer substitutes
that surface function with the constant.
- Inlining of free variables: when the above constant function detection
fails, the renderer inlines the values of the free variables
of the function. (These two optimizations are applied "lazily", that is,
only if the surface function is actually called by the renderer.)
New examples
============
We created the following new examples, found in src/examples/.
glass.gml
A metal wine glass (unfortunately not transparent) illuminated by a
spot light.
spoon.gml
A rotating spoon. (This generates 18 ppm files. If you have
"animate" program from ImageMagik, type "animate spoon*.ppm".)
bumps.gml
Two arrays of blue and red spheres stacked above each other and a mirror.