This is surface.c in view mode; [Download] [Up]
/*
* surface.c
*
* Copyright (C) 1989, 1991, Craig E. Kolb
* 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 "atmosphere.h"
#include "surface.h"
#define blend(a, b, p, q) (a * p + b * q)
Color Black = {0., 0., 0.};
/*
* Create and return pointer to surface with given properties.
*/
Surface *
SurfaceCreate()
{
Surface *stmp;
stmp = (Surface *)Malloc(sizeof(Surface));
stmp->amb = stmp->diff = stmp->spec = Black;
stmp->coef = stmp->refl = stmp->transp =
stmp->translucency = stmp->stcoef = 0.;
stmp->kref = DEFAULT_INDEX;
stmp->noshadow = FALSE;
stmp->name = (char *)NULL;
stmp->atmos = (Atmosphere *)NULL;
stmp->next = (Surface *)NULL;
return stmp;
}
Surface *
SurfaceCopy(surf)
Surface *surf;
{
Surface *res;
if (!surf)
return (Surface *)NULL;
res = SurfaceCreate();
*res = *surf;
res->next = (Surface *)NULL;
res->name = (char *)NULL;
/* Also have to copy atmospheric effects.*/
res->atmos = AtmosphereCopy(surf->atmos);
return res;
}
/*
* Compute combination of two surfaces. Resulting surface is copied into surf1.
*/
void
SurfaceBlend(surf1, surf2, p, q)
Surface *surf1, *surf2;
Float p, q;
{
/*
* P is weight of surf1. q is weight of surf2.
* Result is placed in surf1.
*/
ColorBlend(&surf1->amb, &surf2->amb, p, q);
ColorBlend(&surf1->diff, &surf2->diff, p, q);
ColorBlend(&surf1->spec, &surf2->spec, p, q);
surf1->coef = blend(surf1->coef, surf2->coef, p, q);
surf1->refl = blend(surf1->refl, surf2->refl, p, q);
surf1->transp = blend(surf1->transp, surf2->transp, p, q);
surf1->kref = blend(surf1->kref, surf2->kref, p, q);
surf1->atmos = (Atmosphere *)NULL; /* Punt */
}
/*
* Blend two colors. Result is placed in color1.
*/
void
ColorBlend(color1, color2, p, q)
Color *color1, *color2;
Float p, q;
{
color1->r = blend(color1->r, color2->r, p, q);
color1->g = blend(color1->g, color2->g, p, q);
color1->b = blend(color1->b, color2->b, p, q);
}
SurfList *
SurfPop(list)
SurfList *list;
{
SurfList *stmp = list->next;
free((voidstar)list);
return stmp;
}
SurfList *
SurfPush(surf, list)
Surface *surf;
SurfList *list;
{
SurfList *stmp;
stmp = (SurfList *)Malloc(sizeof(SurfList));
stmp->surf = surf;
stmp->next = list;
return stmp;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.