// Last edited on 2003-12-10 23:56:17 by stolfi

// ============================================================================
// MC930A - Computacao Grafica    =============================================
// Eduardo Uemura Okada RA 001606 =============================================
// Laboratorio XX                 =============================================
// ============================================================================

// ============================================================================
// Declaracao de constantes ===================================================
// ============================================================================

#declare bz_name = "Homer Simpson"

#declare bz_scale = 0.36;
#include "bz-things.inc"

// Modos de texturas
#declare MODO_SOLIDO  = 0;
#declare MODO_CRISTAL = 1;
#declare MODO_ESPELHO = 2;
#declare MODO_VIDRO   = 3;

// Normais para os planos
#declare P_EIXO_X = <0,1,0>;
#declare P_EIXO_Y = <1,0,0>;
#declare P_EIXO_Z = <0,0,1>;

// ============================================================================
// Declaracao de macros utilitarias e texturas ================================
// ============================================================================

#macro TexturaSolida ( Cor )
texture {
	pigment { color rgb Cor }
	finish { diffuse 0.5 specular 0.5 roughness 0.005 ambient 0.1 } 
}
#end

#macro TexturaCristal ( Cor )
texture {
	finish { ambient 0.1 diffuse 0.1 reflection 0.25 specular 1 roughness 0.001 }
	pigment { color Cor filter 1 }
}
interior { ior 1.5 }
#end

#macro TexturaEspelho ( Cor )
texture { 
	finish { ambient 0.05 diffuse 0.05 reflection Cor specular 0.20 roughness 0.05 }
	pigment { rgb Cor }
}
#end

#macro TexturaVidro ( Cor )
texture {
	pigment { color Cor filter 1.05 }
	finish { phong 0.9 phong_size 40 reflection 0.2 }
}
interior { ior 1.53 }
#end


#macro SelecionaCor ( Cor, Modo )
        #switch ( Modo )
                #case ( MODO_SOLIDO )
                        TexturaSolida (Cor)
                #break
                #case ( MODO_CRISTAL )
                        TexturaCristal (Cor)
                #break
                #case ( MODO_ESPELHO )
                        TexturaEspelho (Cor)
                #break
		#case ( MODO_VIDRO )
			TexturaVidro (Cor)
		#break
        #end
#end

#macro Camera ( Visao, Alvo )
camera { location Visao right -0.75*x up 1.00*y sky y look_at Alvo }
#end

#macro FonteLuz ( Posicao, Cor, Intensidade )
light_source { Posicao color rgb Intensidade * Cor }
#end

#macro Plano ( Tipo, Posicao, Cor1, Cor2 )
plane { Tipo, Posicao pigment { checker color rgb Cor1 color rgb Cor2 } }
#end

// ============================================================================
// Declaracao de macros e objetos basicos =====================================
// ============================================================================
// Todos os objetos gerados ao redor de <0,0,0>                

#macro Paralelepipedo ( Tam, Cor, Modo, Rotacao, Posicao )
box { -Tam/2 Tam/2 SelecionaCor ( Cor, Modo ) rotate Rotacao translate Posicao }
#end

#macro Cone ( Base, Topo, Altura, Cor, Modo, Rotacao, Posicao )
cone {
	< 0, -Altura/2, 0>, Base < 0, Altura/2, 0>, Topo SelecionaCor ( Cor, Modo )
	rotate Rotacao translate Posicao
}
#end

#macro Cilindro ( Altura, Raio, Cor, Modo, Rotacao, Posicao )
cylinder {
	< 0, -Altura/2, 0 >, < 0, Altura/2, 0 >, Raio SelecionaCor ( Cor, Modo )
	rotate Rotacao translate Posicao
}
#end

#macro Torus ( Menor, Maior, Cor, Modo, Rotacao, Posicao )
torus { Maior, Menor SelecionaCor ( Cor, Modo ) rotate Rotacao translate Posicao }
#end

