-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathEscenaIncompleta.h
executable file
·180 lines (142 loc) · 4.34 KB
/
EscenaIncompleta.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
/** PRACTICA DE TRAZADO DE RAYOS
Prof: R.Vivó, J.Lluch para GPC.etsinf.upv.es 2011
Alumno: **/
#ifndef _ESCENA_H
#define _ESCENA_H
#include "Primitivas.h"
#include <vector>
using namespace std;
#define INFINITO 3.4E38f
/** EJEMPLO DE ESTRUCTURA DE CLASES
class Poligono; //Deriva de Primitiva
class Cuadrilatero;
class Triangulo;
class Objeto;
class Esfera;
class Poliedro;
class Caja;
class FuenteLuminosa;
class Ambiental;
class Puntual;
class Direccional;
class Focalizada;
class Escena;
***********************************/
//Objeto gráfico con volumen
class Objeto{
public:
Color colDifuso, colEspecular; // Colores difuso y especular
float ka, kd, ks; // Constantes ambiental, difusa y especular
int m; // Parámetro de la reflexión especular
Objeto();
virtual ~Objeto();
virtual Vector normal(Punto p)const; //Devuelve la normal en p
virtual int rayIntersection(Punto p, Vector v, float &t)const; //Devuelve si hay (1) o no interseccion (0).
//Si hay, se produce en P(t)= p+v*t
void setColor(Color cd,
Color ce = Color::BLANCO,
float Ka = 0.3f,
float Kd = 0.8f,
float Ks = 0.3f,
int em = 1);
};
class Esfera: public Objeto{
protected:
Punto centro;
float radio;
public:
Esfera();
~Esfera();
Esfera(Punto centro, float radio, Transformacion t=Transformacion()); // Constructor (centro, radio, escalado)
Vector normal(Punto p)const;
int rayIntersection(Punto p, Vector v, float &t)const;
};
class Poliedro: public Objeto{
public:
vector<Poligono> caras;
};
class Caja: public Poliedro{
protected:
public:
Caja(Transformacion);
Caja(Punto caras[]);
~Caja();
Vector normal(Punto p) const;
int rayIntersection(Punto p, Vector v, float &t) const;
};
/****** DESCOMENTAR PARA LA PRÁCTICA 4.3 ******/
#define ON 1
#define OFF 0
class FuenteLuminosa {
protected:
Color I;
int encendida;
Punto posicion;
public:
FuenteLuminosa();
FuenteLuminosa(Color intensidad,Punto pos=Punto()); //Constructor
virtual Color intensity(Punto p)const; //Devuelve la intensidad vista desde p
virtual Vector L(Punto p)const; //Vector unitario desde p hacia la luz
void setColor(Color c); //Fija el color (intensidad)
Punto position() const; //Devuelve la posición de la luz
void setPosition(Punto pos); //Fija la posicion de la luz
void switchLight(int); //Enciende (1) o apaga (0)
int switchOn()const; //Devuelve el estado de la luz (1) encendida, (0) apagada
};
class Ambiental: public FuenteLuminosa{
public:
Ambiental();
Vector L(Punto p)const;
};
class Puntual: public FuenteLuminosa{
public:
Puntual();
Puntual(Color c, Punto pos=Punto());
};
class Direccional: public FuenteLuminosa{
protected:
Vector direccion;
public:
Direccional();
Direccional(Color intens, Vector direc=Vector(0,-1,0));
void setDirection(Vector d);
Vector L(Punto p)const;
};
class Focalizada: public FuenteLuminosa{
protected:
Vector direccion; // Dirección de central del foco
double p; // Parámetro que regula la distribución de la
// intensidad en el foco, según el modelo de Warn
double semiapertura;// Coseno entre el eje y la generatriz del cono
public:
Focalizada();
Focalizada(Color inten,Punto posic,Vector direc,double concentracion,double angulo);
Color intensity(Punto pt)const;
void setShape(Vector dir, double concentracion, double angulo);
};
/******** DESCOMENTAR PARA LA PRACTICA 4.3 ******/
class Escena{
protected:
//Añade aquí tu código. La escena debe manejar los objetos (y las luces en 4.3)
vector<Objeto *> objetos;
vector<FuenteLuminosa *> luces;
public:
//Añade aquí tu código. Métodos públicos sobre Escena
int shadowsOn;
int reflexOn;
int maxReflex;
Escena(){
shadowsOn = 1;
reflexOn = 1;
maxReflex = 2;
}
int add(Objeto *o); //Añade un objeto a la lista manejada por la escena
int addLight(FuenteLuminosa *fl);
Color rayTrace(Punto inicio, Vector direccion, int numReflex) const; //Trazador (recursivo en practica 4.4)
FuenteLuminosa *getLight(int pos) const {
return luces[pos];
}
void switchShadows(int onoff){ shadowsOn = onoff; }
void switchReflex(int onoff){ reflexOn = onoff; }
};
#endif