void BasicChannelSettingsWidget::on_blue_valueChanged(int value)
{
	QColor c(m_channelMarker->getColor());
	c.setBlue(value);
	m_channelMarker->setColor(c);
	paintColor();
}
Ejemplo n.º 2
0
void ArrowItem::paint(QPainter *painter, const QStyleOptionGraphicsItem * /*option*/, QWidget * /*widget*/)
{
    QColor paintColor(color);
    if (fullColor)
        paintColor.setAlpha(200);
    else
        paintColor.setAlpha(150);
    painter->setBrush(paintColor);
    painter->drawPath(path);
}
BasicChannelSettingsWidget::BasicChannelSettingsWidget(ChannelMarker* marker, QWidget* parent) :
	QWidget(parent),
	ui(new Ui::BasicChannelSettingsWidget),
	m_channelMarker(marker)
{
	ui->setupUi(this);
	ui->title->setText(m_channelMarker->getTitle());
	paintColor();
	ui->red->setValue(m_channelMarker->getColor().red());
	ui->green->setValue(m_channelMarker->getColor().green());
	ui->blue->setValue(m_channelMarker->getColor().blue());
}
void BasicChannelSettingsWidget::on_colorBtn_clicked()
{
	QColor c = m_channelMarker->getColor();
	c = QColorDialog::getColor(c, this, tr("Select Color for Channel"));
	if(c.isValid()) {
		m_channelMarker->setColor(c);
		paintColor();
		ui->red->setValue(m_channelMarker->getColor().red());
		ui->green->setValue(m_channelMarker->getColor().green());
		ui->blue->setValue(m_channelMarker->getColor().blue());
	}
}
Ejemplo n.º 5
0
int Picture::scanLine(Edge& edge, const Color& color,
                      std::vector<int>& lineEnds,  bool rightSide, int i)
{
  if(edge.v1.y == edge.v2.y) {
    if(rightSide && edge.v1.x < edge.v2.x) std::swap(edge.v1, edge.v2);
    else if(!rightSide && edge.v1.x > edge.v2.x) std::swap(edge.v1, edge.v2);
  }

  int dx = abs(edge.v1.x - edge.v2.x), dy = edge.height()-1;
  int sx = (edge.v1.x < edge.v2.x)?1:-1;
  int err = dx - dy;
  int x1 = edge.v1.x, y1 = edge.v1.y, x2 = edge.v2.x, y2 = edge.v2.y;

  for(;;) {
    if(rightSide) {
      for(int x = x1; x >= lineEnds[i]; --x) paintColor(x, y1, color);
      lineEnds[i] = std::max(x1 + 1, lineEnds[i]);
    } else{
      for(int x = x1; x <= lineEnds[i]; ++x) paintColor(x, y1, color);
      lineEnds[i] = std::min(x1 - 1, lineEnds[i]);
    }
    if(x1 == x2 && y1 == y2) break;
    int e2 = 2*err;

    if(e2 > -dy) {
      err -= dy;
      x1 += sx;
    }
    if (e2 < dx) {
      err += dx;
      ++y1;
      ++i;
    }
  }

  return i;
}
Ejemplo n.º 6
0
glm::dvec3 StdCoating::albedo(const RayHitReport& report) const
{
    glm::dvec4 paint = paintColor(report.texCoord);
    glm::dvec3 matCol = report.nextMaterial->color(report.position);
    return glm::mix(matCol, glm::dvec3(paint), paint.a);
}
Ejemplo n.º 7
0
glm::dvec4 StdCoating::indirectBrdf(
    std::vector<Raycast>& raycasts,
    const RayHitReport& report,
    const Raycast& incidentRay) const
{
    // Emission
    glm::dvec4 emission = glm::dvec4(0.0);

    // Report's shorthands
    const glm::dvec3& pos = report.position;
    const glm::dvec3& tex = report.texCoord;
    const glm::dvec3& wallNormal = report.normal;
    const glm::dvec3& reflectOrig = report.reflectionOrigin;
    const glm::dvec3& refractOrig = report.refractionOrigin;
    const Material& currMaterial = *report.currMaterial;
    const Material& nextMaterial = *report.nextMaterial;
    const glm::dvec3& incident = incidentRay.direction;

    // StdCoating properties
    double rough = roughness(tex);
    double pRIdx = paintRefractiveIndex(tex);
    double entropy = Raycast::getEntropy(rough);
    glm::dvec4 paintFrag = paintColor(tex);
    glm::dvec3 pColor = glm::dvec3(paintFrag);
    double pOpa = paintFrag.a;

    // Leaved material properties
    double lRIdx = currMaterial.refractiveIndex(pos);

    // Entered material properties
    double eOpa = nextMaterial.opacity(pos);
    double eCond = nextMaterial.conductivity(pos);
    double eRIdx = nextMaterial.refractiveIndex(pos);
    glm::dvec3 eColor = nextMaterial.color(pos);


    // Reflection
    glm::dvec3 reflectNormal = getMicrofacetNormal(
                                   wallNormal, incident, rough);

    // Fresnel reflection
    double paintReflectRatio = computeReflexionRatio(
                                   lRIdx, pRIdx, incident, reflectNormal);


    glm::dvec4 reflectSample(0.0);
    glm::dvec4 diffuseSample(0.0);
    glm::dvec4 refractSample(0.0);


    // Paint
    if(pOpa > 0.0)
    {
        double paintReflectWeight = pOpa * paintReflectRatio;
        reflectSample += glm::dvec4(paintReflectWeight);

        double paintDiffWeight = pOpa * (1 - paintReflectRatio);
        diffuseSample += glm::dvec4(pColor * paintDiffWeight, paintDiffWeight);
    }

    if(pOpa < 1.0)
    {
        // Metal reflection
        double metalWeight = (1 - pOpa) * eCond;
        if(metalWeight > 0.0)
        {
            reflectSample += glm::dvec4(eColor * metalWeight, metalWeight);
        }

        if(eCond < 1.0)
        {
            // Insulator reflection
            double insulProb = (1 - pOpa) * (1 - eCond);
            double matReflectRatio = computeReflexionRatio(
                                         lRIdx, eRIdx, incident, reflectNormal);

            double insulReflectWeight = insulProb * matReflectRatio;
            reflectSample += glm::dvec4(insulReflectWeight);

            // Fully opaque insulator
            if(eOpa >= 1.0)
            {
                double matDiffWeight = insulProb * (1 - matReflectRatio);
                diffuseSample += glm::dvec4(eColor * matDiffWeight, matDiffWeight);
            }
            // Refraction
            else
            {
                double paintRefract = pOpa * (1 - paintReflectRatio);
                double insulRefract = insulProb * (1 - matReflectRatio);
                double refractWeight = paintRefract + insulRefract;
                glm::dvec3 refractColor = glm::mix(color::white, pColor, pOpa);
                refractSample += glm::dvec4(refractColor * refractWeight, refractWeight);
            }
        }
    }


    // Refraction
    if(refractSample.w > 0.0)
    {
        glm::dvec3 refractDir = computeRefraction(
                                    lRIdx, eRIdx, incident, reflectNormal);
        if(glm::dot(refractDir, wallNormal) < 0.0)
        {
            raycasts.push_back(Raycast(
                                   entropy,
                                   refractSample,
                                   refractOrig,
                                   refractDir));
        }
        else
        {
            reflectSample += refractSample;
        }
    }

    // Diffuse
    if(diffuseSample.w > 0.0)
    {
        if(rough < 1.0)
        {
            glm::dvec3 diffuseNormal = getMicrofacetNormal(
                                           wallNormal, incident, 1.0); // Fully diffusive

            glm::dvec3 diffuseDir = glm::reflect(
                                        incident, diffuseNormal);

            raycasts.push_back(Raycast(
                                   Raycast::FULLY_DIFFUSE,
                                   diffuseSample,
                                   reflectOrig,
                                   diffuseDir));
        }
        else
        {
            reflectSample += diffuseSample;
        }
    }

    // Reflection
    if(reflectSample.w > 0.0)
    {
        glm::dvec3 reflectDir = glm::reflect(
                                    incident, reflectNormal);

        raycasts.push_back(Raycast(
                               entropy,
                               reflectSample,
                               reflectOrig,
                               reflectDir));
    }

    // No emission
    return emission;
}
Ejemplo n.º 8
0
glm::dvec4 StdCoating::directBrdf(
    const LightCast& lightCast,
    const RayHitReport& report,
    const Raycast& eyeRay) const
{
    glm::dvec4 sampleSum = glm::dvec4(0.0);

    // Report's shorthands
    const glm::dvec3& pos = report.position;
    const glm::dvec3& tex = report.texCoord;
    const glm::dvec3& incident = lightCast.raycast.direction;

    // StdCoating properties
    double rough = roughness(tex);
    double entropy = Raycast::getEntropy(rough);
    double pRIdx = paintRefractiveIndex(tex);
    glm::dvec4 paintFrag = paintColor(tex);
    double pOpa = paintFrag.a;

    // Material properties
    double lRIdx = report.currMaterial->refractiveIndex(pos);
    double eRIdx = report.nextMaterial->refractiveIndex(pos);
    double eCond = report.nextMaterial->conductivity(pos);
    double eOpa = report.nextMaterial->opacity(pos);

    // Geometry
    glm::dvec3 wallNormal = report.normal;
    glm::dvec3 outDir = -eyeRay.direction;
    double inDotNorm = -glm::dot(incident, wallNormal);
    double outDotNorm = glm::dot(outDir, wallNormal);
    bool isTransmission = outDotNorm < 0.0;

    // Microfacet
    glm::dvec3 halfVec = glm::normalize(outDir - incident);
    wallNormal = glm::normalize(glm::mix(wallNormal, halfVec, rough));

    // Fresnel reflection
    double paintReflectRatio = computeReflexionRatio(
                                   lRIdx, pRIdx, incident, wallNormal);
    double matReflectRatio = computeReflexionRatio(
                                 lRIdx, eRIdx, incident, wallNormal);


    if(!isTransmission)
    {
        glm::dvec3 eColor = report.nextMaterial->color(pos);
        double diffuseLightSize = lightCast.diffuseSize(
                                      lightCast, eyeRay, Raycast::FULLY_DIFFUSE);

        double totalDiffScatt = (eOpa >= 1.0 ? 1.0 : 0.0);

        double metalProb = (1 - pOpa) * eCond;
        double insulProb = (1 - pOpa) * (1 - eCond);
        double matDiffProb = insulProb * totalDiffScatt * (1 - matReflectRatio);
        double diffuseProb = pOpa * (1 - paintReflectRatio) + matDiffProb;
        double fresnelProb = pOpa * paintReflectRatio + insulProb * matReflectRatio;
        double reflectProb = fresnelProb + metalProb;

        double diffuseIntens = inDotNorm * diffuseLightSize;

        if(diffuseProb > 0.0)
        {
            double diffuseWeight = diffuseProb * diffuseIntens;

            glm::dvec3 pColor = glm::dvec3(paintFrag);
            glm::dvec3 diffuseColor = glm::mix(pColor, eColor, matDiffProb / diffuseProb);
            glm::dvec4 diffSample(diffuseColor * diffuseWeight, diffuseWeight);
            sampleSum += diffSample;
        }

        if(reflectProb > 0.0 && rough > 0.0)
        {
            double reflectLightSize = lightCast.diffuseSize(
                                          lightCast, eyeRay, entropy);

            glm::dvec3 reflection = glm::reflect(incident, wallNormal);
            double outDotReflect = glm::max(glm::dot(outDir, reflection), 0.0);
            double reflectPower = cellar::fast_pow(outDotReflect, 1 / rough);
            double reflectIntens = reflectPower * reflectLightSize;
            reflectIntens = glm::mix(reflectIntens, diffuseIntens, rough);
            double reflectWeight = reflectProb * reflectIntens;

            glm::dvec3 reflectColor = glm::mix(color::white, eColor, metalProb / reflectProb);
            glm::dvec4 reflectSample(reflectColor * reflectWeight, reflectWeight);
            sampleSum += reflectSample;
        }
    }
    else if(rough > 0.0 && eOpa < 1.0)
    {
        double insulProb = (1 - pOpa) * (1 - eCond);

        if(insulProb > 0.0)
        {
            double reflectLightSize = lightCast.diffuseSize(
                                          lightCast, eyeRay, entropy);

            glm::dvec3 refraction = computeRefraction(lRIdx, eRIdx, incident, wallNormal);
            double refractDotOut = glm::max(glm::dot(refraction, outDir), 0.0);
            double refractPower = cellar::fast_pow(refractDotOut, 1 / rough);
            refractPower = glm::mix(refractPower, inDotNorm, rough);

            double paintRefract = pOpa * (1 - paintReflectRatio);
            double insulRefract = insulProb * (1 - matReflectRatio);
            double refractProb = (paintRefract + insulRefract) * refractPower * reflectLightSize;

            glm::dvec4 refractSample(refractProb);
            sampleSum += refractSample;
        }
    }

    return sampleSum;
}