#macro Esfera ( Raio, Cor, Modo, Rotacao, Posicao )
sphere { <0,0,0>, Raio SelecionaCor ( Cor, Modo ) rotate Rotacao translate Posicao }
#end

#macro Texto ( Dado, Fonte, Grossura, Espaco, Cor, Modo, Rotacao, Posicao )
text {
	ttf Fonte Dado Grossura,Espaco SelecionaCor ( Cor, Modo )
	rotate Rotacao translate Posicao
}
#end

// ============================================================================
// Montagem de pecas compostas ================================================
// ============================================================================

#macro SemiEsfera ( Raio, Cor, Modo, Rotacao, Posicao )
difference {
	Esfera ( Raio, Cor, Modo, <0,0,0>, <0,-Raio/2,0> )
	Paralelepipedo ( <Raio*2+2,Raio*2+2,Raio*2+2>, Cor, Modo, <0,0,0>, < 0,-Raio/2-Raio-1,0 >)
	SelecionaCor ( Cor, Modo ) rotate Rotacao translate Posicao
}
#end

#macro OrbitaEsferas ( Raio, Orbita, Passos, Cor, Modo, Rotacao, Posicao )
#declare angulo = 0;
union {
	#while ( angulo < 2*pi )
		Esfera ( Raio, Cor, Modo, <0,0,0>, <Orbita*cos(angulo),Orbita*sin(angulo),0> )
		#declare angulo = angulo + 2*pi/Passos;
	#end
	SelecionaCor ( Cor, Modo ) rotate Rotacao translate Posicao
}
#end

#declare CorLuz = <0.95,0.95,0.95>;
#declare CorCabo = <0.8,0.8,0.8>;
#declare CorContato = <0.1,0.1,0.1>;
#macro Lampada ( Altura, Raio, Intensidade, Cor, Modo, Rotacao, Posicao )
union {
	// Bulbo
	lathe {
		cubic_spline 17,
		<0,0>,<1,0.2>,<1.8,1>,<1.9,2>,<1.5,3>,<1,4>,<0.8,5>,<0,5>,
		<0,4.1>,<0.7,4.1>,<0.9,4>,<1.4,3>,<1.8,2>,<1.7,1>,<0.9,0.2>,<0,0.1>,<0,0>
		SelecionaCor ( Cor, Modo )
	}
	// Cabo
	lathe {
		cubic_spline 14,
		<0,4.9>,<0.9,4.9>,<1,5>,<1,5.1>,<0.9,5.2>,<0.9,5.3>,<1,5.4>,
		<1,5.5>,<0.9,5.6>,<0.9,5.7>,<1,5.8>,<1,5.9>,<0.9,6>,<0,6>
		SelecionaCor ( CorCabo, MODO_ESPELHO )
	}
	// Contato exterior
	lathe {
		cubic_spline 7,
		<0,5.9>,<0.5,5.9>,<0.5,6.05>,<0.4,6>,<0.3,6.05>,<0.2,6.1>,<0,6.1>
		SelecionaCor ( CorContato, MODO_ESPELHO )
	}
	// Fonte de luz
	FonteLuz ( <0,1,0>, CorLuz, Intensidade )
	translate <0,-3.05,0>
	scale <Raio/1.9,Altura/6.1,Raio/1.9>
	rotate Rotacao translate Posicao
}
#end

// ============================================================================
// Montagem de pecas finais e da cena =========================================
// ============================================================================

// cada retalho de uma cor
// bolinhas sphere{A11,etc}
// cilindros {a11,a12,etc}

