This is textaux.c in view mode; [Download] [Up]
/* * textaux.c * * Copyright (C) 1989, 1991, Craig E. Kolb, Rod G. Bogart, Robert F. Skinner * All rights reserved. * * This software may be freely copied, modified, and redistributed * provided that this copyright notice is preserved on all copies. * * You may not distribute this software, in whole or in part, as part of * any commercial product without the express consent of the authors. * * There is no warranty or other guarantee of fitness of this software * for any purpose. It is provided solely "as is". * * $Id$ * * $Log$ */ #include "texture.h" Color * ColormapRead(filename) char *filename; { FILE *fp; Color *map; char buf[BUFSIZ]; int r, g, b, i, num; fp = fopen(filename, "r"); if (fp == (FILE *)NULL) { RLerror(RL_ABORT, "Cannot open colormap file \"%s\".\n", filename); return (Color *)NULL; } map = (Color *)Calloc(256, sizeof(Color)); for (i = 0; fgets(buf,BUFSIZ,fp) != NULL && i < 256; i++) { num = sscanf(buf,"%d %d %d", &r, &g, &b); if (num != 3) { RLerror(RL_ABORT, "%s, line %d: Bad color specification.\n", filename, i+1); return (Color *)NULL; } map[i].r = (Float)r; map[i].g = (Float)g; map[i].b = (Float)b; ColorScale(1. / 255., map[i], &map[i]); } (void)fclose(fp); return map; } Float Marble(vec) Vector *vec; { Float i; i = sin(8. * Chaos(vec, 6) + 7. * vec->z) + 1; return pow(0.5 * i, 0.77); } Float Chaos(vec, octaves) Vector *vec; int octaves; { Float s, t; Vector tp; s = 1.0; t = 0.; tp = *vec; while (octaves--) { t += Noise3(&tp) * s; s *= 0.5; tp.x *= 2.; tp.y *= 2.; tp.z *= 2.; } return t; } void VfBm(vec, omega, lambda, octaves, ans) Vector *vec, *ans; Float omega, lambda; int octaves; { Float o; Vector tp, n; ans->x = ans->y = ans->z = 0.; tp = *vec; o = 1.; while (octaves--) { DNoise3(&tp, &n); ans->x += o * n.x; ans->y += o * n.y; ans->z += o * n.z; o *= omega; if (o < EPSILON) break; tp.x *= lambda; tp.y *= lambda; tp.z *= lambda; } } Float fBm(vec, omega, lambda, octaves) register Vector *vec; Float omega, lambda; int octaves; { Float a, o; Vector tp; a = 0; o = 1.; tp = *vec; while (octaves--) { a += o * Noise3(&tp); tp.x *= lambda; tp.y *= lambda; tp.z *= lambda; o *= omega; } return a; } int TileValue(tileu, tilev, u, v) Float tileu, tilev, u, v; { /* * If both tileu and tilev are zero, the pattern is repeated infinitly. * XXXXXX * XXXXXX tileu=0 tilev=0 * XXXXXX * XXXXXX * If one is positive and the other is zero, the pattern is infinite * in one direction and limited in the other. * ++++++ * XXXXXX tileu=0 tilev=1 * ++++++ * ++++++ * If both are positive, the pattern is limited in both directions. * ++++++ * +++XX+ tileu=2 tilev=1 * ++++++ * ++++++ * If one is negative and the other is zero, the pattern is the * inverse of the positive/zero case. * XXXXXX * ++++++ tileu=0 tilev=-1 * XXXXXX * XXXXXX * If one is negative and the other is positive, the pattern is like * negative/zero, but limited in one direction. * +++XX+ * ++++++ tileu=2 tilev=-1 * +++XX+ * +++XX+ * If both are negative, the pattern is the inverse of the * positive/positive case (a rectangular hole). * XXXXXX * XXX++X tileu=-2 tilev=-1 * XXXXXX * XXXXXX */ if ((tileu < 0.001) && (tileu > -0.001) && (tilev < 0.001) && (tilev > -0.001)) /* zero/zero */ return FALSE; if ((tileu < -0.001) && (tilev < -0.001) && ((u > -tileu) || (u < 0) || (v > -tilev) || (v < 0))) /* negative/negative */ return FALSE; if ((tileu > 0.001) && ((u > tileu) || (u < 0))) /* positive/whatever */ return TRUE; if ((tilev > 0.001) && ((v > tilev) || (v < 0))) /* whatever/positive */ return TRUE; if ((tileu < -0.001) && (u < -tileu) && (u > 0)) /* negative/whatever */ return TRUE; if ((tilev < -0.001) && (v < -tilev) && (v > 0)) /* whatever/negative */ return TRUE; return FALSE; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.