2017-04-26 17:20:15 +02:00
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* Copyright (c) 1994 Stanford University */
|
|
|
|
/* */
|
|
|
|
/* All rights reserved. */
|
|
|
|
/* */
|
|
|
|
/* Permission is given to use, copy, and modify this software for any */
|
|
|
|
/* non-commercial purpose as long as this copyright notice is not */
|
|
|
|
/* removed. All other uses, including redistribution in whole or in */
|
|
|
|
/* part, are forbidden without prior written permission. */
|
|
|
|
/* */
|
|
|
|
/* This software is provided with absolutely no warranty and no */
|
|
|
|
/* support. */
|
|
|
|
/* */
|
|
|
|
/*************************************************************************/
|
|
|
|
|
|
|
|
/************************************************************************
|
|
|
|
*
|
|
|
|
* Model definition & management.
|
|
|
|
*
|
|
|
|
* This module has the following functions:
|
|
|
|
* (1) Create modeling tasks.
|
|
|
|
* (2) Process modeling tasks.
|
|
|
|
*
|
|
|
|
*************************************************************************/
|
|
|
|
|
2017-04-26 18:03:02 +02:00
|
|
|
#include <stdio.h>
|
2017-04-26 17:20:15 +02:00
|
|
|
|
|
|
|
EXTERN_ENV;
|
|
|
|
|
|
|
|
include(radiosity.h)
|
|
|
|
|
|
|
|
static void init_test_model_tasks(long process_id);
|
|
|
|
static void init_room_model_tasks(ModelDataBase *model, long process_id);
|
|
|
|
static void process_triangle(Model_Triangle *model, long process_id);
|
|
|
|
static void process_rectangle(Model_Rectangle *model, long process_id);
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
|
|
*
|
|
|
|
* Test Model definitions.
|
|
|
|
*
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
#define WHITE { 0.9, 0.9, 0.9 }
|
|
|
|
#define GREEN { 0.1, 0.9, 0.1 }
|
|
|
|
#define PASSIVE { 0.0, 0.0, 0.0 }
|
|
|
|
#define WHITE_LIGHT { 200.0, 200.0, 200.0 }
|
|
|
|
|
|
|
|
Model_Triangle tri1 = { WHITE,
|
|
|
|
PASSIVE,
|
|
|
|
{ 0.0, 0.0, 0.0 },
|
|
|
|
{ 100.0, 0.0, 0.0 },
|
|
|
|
{ 0.0, 100.0, 0.0 } } ;
|
|
|
|
|
|
|
|
Model_Triangle tri2 = { WHITE,
|
|
|
|
PASSIVE,
|
|
|
|
{ 0.0, 0.0, 100.0 },
|
|
|
|
{ 100.0, 100.0, 0.0 },
|
|
|
|
{ 0.0, 0.0, -100.0 } } ;
|
|
|
|
|
|
|
|
Model_Rectangle Floor = { WHITE,
|
|
|
|
PASSIVE,
|
|
|
|
{ 600.0, -600.0, 700.0 },
|
|
|
|
{ 600.0, -600.0, -700.0 },
|
|
|
|
{ -800.0, -600.0, 700.0 } } ;
|
|
|
|
|
|
|
|
Model_Rectangle Ceiling = { WHITE,
|
|
|
|
PASSIVE,
|
|
|
|
{ 600.0, 600.0, 700.0 },
|
|
|
|
{ -800.0, 600.0, 700.0 },
|
|
|
|
{ 600.0, 600.0, -700.0 } } ;
|
|
|
|
|
|
|
|
Model_Rectangle wall1 = { WHITE,
|
|
|
|
PASSIVE,
|
|
|
|
{ -800.0, -600.0, 700.0 },
|
|
|
|
{ -800.0, -600.0, -700.0 },
|
|
|
|
{ -800.0, 600.0, 700.0 } } ;
|
|
|
|
|
|
|
|
Model_Rectangle wall2 = { WHITE,
|
|
|
|
PASSIVE,
|
|
|
|
{ 600.0, -600.0, -700.0 },
|
|
|
|
{ 600.0, 600.0, -700.0 },
|
|
|
|
{ -800.0, -600.0, -700.0 } } ;
|
|
|
|
|
|
|
|
Model_Rectangle deskTop = { GREEN,
|
|
|
|
PASSIVE,
|
|
|
|
{ -795.0, -320.0, 300.0 },
|
|
|
|
{ -400.0, -320.0, 300.0 },
|
|
|
|
{ -795.0, -320.0, -300.0 } } ;
|
|
|
|
|
|
|
|
Model_Rectangle deskBtm = { GREEN,
|
|
|
|
PASSIVE,
|
|
|
|
{ -795.0, -340.0, 300.0 },
|
|
|
|
{ -795.0, -340.0, -300.0 },
|
|
|
|
{ -400.0, -340.0, 300.0 } } ;
|
|
|
|
|
|
|
|
Model_Rectangle light1 = { WHITE,
|
|
|
|
WHITE_LIGHT,
|
|
|
|
{ -795.0, -50.0, 50.0 },
|
|
|
|
{ -795.0, -50.0, -50.0 },
|
|
|
|
{ -795.0, 50.0, 50.0 } } ;
|
|
|
|
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
|
|
****************************************************************************
|
|
|
|
*
|
|
|
|
* Methods of Model object
|
|
|
|
*
|
|
|
|
****************************************************************************
|
|
|
|
****************************************************************************/
|
|
|
|
/***************************************************************************
|
|
|
|
*
|
|
|
|
* init_modeling_tasks()
|
|
|
|
*
|
|
|
|
* Initialize modeling task.
|
|
|
|
*
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
long model_selector = MODEL_TEST_DATA ;
|
|
|
|
|
|
|
|
void init_modeling_tasks(long process_id)
|
|
|
|
{
|
|
|
|
|
|
|
|
extern ModelDataBase room_model[] ;
|
|
|
|
extern ModelDataBase largeroom_model[] ;
|
|
|
|
|
2017-04-26 18:03:02 +02:00
|
|
|
if( ! check_task_counter() )
|
2017-04-26 17:20:15 +02:00
|
|
|
return ;
|
|
|
|
|
|
|
|
switch( model_selector )
|
|
|
|
{
|
|
|
|
case MODEL_TEST_DATA:
|
|
|
|
default:
|
|
|
|
init_test_model_tasks(process_id) ;
|
|
|
|
break ;
|
|
|
|
case MODEL_ROOM_DATA:
|
|
|
|
init_room_model_tasks( room_model, process_id ) ;
|
|
|
|
break ;
|
|
|
|
case MODEL_LARGEROOM_DATA:
|
|
|
|
init_room_model_tasks( largeroom_model, process_id ) ;
|
|
|
|
break ;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void init_test_model_tasks(long process_id)
|
|
|
|
{
|
|
|
|
create_modeling_task( (Model*)&Floor, MODEL_RECTANGLE, process_id ) ;
|
|
|
|
create_modeling_task( (Model*)&Ceiling, MODEL_RECTANGLE, process_id ) ;
|
|
|
|
create_modeling_task( (Model*)&wall1, MODEL_RECTANGLE, process_id ) ;
|
|
|
|
create_modeling_task( (Model*)&wall2, MODEL_RECTANGLE, process_id ) ;
|
|
|
|
create_modeling_task( (Model*)&deskTop, MODEL_RECTANGLE, process_id ) ;
|
|
|
|
create_modeling_task( (Model*)&deskBtm, MODEL_RECTANGLE, process_id ) ;
|
|
|
|
create_modeling_task( (Model*)&light1, MODEL_RECTANGLE, process_id ) ;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void init_room_model_tasks(ModelDataBase *model, long process_id)
|
|
|
|
{
|
|
|
|
ModelDataBase *pm ;
|
|
|
|
|
2017-04-26 18:03:02 +02:00
|
|
|
for( pm = model ; pm->type != MODEL_NULL ; pm++ )
|
2017-04-26 17:20:15 +02:00
|
|
|
create_modeling_task( &pm->model, pm->type, process_id ) ;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
|
|
*
|
|
|
|
* process_model()
|
|
|
|
*
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
void process_model(Model *model, long type, long process_id)
|
|
|
|
{
|
|
|
|
switch( type )
|
|
|
|
{
|
|
|
|
case MODEL_TRIANGLE:
|
|
|
|
process_triangle( (Model_Triangle *)model, process_id ) ;
|
|
|
|
break ;
|
|
|
|
case MODEL_RECTANGLE:
|
|
|
|
process_rectangle( (Model_Rectangle *)model, process_id ) ;
|
|
|
|
break ;
|
|
|
|
default:
|
|
|
|
fprintf( stderr, "Panic:process_model:Illegal type %ld\n", type ) ;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
|
|
*
|
|
|
|
* process_triangle()
|
|
|
|
*
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
static void process_triangle(Model_Triangle *model, long process_id)
|
|
|
|
{
|
|
|
|
Patch *p ;
|
|
|
|
float length ;
|
|
|
|
|
|
|
|
/* Create a patch */
|
|
|
|
p = get_patch(process_id) ;
|
|
|
|
|
|
|
|
/* (1) Set the Vertecies */
|
|
|
|
p->p1 = model->p1 ;
|
|
|
|
p->p2 = model->p2 ;
|
|
|
|
p->p3 = model->p3 ;
|
|
|
|
|
|
|
|
/* (2) Create the Edges */
|
|
|
|
p->ev1 = create_elemvertex( &p->p1, process_id ) ;
|
|
|
|
p->ev2 = create_elemvertex( &p->p2, process_id ) ;
|
|
|
|
p->ev3 = create_elemvertex( &p->p3, process_id ) ;
|
|
|
|
p->e12 = create_edge( p->ev1, p->ev2, process_id ) ;
|
|
|
|
p->e23 = create_edge( p->ev2, p->ev3, process_id ) ;
|
|
|
|
p->e31 = create_edge( p->ev3, p->ev1, process_id ) ;
|
|
|
|
|
|
|
|
/* (3) Other patch properties */
|
|
|
|
length = comp_plane_equ( &p->plane_equ,
|
|
|
|
&model->p1, &model->p2, &model->p3, process_id ) ;
|
|
|
|
p->area = length * (float)0.5 ;
|
|
|
|
p->color = model->color ;
|
|
|
|
p->emittance = model->emittance ;
|
|
|
|
|
|
|
|
|
|
|
|
/* Create a BSP insertion task */
|
|
|
|
create_bsp_task( p, global->bsp_root, process_id ) ;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/***************************************************************************
|
|
|
|
*
|
|
|
|
* process_rectangle()
|
|
|
|
*
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
static void process_rectangle(Model_Rectangle *model, long process_id)
|
|
|
|
{
|
|
|
|
Patch *p, *q ;
|
|
|
|
float length ;
|
|
|
|
|
|
|
|
/* Create a patch (P1-P2-P3) */
|
|
|
|
p = get_patch(process_id) ;
|
|
|
|
|
|
|
|
/* (1) Set the Vertecies */
|
|
|
|
p->p1 = model->p1 ;
|
|
|
|
p->p2 = model->p2 ;
|
|
|
|
p->p3 = model->p3 ;
|
|
|
|
|
|
|
|
/* (2) Create the Edges */
|
|
|
|
p->ev1 = create_elemvertex( &p->p1, process_id ) ;
|
|
|
|
p->ev2 = create_elemvertex( &p->p2, process_id ) ;
|
|
|
|
p->ev3 = create_elemvertex( &p->p3, process_id ) ;
|
|
|
|
p->e12 = create_edge( p->ev1, p->ev2, process_id ) ;
|
|
|
|
p->e23 = create_edge( p->ev2, p->ev3, process_id ) ;
|
|
|
|
p->e31 = create_edge( p->ev3, p->ev1, process_id ) ;
|
|
|
|
|
|
|
|
/* (3) Other patch properties */
|
|
|
|
length = comp_plane_equ( &p->plane_equ,
|
|
|
|
&model->p1, &model->p2, &model->p3, process_id ) ;
|
|
|
|
p->area = length * (float)0.5 ;
|
|
|
|
p->color = model->color ;
|
|
|
|
p->emittance= model->emittance ;
|
|
|
|
|
|
|
|
|
|
|
|
/* Create a patch (P(2+3-1)-P3-P2) */
|
|
|
|
q = get_patch(process_id) ;
|
|
|
|
|
|
|
|
/* (1) Set the Vertices */
|
|
|
|
q->p1.x = model->p2.x + model->p3.x - model->p1.x ;
|
|
|
|
q->p1.y = model->p2.y + model->p3.y - model->p1.y ;
|
|
|
|
q->p1.z = model->p2.z + model->p3.z - model->p1.z ;
|
|
|
|
q->p2 = model->p3 ;
|
|
|
|
q->p3 = model->p2 ;
|
|
|
|
|
|
|
|
/* (2) Create the Edges */
|
|
|
|
q->ev1 = create_elemvertex( &q->p1, process_id ) ;
|
|
|
|
q->ev2 = p->ev3 ;
|
|
|
|
q->ev3 = p->ev2 ;
|
|
|
|
q->e12 = create_edge( q->ev1, q->ev2, process_id ) ;
|
|
|
|
q->e23 = p->e23 ;
|
|
|
|
q->e31 = create_edge( q->ev3, q->ev1, process_id ) ;
|
|
|
|
|
|
|
|
/* (3) Other patch properties */
|
|
|
|
q->plane_equ= p->plane_equ ;
|
|
|
|
q->area = p->area ;
|
|
|
|
q->color = p->color ;
|
|
|
|
q->emittance= p->emittance ;
|
|
|
|
|
|
|
|
/* Create BSP insertion tasks */
|
|
|
|
create_bsp_task( p, global->bsp_root, process_id ) ;
|
|
|
|
create_bsp_task( q, global->bsp_root, process_id ) ;
|
|
|
|
}
|
|
|
|
|
|
|
|
|