#macro SuperficieBezier (	P11, P12, P13, P14,
				P21, P22, P23, P24,
				P31, P32, P33, P34,
				P41, P42, P43, P44,
				Tamanho, Cor, Modo, Translacao )
	bicubic_patch {
		type 0
		u_steps 4
		v_steps 4
		P11,P12,P13,P14,P21,P22,P23,P24,P31,P32,P33,P34,P41,P42,P43,P44
		SelecionaCor ( Cor, Modo )
	}
	union {
		#declare RaioEsfera = 0.0200;
		#declare CorEsfera = 0.7*Cor + 0.3*<1.0,0.5,0.5>;
		#declare ModoEsfera = MODO_SOLIDO;
		Esfera ( RaioEsfera, CorEsfera, ModoEsfera, 0, P11 )
		Esfera ( RaioEsfera, CorEsfera, ModoEsfera, 0, P12 )
		Esfera ( RaioEsfera, CorEsfera, ModoEsfera, 0, P13 )
		Esfera ( RaioEsfera, CorEsfera, ModoEsfera, 0, P14 )
		Esfera ( RaioEsfera, CorEsfera, ModoEsfera, 0, P21 )
        	Esfera ( RaioEsfera, CorEsfera, ModoEsfera, 0, P22 )
        	Esfera ( RaioEsfera, CorEsfera, ModoEsfera, 0, P23 )
        	Esfera ( RaioEsfera, CorEsfera, ModoEsfera, 0, P24 )
		Esfera ( RaioEsfera, CorEsfera, ModoEsfera, 0, P31 )
        	Esfera ( RaioEsfera, CorEsfera, ModoEsfera, 0, P32 )
        	Esfera ( RaioEsfera, CorEsfera, ModoEsfera, 0, P33 )
        	Esfera ( RaioEsfera, CorEsfera, ModoEsfera, 0, P34 )
		Esfera ( RaioEsfera, CorEsfera, ModoEsfera, 0, P41 )
        	Esfera ( RaioEsfera, CorEsfera, ModoEsfera, 0, P42 )
        	Esfera ( RaioEsfera, CorEsfera, ModoEsfera, 0, P43 )
        	Esfera ( RaioEsfera, CorEsfera, ModoEsfera, 0, P44 )
		#declare RaioCilindro = 0.0100;
		#declare CorCilindro = 0.7*Cor + 0.3*<0.5,1.0,0.5>;
		#declare ModoCilindro = MODO_SOLIDO;
		cylinder { P11, P12, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) }
		cylinder { P11, P21, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) }
		cylinder { P12, P13, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) }
		cylinder { P12, P22, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) }
		cylinder { P13, P14, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) }
        	cylinder { P13, P23, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) }
        	cylinder { P14, P24, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) }
        	cylinder { P23, P24, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) }
		cylinder { P21, P22, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) }
        	cylinder { P22, P23, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) }
        	cylinder { P21, P31, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) }
        	cylinder { P31, P41, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) }
		cylinder { P22, P32, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) }
        	cylinder { P32, P42, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) }
        	cylinder { P23, P33, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) }
        	cylinder { P33, P43, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) }
        	cylinder { P24, P34, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) }
        	cylinder { P34, P44, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) }
        	cylinder { P31, P32, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) }
        	cylinder { P32, P33, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) }
        	cylinder { P33, P34, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) }
        	cylinder { P41, P42, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) }
        	cylinder { P42, P43, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) }
        	cylinder { P43, P44, RaioCilindro SelecionaCor(CorCilindro,ModoCilindro) }
	scale Tamanho translate Translacao
	}
#end	
	
#macro QuadrantePosteriorDireito(Cor)
	#declare A11 = <0,1,-0.75>;
	#declare A12 = <0.2,0.95,-0.75>;
	#declare A13 = <0.4,0.90,-0.75>;
	#declare A14 = <0.6,0.8,-0.75>;
	#declare A21 = <0,0.6,0>;
	#declare A22 = <0.375,0.6,0>;
	#declare A23 = <0.75,0.6,-0.375>;
	#declare A24 = <0.75,0.6,-0.75>;
	#declare A31 = <0,0.3,0>;
	#declare A32 = <0.375,0.3,0>;
	#declare A33 = <0.75,0.3,-0.375>;
	#declare A34 = <0.75,0.3,-0.75>;
	#declare A41 = <0,0,0>;
	#declare A42 = <0.375,0,0>;
	#declare A43 = <0.75,0,-0.375>;
	#declare A44 = <0.75,0,-0.75>;
	SuperficieBezier ( A11,A12,A13,A14,A21,A22,A23,A24,A31,A32,A33,A34,A41,A42,A43,A44,1,Cor,MODO_ESPELHO,0 )
