#include "previewmaterial.h" #include #include #include "tools.h" #include "SoftwareRenderer.h" #include "BasePreview.h" #include "CameraDefinition.h" #include "ColorProfile.h" #include "LightComponent.h" #include "LightingManager.h" /***** Shared renderer *****/ MaterialPreviewRenderer::MaterialPreviewRenderer(SurfaceMaterial* material) { _light = new LightComponent; _light->color.r = 3.0; _light->color.g = 3.0; _light->color.b = 3.0; _light->direction.x = -0.5; _light->direction.y = -0.5; _light->direction.z = -0.5; _light->direction = _light->direction.normalize(); _light->altered = 0; _light->reflection = 1.0; _material = material; render_camera->setLocation(Vector3(0.0, 0.0, 10.0)); _color_profile = new ColorProfile; _color_profile->setToneMapping(ColorProfile::TONE_MAPPING_UNCHARTED, 1.0); } MaterialPreviewRenderer::~MaterialPreviewRenderer() { delete _color_profile; delete _light; } void MaterialPreviewRenderer::bindEvent(BasePreview* preview) { preview->configScaling(0.05, 2.0, 0.05, 2.0); } Color MaterialPreviewRenderer::getColor2D(double x, double y, double) { double dist = sqrt(x * x + y * y); Vector3 point; Color color; if (dist >= 1.0) { return COLOR_TRANSPARENT; } else { point.x = x; point.y = -y; if (dist == 0) { point.z = 1.0; } else { point.z = fabs(acos(dist)); } point = point.normalize(); color = getLightingManager()->applyFinalComponent(*_light, getCameraLocation(point), point, point, *_material); if (dist > 0.95) { color.a = (1.0 - dist) / 0.05; } return _color_profile->apply(color); } } /***** Small static preview *****/ SmallMaterialPreview::SmallMaterialPreview(QWidget* parent, SurfaceMaterial* material): QWidget(parent), _renderer(material) { } Color SmallMaterialPreview::getColor(double x, double y) { return _renderer.getColor2D(x, y, 1.0); } void SmallMaterialPreview::paintEvent(QPaintEvent*) { QPainter painter(this); int width = this->width(); int height = this->height(); double factor, dx, dy; if (width > height) { factor = 2.0 / (double) height; } else { factor = 2.0 / (double) width; } dx = factor * (double) width / 2.0; dy = factor * (double) height / 2.0; for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { painter.setPen(colorToQColor(_renderer.getColor2D((double) x * factor - dx, (double) y * factor - dy, 1.0))); painter.drawPoint(x, y); } } }