RT::Material RT::Material::Cut(const Point2D &base, const Vector2D &dx, const Vector2D &dy) const { RT::Material m(*this); m.base = TexturePoint(base); m.dx = TexturePoint(dx); m.dy = TexturePoint(dy); return m; }
RealColor RT::Material::GetPixel(const Point2D& MaterialPoint) const { if(has_texture) { const Point2D tPoint = TexturePoint(MaterialPoint); return Texture->GetPixel(iround(tPoint[0]), iround(tPoint[1])); } else { return color; } }
TexturePoint Cilindro::pontoTextura(const Ponto_3D& ponto) const { float theta; Vetor_3D tmp(ponto - centro); Vetor_3D tmp_xz(tmp); tmp.normaliza(); tmp_xz.setY(0); tmp_xz.normaliza(); theta = acosf(tmp_xz.Z()); return TexturePoint(theta/M_PI, .5 - tmp.Y()/2.); }
TexturePoint Cilindro::pontoTextura(const Ponto_3D& ponto) const { float phi, theta; Vetor_3D tmp; tmp.setX(ponto.X() - centro.X()); tmp.setY(0); tmp.setZ(ponto.Z() - centro.Z()); tmp.normaliza(); phi = acosf(tmp.Z()); theta = acosf(tmp.X()/sin(phi)); return TexturePoint((phi/M_PI), theta/M_PI); }
TexturePoint Objeto_3D::pontoTextura(const Ponto_3D& ponto) const { return TexturePoint(0,0); }
TexturePoint PlanoY::pontoTextura(const Ponto_3D& ponto) const { return TexturePoint( (ponto.X() - bmin)/(bmax-bmin) , (ponto.Z() - cmin)/(cmax-cmin) ); }