diff --git a/src/art/webgl/art.js b/src/art/webgl/art.js index cc2f87682395b57723e43f9efe4babd4dc20a983..d26af595b5b4dce4897beb659e0daa5711b8e958 100644 --- a/src/art/webgl/art.js +++ b/src/art/webgl/art.js @@ -768,11 +768,12 @@ App.Art.applyFigures = function(slave, scene, p) { if (slave.piercing.areola.weight === 1) { figures.push("Light Piercing Left Areola"); } if (slave.piercing.nipple.weight === 1) { figures.push("Light Piercing Left Nipple", "Light Piercing Right Nipple"); } if (slave.piercing.nipple.weight === 2) { figures.push("Heavy Piercing Left Nipple", "Heavy Piercing Right Nipple"); } + if (slave.piercing.corset.weight === 2) { figures.push("Heavy Piercing Corset"); } if (slave.piercing.dick.weight === 2 && slave.dick > 0 && !p.hideDick) { figures.push("Heavy Piercing Dick"); } switch (slave.bellyAccessory) { - // case "a corset": figures.push("Corset A_80240"); break; - // case "an extreme corset": figures.push("corset1_112951"); break; + case "a corset": figures.push("Corset Tight"); break; + case "an extreme corset": figures.push("Corset Extreme"); break; default: break; } @@ -876,7 +877,7 @@ App.Art.applyFigures = function(slave, scene, p) { case "neat": figures.push("Samira Hair"); break; case "strip": figures.push("Wanda"); break; case "tails": figures.push("Suckerpunch"); break; - case "up": figures.push("Pina Hair G8F"); break; + case "up": figures.push("Inkstone"); break; case "ponytail": figures.push("Paraguay"); break; case "braided": figures.push("Butterfly160"); break; case "dreadlocks": figures.push("Sparks"); break; @@ -1813,7 +1814,7 @@ App.Art.applyMaterials = function(slave, scene, p) { // calculate lips and areola color based on skin color and brightness let lbrf = Math.min((O[0] + O[1] + O[2])/3+0.4, 1); lipsColor = [O[0]*0.76*lbrf, O[1]*0.55*lbrf, O[2]*0.6*lbrf]; - areolaColor = lipsColor; + areolaColor = clone(lipsColor); lipsColor[0] = makeupColor[0] * makeupOpacity + lipsColor[0] * (1 - makeupOpacity); lipsColor[1] = makeupColor[1] * makeupOpacity + lipsColor[1] * (1 - makeupOpacity); @@ -2764,7 +2765,7 @@ App.Art.applyMorphs = function(slave, scene, p, isAnimating) { if (slave.lips < 15) { morphs.push(["lips", (slave.lips-15)/30]); } else { - morphs.push(["lips", (slave.lips-15)/42]); + morphs.push(["lips", (slave.lips-15)/75]); } /* diff --git a/src/art/webgl/engine.js b/src/art/webgl/engine.js index 9028671500489fdc061f6ed22bea2f4dc1fac8df..ab77c0cc96897b0a2d0aea115cd4647f0c65a8b4 100644 --- a/src/art/webgl/engine.js +++ b/src/art/webgl/engine.js @@ -544,7 +544,7 @@ App.Art.Engine = class { // kS is equal to Fresnel vec3 kD = vec3(1.0) - F; - kD *= 1.0 - metallic; + kD *= min(1.0 - metallic, 0.9999); // add to outgoing radiance Lo float NdotL = max(dot(N, L), 0.0); @@ -593,7 +593,7 @@ App.Art.Engine = class { // kS is equal to Fresnel vec3 kD = vec3(1.0) - F; - kD *= 1.0 - metallic; + kD *= min(1.0 - metallic, 0.9999);; // add to outgoing radiance Lo float NdotL = max(dot(N, L), 0.0); @@ -717,7 +717,7 @@ App.Art.Engine = class { let seems = this.base64ToInt(modelData.figures[i].seems); let seemMap = new Int32Array(seems.length*2); let indices = modelBuffers.figureIndices[i]; - for (let j=0, h=0; j <= seems.length-3; j+=3, h+=6) { + for (let j=0, h=0; j < seems.length; j+=3, h+=6) { let idx = seems[j+1]; let value = seems[j+2]; indices[seems[j]] = value/3; @@ -1819,7 +1819,7 @@ App.Art.Engine = class { if (!isRoot) { let targets = modelBuffers.figureTargets[f]; let weights = modelBuffers.figureWeights[f]; - let target = targets[modelBuffers.figureTarget[f]]; + let target = modelBuffers.figureTarget[f]; let pDelta = modelBuffers.posDelta; let nDelta = modelBuffers.normDelta; let mA = sceneParams.settings.morphOffsetA; @@ -1858,13 +1858,23 @@ App.Art.Engine = class { } } } else { // static morph, follow one vertex - let pDeltaX = pDelta[target]; - let pDeltaY = pDelta[target+1]; - let pDeltaZ = pDelta[target+2]; + let t1 = targets[target]; + let t2 = targets[target+1]; + let t3 = targets[target+2]; + + let w1 = weights[target]; + let w2 = weights[target+1]; + let w3 = weights[target+2]; + + // find precomputed baricentric point + let p1 = pDelta[t1]*w1 + pDelta[t2]*w2 + pDelta[t3]*w3; + let p2 = pDelta[t1+1]*w1 + pDelta[t2+1]*w2 + pDelta[t3+1]*w3; + let p3 = pDelta[t1+2]*w1 + pDelta[t2+2]*w2 + pDelta[t3+2]*w3; + for (let j = 0; j < vertexPosition.length; j+=3) { - vertexPosition[j] += pDeltaX; - vertexPosition[j+1] += pDeltaY; - vertexPosition[j+2] += pDeltaZ; + vertexPosition[j] += p1; + vertexPosition[j+1] += p2; + vertexPosition[j+2] += p3; } } } @@ -1881,6 +1891,9 @@ App.Art.Engine = class { let v3 = [vertexPosition[idx3], vertexPosition[idx3+1], vertexPosition[idx3+2]]; let n = this.vectorNormalize(this.vectorCrossProduct(this.vectorSub(v2, v1), this.vectorSub(v1, v3))); + if (isNaN(n[0])) { // when area of triangle is 0 + continue; + } vertexNormal[idx1] += n[0]; vertexNormal[idx1+1] += n[1]; @@ -1895,7 +1908,7 @@ App.Art.Engine = class { // fix edge normals let seemMap = modelBuffers.figureSeemMaps[f]; - for (let j=0; j <= seemMap.length-2; j+=2) { + for (let j=0; j < seemMap.length; j+=2) { vertexNormal[seemMap[j]] = vertexNormal[seemMap[j+1]]; }