#end

#macro LoboPosterior(Cor1,Cor2)
	QuadrantePosteriorDireito(Cor1)
	union { QuadrantePosteriorDireito(Cor2) scale <-1,1,1> }
#end

#macro NucaDireita(Cor)
	#declare A11 = <0,0,0>;
	#declare A12 = <0.375,0,0>;
	#declare A13 = <0.75,0,-0.375>;
	#declare A14 = <0.75,0,-0.75>;
	#declare A21 = <0,-0.5,0>;
	#declare A22 = <0.375,-0.5,0>;
	#declare A23 = <0.75,-0.5,-0.375>;
	#declare A24 = <0.75,-0.5,-0.75>;
	#declare A31 = <0,-1,-0.375>;
	#declare A32 = <0.375,-1,0>;
	#declare A33 = <0.75,-1,-0.375>;
	#declare A34 = <0.75,-1,-0.75>;
	#declare A41 = <0,-2,-0.75>;
	#declare A42 = <0.375,-2,-0.75>;
	#declare A43 = <0.75,-2,-0.75>;
	#declare A44 = <0.75,-2,-0.75001>;
	SuperficieBezier ( A11,A12,A13,A14,A21,A22,A23,A24,A31,A32,A33,A34,A41,A42,A43,A44,1,Cor,MODO_ESPELHO,0 )
#end

#macro RostoDireitoAux(Cor)
	#declare A11 = <0,0,-0.75>;
	#declare A12 = <0.375,0,-0.75>;
	#declare A13 = <0.75,0,-0.375>;
	#declare A14 = <0.75,0,-0>;
	#declare A21 = <0,-0.4,-0.75>;
	#declare A22 = <0.375,-0.4,-0.75>;
	#declare A23 = <0.75,-0.3,-0.45>;
	#declare A24 = <0.75,-0.4,0>;
	#declare A31 = <0,-0.8,-1.5>;
	#declare A32 = <0.175,-0.8,-1.2>;
	#declare A33 = <0.75,-0.5,-0.3>;
	#declare A34 = <0.75,-0.5001,0>;
	#declare A41 = <0,-1,-0.75>;
	#declare A42 = <0.375,-1,-0.75>;
	#declare A43 = <0.75,-1,-0.375>;
	#declare A44 = <0.75,-1,0>;
	SuperficieBezier ( A11,A12,A13,A14,A21,A22,A23,A24,A31,A32,A33,A34,A41,A42,A43,A44,1,Cor,MODO_ESPELHO,0 )
#end

#macro RostoDireito(Cor)
	union { RostoDireitoAux(Cor) translate <0,0,-0.75> }
#end

#macro BocaDireitaAux(Cor)
	#declare A11 = <0,-1,-0.75>;
	#declare A12 = <0.375,-1,-0.75>;
	#declare A13 = <0.75,-1,-0.375>;
	#declare A14 = <0.75,-1,0>;
	#declare A21 = <0,-1.4,-1.4>;
	#declare A22 = <0.375,-1.4,-1.2>;
	#declare A23 = <0.75,-1.4,-1>;
	#declare A24 = <0.75,-1.4,0>;
	#declare A31 = <0,-1.6,-1>;
	#declare A32 = <0.375,-1.6,-1>;
	#declare A33 = <0.75,-1.6,-0.75>;
	#declare A34 = <0.75,-1.6,0>;
	#declare A41 = <0,-2,-0.75>;
	#declare A42 = <0.375,-2,-0.75>;
	#declare A43 = <0.75,-2,-0.375>;
	#declare A44 = <0.75,-2,0>;
	SuperficieBezier ( A11,A12,A13,A14,A21,A22,A23,A24,A31,A32,A33,A34,A41,A42,A43,A44,1,Cor,MODO_ESPELHO,0 )
