From d1d09f9f2b012ffea465f888346a518481096e6d Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Fri, 28 Oct 2016 20:56:56 -0400 Subject: [PATCH 01/14] Added model color --- CHANGES.md | 1 + Source/Scene/Model.js | 56 +++++++++++++++++++++++++++++++++++++++- Specs/Scene/ModelSpec.js | 30 +++++++++++++++++++++ 3 files changed, 86 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index c2d7354f028f..1402dc954190 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -41,6 +41,7 @@ Change Log * Fix warning when using Webpack. [#4467](https://github.com/AnalyticalGraphicsInc/cesium/pull/4467) * Fix primitive bounding sphere bug that would cause a crash when loading data sources. [#4431](https://github.com/AnalyticalGraphicsInc/cesium/issues/4431) * Fix a crash when clustering is enabled, an entity has a label graphics defined, but the label isn't visible. [#4414](https://github.com/AnalyticalGraphicsInc/cesium/issues/4414) +* Added the ability to blend a `Model` with a color. [#4547](https://github.com/AnalyticalGraphicsInc/cesium/pull/4547) ### 1.26 - 2016-10-03 diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index 0d70dce0f32a..aeb2b6014d9e 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -6,6 +6,7 @@ define([ '../Core/Cartesian4', '../Core/Cartographic', '../Core/clone', + '../Core/Color', '../Core/combine', '../Core/ComponentDatatype', '../Core/defaultValue', @@ -66,6 +67,7 @@ define([ Cartesian4, Cartographic, clone, + Color, combine, ComponentDatatype, defaultValue, @@ -321,6 +323,8 @@ define([ * @param {HeightReference} [options.heightReference] Determines how the model is drawn relative to terrain. * @param {Scene} [options.scene] Must be passed in for models that use the height reference property. * @param {DistanceDisplayCondition} [options.istanceDisplayCondition] The condition specifying at what distance from the camera that this model will be displayed. + * @param {Color} [options.blendColor=Color.RED] A color that blends with the model's rendered color. + * @param {Number} [options.blendAmount=0.0] Value used to mix between the render color and blend color. A value of 0.0 results in no blending while a value of 1.0 results in a solid blend color. * * @exception {DeveloperError} bgltf is not a valid Binary glTF file. * @exception {DeveloperError} Only glTF Binary version 1 is supported. @@ -516,6 +520,24 @@ define([ this.shadows = defaultValue(options.shadows, ShadowMode.ENABLED); this._shadows = this.shadows; + /** + * A color that blends with the model's rendered color. + * + * @type {Color} + * + * @default Color.RED + */ + this.blendColor = defaultValue(options.blendColor, Color.RED); + + /** + * Value used to mix between the render color and blend color. A value of 0.0 results in no blending while a value of 1.0 results in a solid blend color. + * + * @type {Number} + * + * @default 0.0 + */ + this.blendAmount = defaultValue(options.blendAmount, 0.0); + /** * This property is for debugging only; it is not for production use nor is it optimized. *

@@ -1719,6 +1741,19 @@ define([ return shader; } + function modifyShaderForBlendColor(shader) { + shader = ShaderSource.replaceMain(shader, 'czm_blend_main'); + shader += + 'uniform vec4 czm_blendColor; \n' + + 'uniform float czm_blendAmount; \n' + + 'void main() \n' + + '{ \n' + + ' czm_blend_main(); \n' + + ' gl_FragColor.rgb = mix(gl_FragColor.rgb, czm_blendColor.rgb, czm_blendAmount); \n' + + '} \n'; + return shader; + } + function modifyShader(shader, programName, callback) { if (defined(callback)) { shader = callback(shader, programName); @@ -1750,8 +1785,10 @@ define([ vs = modifyShaderForQuantizedAttributes(vs, id, model, context); } + var blendFS = modifyShaderForBlendColor(fs); + var drawVS = modifyShader(vs, id, model._vertexShaderLoaded); - var drawFS = modifyShader(fs, id, model._fragmentShaderLoaded); + var drawFS = modifyShader(blendFS, id, model._fragmentShaderLoaded); model._rendererResources.programs[id] = ShaderProgram.fromCache({ context : context, @@ -2841,6 +2878,18 @@ define([ }; } + function createBlendColorFunction(model) { + return function() { + return model.blendColor; + }; + } + + function createBlendAmountFunction(model) { + return function() { + return model.blendAmount; + }; + } + function createCommand(model, gltfNode, runtimeNode, context, scene3DOnly) { var nodeCommands = model._nodeCommands; var pickIds = model._pickIds; @@ -2909,6 +2958,11 @@ define([ uniformMap = combine(uniformMap, jointUniformMap); } + uniformMap = combine(uniformMap, { + czm_blendColor : createBlendColorFunction(model), + czm_blendAmount : createBlendAmountFunction(model) + }); + // Allow callback to modify the uniformMap if (defined(model._uniformMapLoaded)) { uniformMap = model._uniformMapLoaded(uniformMap, programId, runtimeNode); diff --git a/Specs/Scene/ModelSpec.js b/Specs/Scene/ModelSpec.js index 2699f497616c..ca98cf69586b 100644 --- a/Specs/Scene/ModelSpec.js +++ b/Specs/Scene/ModelSpec.js @@ -6,6 +6,7 @@ defineSuite([ 'Core/Cartesian4', 'Core/CesiumTerrainProvider', 'Core/clone', + 'Core/Color', 'Core/combine', 'Core/defaultValue', 'Core/defined', @@ -38,6 +39,7 @@ defineSuite([ Cartesian4, CesiumTerrainProvider, clone, + Color, combine, defaultValue, defined, @@ -1869,6 +1871,34 @@ defineSuite([ }); }); + it('renders with a blend color', function() { + return loadModel(boxUrl).then(function(model) { + model.show = true; + model.zoomTo(); + + // Model is originally red + var sourceColor = scene.renderForSpecs(); + expect(sourceColor[0]).toBeGreaterThan(0); + expect(sourceColor[1]).toEqual(0); + + model.blendColor = Color.LIME; + + model.blendAmount = 0.0; + var blendColor = scene.renderForSpecs(); + expect(blendColor).toEqual(sourceColor); + + model.blendAmount = 0.5; + blendColor = scene.renderForSpecs(); + expect(blendColor[0]).toBeGreaterThan(0); + expect(blendColor[1]).toBeGreaterThan(0); + + model.blendAmount = 1.0; + blendColor = scene.renderForSpecs(); + expect(blendColor[0]).toEqual(0); + expect(blendColor[1]).toEqual(255); + }); + }); + describe('height referenced model', function() { function createMockGlobe() { var globe = { From 5c7911d01d4b7004c21677e82cf0e68fca2b63fd Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Mon, 5 Dec 2016 13:27:05 -0500 Subject: [PATCH 02/14] Updated 3D Models dev Sandcastle --- .../gallery/development/3D Models.html | 87 ++++++++++++++++--- Source/Scene/Model.js | 22 ++--- 2 files changed, 85 insertions(+), 24 deletions(-) diff --git a/Apps/Sandcastle/gallery/development/3D Models.html b/Apps/Sandcastle/gallery/development/3D Models.html index 0504f5af2a7b..90bb61846a9a 100644 --- a/Apps/Sandcastle/gallery/development/3D Models.html +++ b/Apps/Sandcastle/gallery/development/3D Models.html @@ -19,16 +19,70 @@

Loading...

-
+
+ + + + + + + + + +
Blend Amount + + +
Blend Color + + +
+ +
+ + + + + +
+

Loading...

+
+ + + + + + + + + + + + + + + + + +
Mode
Color
Alpha + + +
Mix + + +
+
+ + + diff --git a/Apps/Sandcastle/gallery/3D Models Coloring.jpg b/Apps/Sandcastle/gallery/3D Models Coloring.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dff69552e5cad26e2a773a4491a6dfd7c1c31f7a GIT binary patch literal 21074 zcmeHuWmsEHyKZoI*W&K(?(Xgo+@*MNcXxL!R;0K)6nA$D6fd;Up0uxg-`@MX&b80) z^G>ponR#SAxhHwny=EpqSAXsTQ01g#r2t@HU;r7=1MqVXO-9no#u5NfR0Plg003A3 z3>ZED3RD9F9cEwzf7flnXaEqu`@um%egNndfCM^RBWwVWzxx5O<+*vk?eIbEz;i+X z49FoOsGbcveihIef6ITrE7;iE1HBnY)Pbgs0DuC(24D|*00G_r1^@{_9aJ*~fCK=- zbI=Pc==i7ngTOxs{DZ(h2>gS?V`1guV`bxG;UZyW;bUjv zV`ce|eg80%UugYP{z2d$1pYzb9|ZnE;QwC)e(piJTf4hE^D#3!x-pqrIGF*N%$*#V zy-b~%S(#Xv0RqBa&Zg#eKz9-|pp}iIAoZ8dUTP8>3qfjaPDK_)XK|pljf{^gP~AsK z!`#QtoY#U{SO{Lgi_go!*#YQoO5){U@94(oB}o0-IUlJ0tDBh`q~vO0$)_eE^`{D` zB}n~eES{d8OrGpaPOetWth~Iu%q(ooY;24m4MsO_M|V>%Mn^YtkOz2@-##ROZsx8w z&h9o&j(_^HF#p??vxlqwZ$}p9%s_jf1JKdk4fN4ie?>q-B4A<8XYL9#b$4?8)%?Ss zI?&~JPkK^!1upl)) z@n6vbB|wMJFT%&j%ErjTrSTWxW8&gs6JY*tdLWp7$N9gD1qhm0`_IArlKlQw{1MHs zCZCQP(9Ox-;}`Zq+@MqckIr8p|L)ZNPn!SU`M2i36g3@f+=XNv&8`1*{NE&hTZp>4 z+qk*^w{iM?);}eGYwD}53ga9yb&t00V%dLZE`?%fGP&9%+=D zXT#OBmwrg}fJ|SvH4m;qchww^&MTD9f-=Pp$G_DJP3h1S-({}UY1X>yUSqc#lkQ@V zX+%8Ap&!OnXS+lloNAI;;OsB96H#*D*EB-6l`(3`+Bfz4^ zT#s-nQPkW^T{3F{#LyLw6xL!bWEn_Qa21}L8}fz%Yq~2PSTty_%{mvV{{!pLkDOfnV@VtpYD6h2&IaE$F z+)uF%VshSo*1|mIYff3p8~iNh`dJxiWE+l-2Zztz+IHCnEMcA_L6uJ@clqS~=r^q& zur_jZYwZ!^%rn<|%hG&qw{Qno0~q~4W*OfZL@+KqYGB^bmmM=&0i(+ zhj$wwDOGG*ZtlMxJe&+zQ^#Xx())e2X>=*Yn0>hA7&LqN38?#Yww3)}z~HqAIusgW zyd^-JfFv>9II-jT(3l1}&FTzOUH-<8mK0-;(QZP9^Tdu%8``Ow@Xlulc#&=`;5lq> zMln@M1t0QxY;TBb8^)M0TzyF^mvbm_BDFs)&QO{#{X@1LJzB}q>YaalXbBYQy^wOK zBUf2NGnK^sz{^)zu7Q`!xF?t{ALFP4K22Mn6-gEHl_a3axS^zeLh(t#1z%MV;PdE3 zt8BU325GD6x*3)fit9Df;Ib@nxvQ_?PDj#FMndCm+%CC-X&8n#MjpP zp+es=akw2+x7nJWWq$j58LLE{XR7i+#!__Oo43o)4qp8V(WmYd8WRvo6vtH9@@A2? z)o+id_i`4@H?-Ni6J$g!o#IU|7S}l)Xsfe#qqXTMs_%@E=k9s%w!HAMSgPNk>#ocg z=~-3KcEHgT)vQh3ZyMw8zR(%C&)_*M)+c5+=YOEq`G$@hMd?D<#WCqzMp`R>7Gou$ zGnG}89~20|`5~ye#QU^3aYP}#G&XW0IJ2$=Xd^`@DZ4qbo2hn6%A#?N2ehpEv3}q> zdOCNuZKEegjSPj(#YbPIYS1A)TQpgDU<7{~T)Tifjq3QR%d?`QzD#|JVYm1w_j6v4 zxX+n3`N5I04bP3SQr@`;#x04QV7q5{Cd!61J< zLHXfV0lh;4pwQ4UFiEkXQOQ`b$w?^KL_rAz7L-@Opum$h@ZUvjy8-&yHdjgW)x?Ob zBYoT8ClD3g+#5_>CCW7jvX4v|-aU_Q`ZDphzQZFx_VySvn`;KFkYq;@vd6nwLI~{5 zKF1^+q*P^K*~+6itnCq2@OS8di-nKMhu1V2k0E|+@u-tYWh;l zWo<9KxX(4(PG%8G-jCo1(PeRqQ4n=4H!T$um}X5sa~HGD!qld+CJ$kI)OEDPBOaAC z(0mHeV_+gpt8AQ1%y&*7vKeP5Q#FCacF7B-Fn>UYR4coD%t9Nn%H8ID}B#u*Eyl)3(f zcZWT3Ta7jEE^n<$mvLjdtgLdPT^lMTWgU3|*{z|;LtBbk{SlEgfeRSs+J)KEXvHBb zS$#UGRkkpRXOh5?(_B&N0X?H{Og~x6nUA=^v`I($63l9>O5*I1x<1P(8T`;ptRJ7% za-M#4PSIe{UCc)9HSj^BxkZYiHhDaj@EjvwXffTu&4W}jk6#&~nvsG;L4z8azsA5d zeCw_Q=}RDz=s2EjZsz>`SBq23V@I|3<VX`N;ca}j}T!w}kwuB*CKeHn7$HFJzubGY%%gA1_-gH3o!-!1TJ z!O>^yKND0L&41uLmuRT>96CAUNKrX@=;Kl1&3`Rxvp5j&WBFn(|D7M!vZrLZH<3_b z)#XR{=38^S%aCyi{FW(_uq^gRu%j4kCT-J+!S>^$I1(rJOfAVA{n%*C0L51^O!gCc z1#$O|S-wh4L5!Sur&B6(>bk_A00$sOP^Q1G$cKxB@n(pKa=tm^VtAL@2(Z%R_jR%G zM#$Ecnuyl*;Pdf*!|(Cl4zi@!tZs3ZDlQOr?G6(u+M0t6%w-10H|9P)9Ik_hug7u{ zkSi(FrBjw$HqltP1nSdPS8&*(^c(|2WzE#ru{qWVIc~-YOO~aO^f*0i8XL~`dHk{V zvP1KoCcI`)>oR>@m2t|!&G0Z%9w8A;U~o5@8Eyy&XQY&2dGMWbMw9FzJdzyK!ph^z z^zi*NrtYQg*_9dN+;9sXF4VqN*Q9S*)XfsUn!M9xf4XzRMMt+Yvv`U}wC}}tYe+Y8 zo`Ejxh*GN{w1~RXL8`CgSuzUFY^?6y)rO(U?I_i_<=B!C;yP}nVzu>tM3A_D=p@ou z;`pGoII)6bVSbwhH@ocg?7BlmP6h3DgS!`|pNnqdN=HRPCrdyZ(D-7)!1OLPv_e6w z#n$>Gf}KY&7Z|$}236_Z(^>A*O)TWabeXGsa16c-F)F@9-TH2vF5E*%MG8xxH{7a*gSJX z23W`CVzt65s28njv&ObvxnsYEUm={^1C`H-H~CRr;So?4?U?GtEy~>S$JD~>Q3sLD zgIDbcoBA&KACU!`at-4e?Bl(KX5C1V5w92uF8b<*UM(z?0*>jM8lJz$yrJmuxpksa9LTXJO+Lt(nl_Y7+vTK8_bhF)EV7a`n}x%5mx4xHd}BHsu>H)M^Aix3 z!P<<#V#Wwdl3N;5pJkcVag^m`$^(O5zG^j~V=}fX(m3IVIV6WUwQnKF9GTIrQ+%aX zavP>_qA_AG9%4Qc<@3!iGdEn+^7-5?p0>%^Ws?AD$-g$>*tl8GqourfDHBCL(FsMLzRC39I?+*YE%y!XM7EC7Xc%EpV|Kjh)L-h_3`_!+a^3J{BCUW9WwjLv2vumlQc++$}?z zUGZ7iyLC;diF-tuCEG5S&R3dnughbWIe`##HDCb|O>i)9NN8{X)UO>IpaKSt27yir ziHgArMMB0Vs)}jKBIXj*h(*q>X7>A{03w{iV4e5@Q2yzOd3iD7e#tb&(MOWr%z19b z(KIP`jn!sJ_8qTp_+w=5WA5!(=TGZvnQlh`0)Ahh( z)em@{_!YrfctBb0Td6MYlMSs|mdpB+l@A99>2ahN+BU_MR1pts7ROO)rwrcMB&fdR zn%5JXIUV*W>Wb&~L{3Z`RnvD=Lk+b=(DTPdrOV@|kRnmK6<03D+SO3PCPfFUN=Neb zy{yjx$KyV1x-`oa|3G~ACWnGAWSHh-VzPMh_rp^56$vZO&83Oajs*dBB<{3=Bqs~6 zn4bVg;Xb#dPC7}MX#3svag%%HjURC0#Ma-^vbtEm4vp`heM~M+#!gZNQfbo+kDrNM zZ>Du6^v~8Pq75z#E<_a(Q!*Y9yW4OyR{H1Y8l;}#{{%>QjHf#1`t~!TKPDw-FQI$w zCD~**M_zaS1VkkdGq6>Wb{>g^G!D%>t4?EmzMP5Y56{jzg|~A&q(bipJ_Jprq_tDvZ*V{od5e5hZWRt0+nXD*%EU z3(-Yy%&b|EZgx*3A5sAfjYOeTL;o3 zv8f(Oif60cy%evDsmvx*4-Urf__|^n>8aKUb0F-|qy0xQ!ys*Vm|$*+JA4Div2Yn# z8PR?1rSO6F-iddO$4QH;=lD}EV#9A%H(Zx)&G+xj>n=t|%`-a9=hFO3m?8A{DQYYQ zW0(tE!?Q`_(T&P!hTqb%V}3@|K=MY&yd4ob%ko+^_c1!`63Zy3{uXYWOsG_LF0IAk zar0V`@e`2jmRnJ+5Y%2O%^qQX$F4P%dy?Ya_)Mek>KI;dTP#%I5+L>QneUmhwb)_D zh0EHh6J7P0?vOEYQ&#gLPN8jFDZZGf(bh1&G<>rao9?Z48m+{6a$0%>1!c8(ba1n} zfB5PO=z@hUF&+KuGcQEml&z}XO7wCZ9<5fBQ)=i%9uL{>EZWm_yyasPRK1FlV>>LK z%y>;OUOl1QR93^@V5KLNDlP6%69(lRn%_AG0s;!eJpV{Jzj6*LIw>mzi7F%p3!5k=nV6}| z?_2}^E7#QS0N>m^R9iL4h31DEBYnzD{F{T7=9vVg<=xnkE_2fbRQ|vSf4C-p!WULH2QC z$&^2$?BmQm*YLbK8P3H$H_JAv2(KeA3{&4F#QLhKxps0iE4tm#q(xwemZjxb9w7u> z#>o~<(1+;O#kI})uErl}yUh$nmAY7->ZjPaWY<2B^ZM%!a2EMC?Nj)$zrWyE;Zf*( zvTvFspcZ_y*sMmr7+z+dQJbK~XV!+vce~HQEWZ?BqtcBiJigk^t;kohULx{{I}bFw z?h!VxSPt0y0aI~1eEP}}0EHYY)JTpix~W=~KK7t@__bK5R+{UH=?1u;F(@gpMl`Nv z$C*8-r9S-v>lib|CC-?!X1_QonPX-cv-`quSW^BI04LqAjIGA4<3K<_K=>vvX(MT+ z-?Dh@B2=JN*T0}7Y1ZtZr&+`GMo-mu?{a70>V=_a2lN%;M+JaEfI~n*LqUN5aa{sU zWuQTjqO+=EkcpbQppvtR1tmd(u1KyVMUBC8m>kK)do1Q9*EfIOwm=Jmv*}$G<9I6Z zZOJ;dyoc;m>w>9=a=Uu3_L2(yA$BoU#<^*@>m;A83s<)~kSHco&rQv-uA7h{6uB}p zN=M4h*k}jsQNkg3m!JlduLz?GL=9r)E8;24N#4^>72kmvsL~8UO>7P7b`Susdr1nH zFS#5}8QFZ$5<+a-hB#gHy#*2+skBRkf-RR(VWFYw1s~+52Y1VU?e5W0eAJ8yvS$<1 zn+xYquF?j(VTn{38{ZiPLJh&X^8PGFEpC++iA~7Q`!>4`Nfg(xyXBAH#471wu%Ers zkP8Q2EN!krIl&idF8}v{hQ(md2u|dVG7Umw@{BJs*=2w4WaR@G@d_~HevUN|YjkB}X$vGf z^|$PIQB`c7_G>;>S=U%6j`nR3#sY`%0P~8dOE+<+`(#d9CFMqC#!zB0@M?AzT*tj& z&HG_Fb$!N>k=XDx=|;7jfhV{jJCT!7+;aD(8jI?3&O&a#A;`5^LPVDtnM9z7L*2e> z6Kb32m5fvgh{j5rY3pSe*}#64CrfZZo#1>Q=VVU`w25Y2%*&cb&IV@t@-QUv711HHV&d1O)l> z99rglDP=%Hal!y*J?fW^&5Y%#Ta2K}aaLh#SY?$OxT_6D(p#-%-}#6QE2HKax|2RG ziRX_J>lRy#=~jm)eIVSU-LS}V0iqzH7#%Mx2TQVtAKLHQo)Srrl2hnY=+CzqMmMSzGkC4(Jc5C<& zaD>1fm8+C;2=({vszl*SY`_$|n&6gWh0v<2PsYc5s)CEsAYbcslg_(O05p9Vc<=9*92iiraRV z$ckg!cz`+B=4J8jq0w8(7R3^Rle09!<~QYum2vYXxE~N=iie(KEBpk=>a%L*2tlr6 zRkz&x)oxrhy(Z;$K$*Q+s#Ef)*cyh!nt*RmjP^eD&vl+$ z$MFM&)MvbvZl=)uU1b%h~Bor%%iXP0>f}N7URN6^qyNE@b)0 z;Cv0-{Hhh-;P&Clx3wo%e{ve(YTkJ}3Q0IfL73zwL{#V9N^J!nBYt23YwxVM&15GT z9LS)#3A)f9AaoLkk`Sdw>vt|t#x*;!YrToYRbIxX$`!eR-FQgpqry*PUGhxC3eN=V z$_QnS+=wMzvH5`$`@QBTfCii8mL*ngAfz=kr9TKAIC?v-6D)KOEOZ;f^yx;%DINnK4m%WtmB{Yhv+A#_!nliVW7NBx+tHdEvQ;<9C5_0_;>Rbah4dT|TrF zLwY+NVgMiyF0p+_&eR{U#-riuL_#{@{&Nd2=SF)AQToMXlNruSNnCJ_I}W8ej{Tvkn_l0}I4)p10ZVj~ zxFI7v6?XyPd@&^I@`*e?B>PLHuJ^ZzKAX#TyA@Wj>PUI^nH%8Eq#wgfB#t$J>i}mQ z)$BR1ysIud){Cz0cvf1SA zw8v%a5bo8+V?AY9rR8G}m9_^eNpajDBI^^PZ__U0u5TaUu6?0Y5%Oarkq(}nN7T7% zO-8?T?c&jp$riK=92T5zoDqbE{?#OeRN*_cGO6nMx)+MG%DG%0&sFJ)lXL%pxBe8 z#DDKRdL$f2o*p8Z7zQLn^`&Rc?Dq%**qEs!xxbAOaiJ|-VCMXk6Vi%OXUV7+X?XDw z7p52YoRMGUbh9R&7ns-k^%?TCxKV_mjROcJh3*=`8zm` zb^Sc6Dnd^y-Y4-7sDEo{ZlHnA-uQ8 zeMZ5@lg_CYzQxo`S8n=w?8)SG_{C2If~%Me7ea*cTt(s!c$jaNMn!_Q%)Om6UOp6z zS=CL*IBF3mk9^(+2YanpH&Ex)=464zIC_esv!z!G1&r?-;|teOccLrrn{u_J9{L01 zNZ)OdIl6obK&?@)L3zu=!8aYcvpupsq@(h-edc^3oG|A(tMYt@l5xNsX_FpM+^uzY`9Y2)7z~kuu7(3{I4#Xy%gBAx}7wsoXBBBg(2u6E$4z%a{h`cBu+J?*`4=t?}{>^x~jZ9 zQv_R=L)ky7Alwj$sBA79jBV!lt9?86lQgK?eP3==$`{R3zN1Qn==%^KKZgQz1=qO_ zS}Bz=ZnksG-lH2XXR8 zXvUFn^H(-pB2G!??5X?(BgJVrMS2eoc~U7!#q2CIL2!C~>0-hMu_J{2?8G~!1nQ)L zSm_zA^Gl-1Grqjn1yaiqTr26m$V(Qpcb0Pl6Vjwo_1hm66Tah_&@R-!mXpWAzxL_o zFa{bXh(1O6qH-kXk18L2yARTG4@;bBL7k>9X z(gXs&wYXQkw&%xY$(MOvMpsq{}wS+b{Jk9vN^^DD}~ zkIAA}F;_9v5j@KD5W7mBTd#b3jPM=BkxKHVKSWH0zJ-avYhDekxr50EY=Pa~*Olip z6dM7j@Q%MEEX;Khlv$@1@UwY9F;H5NRn>qEPJKcz_6Mf0InoaqJgVCfJsm|coAhrP zmyuNGc4`eYHb|em2MU*L!dIJ4l1-?Xp?M!JB?GmU-Y~ZZ?`O6~NMC=KusCV|!XV01 zKLjE&BdzQhKPcZM23z$5P?2H+_5)av=ddgpO_{VyS#gn?9~>miAyuWFfo??^qZ0KHU*VvS^YjDu0d zvcFAAAb2#YFtIa`9LOPg*{0>o=sSsIEG}F^xZmT5EQl z8t$8Q8mLnyNoQjdVex*<-oObD%*d?nGh99=ZTqSKM~J^$lp)H1WTB=FPRT0Ekk&Ef zN&1IyDD4hTcC8G)G@P;2pMXdgoxqibz%kdpvW}kfEU?q6Q>hMIbm@^+l4@iQ<^hPX ztVTK(>n(;?2~5Vb2@?IKp=U!|6K#HJxTKHPtNbH$rbNbzXd))Xed|Q#SZtg|rk`== zx5OyVcqD5Td9u1J4XHfRe*#!Y+8VFJ>3YJ|vWP7pSY=GRaZ zE{%1Ia1CQJjHIoDtJ&0RhbFtSC+ziN)aX2a0-_sal$-4`SP@EMjdw*>tbHZjGurJM z6!a5sB9{l2aiRIk)uG~n9^8xJD=mb5TP@w1QnfCS2X>_#W$Q=>E1$ zE0>Hy2m>BZs+dKsHcqeM@%0IIQHWuqBp)|by&@cMP}8p_+1l_YKG(;#VTGb=@Fg}y ztp?5(MI#Fgudc~oyv>|fae>C8MmGCY>_Y1}Vq&M##ez4tPOujb+0OFLO0xh&qJHlo z`TZ{kRJ3%9gVX(QKRjQLgnEheJp2tu^2%4IakK0`G|lI`0mp4n|N^B+k4Y2EdtB$E&0hteT_^*(X%9Nh0lnafxL- zb}h#T0!S)4W3sKUFwr@{q3@a#df08HAc$);nIlJmxK}1`L%>j)@vm{5l6I0u2NOl) zKeXm@wa!-c!UFDQVED#c(40$FkbL(`(_GlTEO1Z-*=QMUi z`28x@}=fgRR9LtZbw!MuV2W^y+KzI)PrnK6(5 zZB`WFL0IhwV>tbwP|=^Y9FL5!fp%zwqNa?VpqN9TZ=mYwHefsP+v?|ec0elgdH~8r z<=nxsH47_(7(&pxs%;t0T=!4FNxcsXIm>)_$3WY9Gfg@t1O#xFLtGOnVh9%+dmn(8 zW!_Dz8acJti&NdMU$j^B#lfSf=qJEtv-$ocU`+&K>?h!m8+AzXS`pVXz~Gz6kg?m- zPXL%&Mr0?=4U)sf53*&P%)W!O?nq84lPn3w=%*=h`#NYC57a|B+?m-@;@J&ho0b`O z;(+591qA)sr)F9tfZ)eU#zi;;&x7yxVR085$S%5RoNMFPBmM^uuc@;+SYOihC(&-0 zAXK0e@#Rw024RLuNV6)xA;NNIsm69`}U#ANj)dKJq&}VnBXw zSn2hOzd``UWVx_2`CLJ%1jrRt*dDJlD`%h9TI}UfB~^cj>wtS zV#3L&lF2&dH~D6yrx{J?t>09`c&(DEBYi*SAhA$Xhmx9h8~Y&Y+Nsd%Xwf8OAPnTK z!gou-Ws>?bL`keEePG&d1~9=+`dFPF96CX`OISAu{_cHds@^j>H+RIlIV{ZQA@@bH zSSEA|uKUuz z3pcai`~+y=bPp4oowH~Ahzdi-AF(U;zhO}_%ay-K*JP(rGg#M;#R_3M68rpN5WGi+ z(D_k9!9P)V%glzviNQX8}Tut$*328-xi2CE@dSeF6M0|Xh( zqI_fq7>alN$MBGnO~o)$#SHHJ^1{J*OVy(GNp}%Uxg`wPdKHlyfBkCt=k~*1M<^sE3rnp1*y-zB*j^jbRV{6!T1-Y4{;}j8(ontJrwz^a7Af<{w$e@m zqlaisQ#T1=EWi%Hk{k3LyKl$+M&cub1f>0mgM&UMd9lpx4(DY0AYa@3=wVSydW`eV z?ph@5265r|Qi#Pj1f$8kE;+%C?!&r7E1YYPa~*UGIsT^kwU zyrQmfj?Aay0}3ji5zpJ3emqwmr}h+v8ZLQLPW|0U<=t$&@UX`N?i>W;M+1={g~ht9o7q0>)SpYVXagM?vs^~mP+T}ZMgD#?{fq`+M z(!5PFsQAsW(5ejz7rL(pTj^- z?izLPuSF*iMUVpIsqnv9Y#$N(B)BN%p9y;qRPUF4d4j5nC$ENXS;4Fu>6OY0lBGBmmEtLPqvO)z+uaQL#z!@PMVEE;5*Sl_91$l@noFq7EenbuYj!}^dPB{VYy*mcIo_+67_|#6)+CU5- zGq2bU57lW;t<)Cf+cs#Oz9q5jUwZ1B@Evr9*WM@cF-cU`a9CQ*9?PgSI$Uxi z?ii7nOZ|{1)}Sn(u8Iv;`utYVd&Wb#Yrx%OX67l#i$+2ad$#vk=MyqX#YRS1;>h-; zOYnQu&3DoP&_cA31U~`#R&Huw3AS&#GI5)N*dLGWJEgGKSo0pukVoTqSlzkjH8(SoH)VrE>uI=Sui(Wx%Mq- zq-wsgu+WW8TqFc%{Wgosfb6yApt_{VN8|Sg1l%qyD6zmhKH$)x_+fifxf`;U*JnQgc0?*Jm zwA-oZGvVvN3FN{xiXa$@jtk#Gada@0#;JtxxnSlkyDJ%DYd&w#OV@j}y35Dig-A!a zi}1An=<#{hHxQ4M-ynX2vFmJGN&!3fjS_#T6@s~AuY$;tnaH@{5DDkvfes}!K1QjO zh5RDz_`{1CaNnA#N_3@3yq=2;09AIr1pZ<^G> zLfdb6jn%M339M-c`440QQ$L8{x3wkY#`BvLv(H@VOpO{-IO*bxoG8hJLuZ|Wr#z2+ zgCs%@4(D7;J$+p9bEGHp^|W}|t-lmM2)SW3ksl6D-I0e)Q=uSRT(G^Y84>p&C{=H6 zJ~mnH0=$Xch1anW#`EjB^*C)*1}}*uImFmqIyqs)v|%*bd9o6gHhX3sABN(}&8ypn z?YcsEtbH++0lYVgYE(+UKfs)I0k?td;IjVeH3WX7N?cDQeS%oB8t85MJgn46_+b(5 zd6Xtb(`LRNEOk;|%<%^V{ZgNrYnoMr-T_X-NGLBVYTiXgE-ZOqC5~ItSJvZ|f)d@e zUfiDmYFLgNQ{`Gek3>sh23F?_3D3SZ9dLSPkB2}?ICvPW?!cG*M5f^kqmg4bx^+*8 zuLHazfnK@#A4k0o?QAl1Cv!LGFHufV;1rjfJ~#&SezOoQshlnFDpSEceS?QRj8*>8 zS-F;urY}I8xGvB3W^wYyPEna7^9#Joq~WRZh)to&-e)J{uSr5WjPlZ$PNKuL3hOY5 z-RnXj2+&#bzKZov@)`EiEp3hF-l*+LEgF4M^$H2ih_dBHHwGxNpMZg1`h%SE+nBLJ zXGR0#REh`7)om-CN^^GZ`?r_`yB|jhh}oJ#`!uTQmKX9yP4*LAMz=W}&{LkF;GaiX zaLNO7mYal3)v``JZv^%*jOn2L@<{Vyfvmwj*Be5Z2$|a=tOKz1Q-UI6;V`ZZ z%AE6Te*YQs$|`23DYabkcCZ$afa^ViTOjje$PAjd&TyII zl>wla%MtmZ&LUtFmmtzZz3iw76fo;;5VVq}GA|;}wZx=%@0BVdpw-Ehvxo{Xk5+Jb z!i7+%E`7YV-IjP!#(%Je)D%{T)sCY9@OtixpImk1G*_R3?qBxy+ng$rguOIdx4pH_$#30X z%~VK`t1pcBYwA5?yUgjBwiH-Qs2Xq+Vxv)K%6wt8mz68#*lQx<_w%{K;iFcJ?b5&r z(cX`6+frJc5N-rwTpxn1o8_L8In1%x?_obofJMZeblyZ#yTx676vq8jM5l3A!FN1S zKN=DL6QGm1i1-fnZimbw2UhlzNBe8Kd|gFN?$dP~^*bP+1-@G`#ff&af}wn$F!AH6uhVK;ixp@4sQ?10)*_KaFY0{Tu3m@XB#~1Ub?DvSv z#g}?Yz=dT4B^Is^cS?y@a@XXN9x5#4eKTet=G?&1pwta{7V~r>Ya4=H@Y;c~l-Ap9 zoVzZ&S|h;V$zA$6X}+m|eQrdAuHC3U*HZV?_0x!OGr$uG5E}(fCx1`)a-C!^W14-dHuI?v6+Pp0#OjlpOqgD2jlaKY?BntLUU8^n>Xs`$2Y zsW$}Zkbm^*ufN2SFDAOSo`)M-Cv*M!eFD8N&=_)MXe10i;j1u0wyh_T_)gW?cw(ZY z%Ya=s=WahGcF>`GHaOp&*ec^>j`R%ddiGB2Cpgbkq*2zCotNiE>XH_ zD;8i+JHHL%H&qjDq4=fosQMSlhL^)u@voOGwCcIQH1Kntx8I_N3!}1L=YO|)JC5O@ zJLtv#wr^w;ZKO41=>*>%!ZIqX2&N>uA&#PP>%w~gBQQMS?GIPmjZ+gBun}E4X-2l4 z#+_IaT)_{i+oGjM*@LGNV?*^Z1-rssElGHjzMl)}CT@WD0^;9BshK!-R{rttFYBms{;DX#O!O?YYD_*nLkvs5wzMpd?w zbMLV0N;ah6;iigGpq--{4`+XX?pz15K(O1!GA$fw&K+eRZ7Re|JC7jbrFgaD9>CtU zIVu(IGuFo?(2wqOy=J+$`fEFd`G zC}Tv#y*-Lpc1K>#VGTor2P2fA7>jqo+?NOE7+QmKl!1`#lx=LE1}lL>f>HnG=05Mr z8b zPv4Ur_-#DY{TgZFvU?NV;_dniuD^&<5Kn!_K`aj?Ig}ofXTmbSt%atqTMz`C9@kGm zY!}K}e_E1gjne_cbZnhnM|cws?|>6;!Uoi#i*wRI>F^nM8p^h!ol>xJ3Npm$D`-=d z=*tn&_ScC058R)G)0yh3U>)WLH|k+?D^q=zPCz#nMIrs4FK;ruN@h6TEVGxCEbsEU zWq<+h-=Odk&=Q|2GG}F&=yCZBi6AlMnn`MV^bK?2ZcHuPw5nkHzwD_fE^>~rS@NQm zX-Y4{VL{6G5y9N<r+X#Lo*Of$x)PA#E7Qmquh@F<40`?A1;3Ui<{U W@av$Wc(YYySsald{eL literal 0 HcmV?d00001 diff --git a/Apps/Sandcastle/gallery/3D Models.html b/Apps/Sandcastle/gallery/3D Models.html index 525139952345..faa2af95ed0a 100644 --- a/Apps/Sandcastle/gallery/3D Models.html +++ b/Apps/Sandcastle/gallery/3D Models.html @@ -19,45 +19,10 @@

Loading...

-
- - - - - - - - - - - - - - - - - -
Mode
Color
Alpha - - -
Mix - - -
-
+
- + \ No newline at end of file From 6a60f25a97858de0057dd5ecef08ef851ff47234 Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Tue, 6 Dec 2016 10:40:30 -0500 Subject: [PATCH 13/14] Use ColorBlendMode.getColorBlend function --- Source/Scene/ColorBlendMode.js | 17 +++++++++++++++-- Source/Scene/Model.js | 11 +---------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/Source/Scene/ColorBlendMode.js b/Source/Scene/ColorBlendMode.js index 732760e7ee00..224acbb5284e 100644 --- a/Source/Scene/ColorBlendMode.js +++ b/Source/Scene/ColorBlendMode.js @@ -1,8 +1,10 @@ /*global define*/ define([ - '../Core/freezeObject' + '../Core/freezeObject', + '../Core/Math' ], function( - freezeObject) { + freezeObject, + CesiumMath) { 'use strict'; /** @@ -22,5 +24,16 @@ define([ MIX : 2 }; + ColorBlendMode.getColorBlend = function(colorBlendMode, colorBlendAmount) { + if (colorBlendMode === ColorBlendMode.HIGHLIGHT) { + return 0.0; + } else if (colorBlendMode === ColorBlendMode.REPLACE) { + return 1.0; + } else if (colorBlendMode === ColorBlendMode.MIX) { + // The value 0.0 is reserved for highlight, so clamp to just above 0.0. + return CesiumMath.clamp(colorBlendAmount, CesiumMath.EPSILON4, 1.0); + } + }; + return freezeObject(ColorBlendMode); }); \ No newline at end of file diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index b86759931900..63e57103369f 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -2927,16 +2927,7 @@ define([ function createColorBlendFunction(model) { return function() { - var colorBlendMode = model.colorBlendMode; - var colorBlendAmount = model.colorBlendAmount; - if (colorBlendMode === ColorBlendMode.HIGHLIGHT) { - return 0.0; - } else if (colorBlendMode === ColorBlendMode.REPLACE) { - return 1.0; - } else if (colorBlendMode === ColorBlendMode.MIX) { - // The value 0.0 is reserved for highlight, so clamp to just above 0.0. - return CesiumMath.clamp(colorBlendAmount, CesiumMath.EPSILON4, 1.0); - } + return ColorBlendMode.getColorBlend(model.colorBlendMode, model.colorBlendAmount); }; } From f23d43635dfe65c54fb09f5934f3ba3d1bba352d Mon Sep 17 00:00:00 2001 From: Sean Lilley Date: Tue, 6 Dec 2016 11:50:49 -0500 Subject: [PATCH 14/14] Don't issue command when alpha is 0 --- Source/Scene/Model.js | 8 +++++--- Specs/Scene/ModelSpec.js | 8 +++++++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index 63e57103369f..703abe4e8708 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -3505,7 +3505,8 @@ define([ function updateColor(model, frameState) { var scene3DOnly = frameState.scene3DOnly; - if (model.color.alpha < 1.0) { + var alpha = model.color.alpha; + if ((alpha > 0.0) && (alpha < 1.0)) { var nodeCommands = model._nodeCommands; var length = nodeCommands.length; // Generate translucent commands when the blend color has an alpha less than 1.0 @@ -3857,8 +3858,9 @@ define([ } } + var alpha = this.color.alpha; var displayConditionPassed = defined(this.distanceDisplayCondition) ? distanceDisplayConditionVisible(this, frameState) : true; - var show = this.show && displayConditionPassed && (this.scale !== 0.0); + var show = this.show && displayConditionPassed && (this.scale !== 0.0) && (alpha > 0.0); if ((show && this._state === ModelState.LOADED) || justLoaded) { var animated = this.activeAnimations.update(frameState) || this._cesiumAnimationsDirty; @@ -3949,7 +3951,7 @@ define([ for (i = 0; i < length; ++i) { nc = nodeCommands[i]; if (nc.show) { - var translucent = (this.color.alpha < 1.0); + var translucent = (alpha < 1.0); var command = translucent ? nc.translucentCommand : nc.command; commandList.push(command); boundingVolume = nc.command.boundingVolume; diff --git a/Specs/Scene/ModelSpec.js b/Specs/Scene/ModelSpec.js index c6e056fb8808..3e4d240a34e1 100644 --- a/Specs/Scene/ModelSpec.js +++ b/Specs/Scene/ModelSpec.js @@ -1915,13 +1915,19 @@ defineSuite([ expect(sourceColor[1]).toEqual(0); expect(sourceColor[2]).toEqual(0); - // Check alpha. + // Check alpha model.colorBlendMode = ColorBlendMode.REPLACE; model.color = Color.fromAlpha(Color.LIME, 0.5); color = scene.renderForSpecs(); expect(color[0]).toEqual(0); expect(color[1]).toBeLessThan(255); expect(color[1]).toBeGreaterThan(0); + + // No commands are issued when the alpha is 0.0 + model.color = Color.fromAlpha(Color.LIME, 0.0); + scene.renderForSpecs(); + var commands = scene.frameState.commandList; + expect(commands.length).toBe(0); }); });