VIEWER = feh
CC = gcc
+EXEEXT =
CFLAGS = -std=c99 -O2 -g -pg
CPPFLAGS= -MMD $(IUSE:%=-D%)
LDLIBS = -lm
SRCS = main.c array.c common.c list.c model.c raster.c rbtree.c scene.c
OBJS = $(SRCS:%.c=%.o)
DEPS = $(OBJS:%.o=%.d)
+PROG = $(PROJECT)$(EXEEXT)
-all: $(PROJECT)
+all: $(PROG)
-$(PROJECT): $(OBJS)
+$(PROG): $(OBJS)
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LDLIBS)
clean:
- rm -f $(PROJECT) $(OBJS) $(DEPS)
+ rm -f $(PROG) $(OBJS) $(DEPS)
distclean: clean
rm -f tags gmon.out
dist:
git archive HEAD --prefix=$(PROJECT)/ --output=$(PROJECT).zip
-run: $(PROJECT)
+run: $(PROG)
./$< && $(VIEWER) scene.ppm
-debug: $(PROJECT)
+debug: $(PROG)
gdb ./$<
-include $(DEPS)
To build, just `make' it. You will need GNU make; it won't work well with any
other kind of make(1). Once built, the executable is called rasterize.
+Caveats:
+
+1. I happened to do Phong interpolation a little differently (i.e. not as
+good) compared to what is described in the project handout. Instead of
+calculating the lighting vectors in eye-coordinates, I did it all in world
+coordinates. So I had to save the camera position (already in world
+coordinates) from the scene file and transform each point vector of the
+geometry by just the view matrix. Anyway, the results look a little bit
+different than the provide images, so maybe I didn't do it quite right.
+
+2. Contrary to the specification, the geometry color is not overridden by a
+texture map in this implementation. Rather, the geometry color is
+multiplied by the texture color, so blending can work with texture mapping.
+
+3. The PPM importer doesn't handle comments, and the BMP importer is also
+quite picky about the depth and color space, though importing will fail
+without any useful explanation.
+
Known to run on:
- * Linux 3.2.1-gentoo
- * NetBSD 5.1.2
+ * Linux 3.2.1-gentoo (x86_64)
+ * NetBSD 5.1.2 (amd64)
* Darwin 10.8.0 (in the Mac lab)
+ * Win32 (tried with i686-mingw32-gcc)
for (int y = h - 1; y >= 0; --y) {
for (int x = 0; x < w; ++x) {
- rgbachan_t r, g, b;
- if (fscanf(file, "%hhu %hhu %hhu ", &r, &g, &b) != 3) {
+ uint16_t r, g, b;
+ /* mingw32 does not like %hhu conversion type */
+ if (fscanf(file, "%hu %hu %hu ", &r, &g, &b) != 3) {
fprintf(stderr, "Failed reading color values from %s: %s\n", filename, strerror(errno));
return NULL;
}
- rgba_t rgba = PACK(rgba, 3, r);
- rgba = PACK(rgba, 2, g);
- rgba = PACK(rgba, 1, b);
+ rgba_t rgba = PACK(rgba, 3, (uint8_t)r);
+ rgba = PACK(rgba, 2, (uint8_t)g);
+ rgba = PACK(rgba, 1, (uint8_t)b);
rgba = PACK(rgba, 0, 255);
p->pixels[y * w + x] = color_from_rgba(rgba);
}