#end

#macro BocaDireita(Cor)
	union { BocaDireitaAux(Cor) translate <0,0,-0.75> }
#end

#macro Cabeca()
	LoboPosterior(<1.0,0.7,0.2>, <0.7,1.0,0.2>)
	union { LoboPosterior(<1.0,0.7,0.4>, <0.7,1.0,0.4>) scale <1,1,-1> translate <0,0,-1.5> }
	NucaDireita(<1.0,0.5,0.2>)
	union { NucaDireita(<0.5,1.0,0.2>) scale <-1,1,1> }
	RostoDireito(<1.0,0.8,0.6>)
	union { RostoDireito(<0.8,1.0,0.6>) scale <-1,1,1> }
	BocaDireita(<0.40,0.45,0.50>)
	union { BocaDireita(<0.50,0.45,0.40>) scale <-1,1,1> }
	// Olhos
	union {
		Esfera ( 0.4, 1, MODO_SOLIDO, 0, 0 )
		object { Esfera ( 0.03, 0, MODO_SOLIDO, 0, <0,0,-0.4> ) rotate <40,-40,0> }
		translate <0.4,-0.4,-1.4>
	}
	union {
		Esfera ( 0.4, 1, MODO_SOLIDO, 0, 0 )
		object { Esfera ( 0.03, 0, MODO_SOLIDO, 0, <0,0,-0.4> ) rotate <30,-30,0> }
		translate <-0.4,-0.4,-1.4>
	}
	// Cabelos
	OrbitaEsferas ( 0.02, 0.4, 100, 0, MODO_SOLIDO, 0, <0,0.7,-0.70> )
	OrbitaEsferas ( 0.02, 0.4, 100, 0, MODO_SOLIDO, 0, <0.1,0.7,-0.85> )
#end

// ============================================================================
// Camera e Iluminacao ========================================================
// ============================================================================

// Camera ( V_ISOMETRICA_DIREITA, V_CENTRO )

// FonteLuz ( <10.0,10.0,-10.0>, <1,1,1>, 2 )
// FonteLuz ( < -4.0, 4.0,-4.0>, <1,1,1>, 1 )

// ============================================================================
// Composicao da Cena =========================================================
// ============================================================================

background { color rgb 0.7 }
#declare scene = 
  union {
    union { 
      Cabeca()
      translate <0,0.5,1>
      rotate 150*y
      scale 3.0
    }
    // object{ bz_axes }
  }

object{ bz_checker_bg }
object{ scene translate bz_rite_pos }
object{ scene rotate -90*y translate bz_left_pos }

// Interfaces das macros:
// ----------------------
// Camera ( Visao, Alvo )
// FonteLuz ( Posicao, Cor, Intensidade )
// Plano ( Tipo, Posicao, Cor1, Cor2 )
// Ceu ( CorBaixa, CorAlta )
// Paralelepipedo ( Tam, Cor, Modo, Rotacao, Posicao )
// Cone ( Base, Topo, Altura, Cor, Modo, Rotacao, Posicao )
// Cilindro ( Altura, Raio, Cor, Modo, Rotacao, Posicao )
// Torus ( Menor, Maior, Cor, Modo, Rotacao, Posicao )
// Esfera ( Raio, Cor, Modo, Rotacao, Posicao )
// Texto ( Dado, Fonte, Grossura, Espaco, Cor, Modo, Rotacao, Posicao )
// SemiEsfera ( Raio, Cor, Modo, Rotacao, Posicao )
// OrbitaEsferas ( Raio, Orbita, Passos, Cor, Modo, Rotacao, Posicao )