1
1
/*global define*/
2
2
define ( [
3
3
'../Core/BoundingSphere' ,
4
+ '../Core/Cartesian3' ,
4
5
'../Core/clone' ,
5
6
'../Core/combine' ,
6
7
'../Core/ComponentDatatype' ,
@@ -34,6 +35,7 @@ define([
34
35
'./SceneMode'
35
36
] , function (
36
37
BoundingSphere ,
38
+ Cartesian3 ,
37
39
clone ,
38
40
combine ,
39
41
ComponentDatatype ,
@@ -266,6 +268,18 @@ define([
266
268
*/
267
269
this . debugShowBoundingVolume = defaultValue ( options . debugShowBoundingVolume , false ) ;
268
270
271
+ /**
272
+ * @private
273
+ */
274
+ this . rtcCenter = options . rtcCenter ;
275
+ this . _modifiedModelView = new Matrix4 ( ) ;
276
+
277
+ //>>includeStart('debug', pragmas.debug);
278
+ if ( defined ( this . rtcCenter ) && ( ! defined ( this . geometryInstances ) || ( isArray ( this . geometryInstances ) && this . geometryInstances !== 1 ) ) ) {
279
+ throw new DeveloperError ( 'Relative-to-center rendering only supports one geometry instance.' ) ;
280
+ }
281
+ //>>includeEnd('debug');
282
+
269
283
this . _translucent = undefined ;
270
284
271
285
this . _state = PrimitiveState . READY ;
@@ -499,7 +513,7 @@ define([
499
513
500
514
var positionRegex = / a t t r i b u t e \s + v e c (?: 3 | 4 ) \s + ( .* ) 3 D H i g h ; / g;
501
515
502
- Primitive . _createColumbusViewShader = function ( vertexShaderSource , scene3DOnly ) {
516
+ Primitive . _modifyShaderPosition = function ( primitive , vertexShaderSource , scene3DOnly ) {
503
517
var match ;
504
518
505
519
var forwardDecl = '' ;
@@ -516,38 +530,58 @@ define([
516
530
forwardDecl += functionName + ';\n' ;
517
531
}
518
532
519
- if ( ! scene3DOnly ) {
520
- attributes +=
521
- 'attribute vec3 ' + name + '2DHigh;\n' +
522
- 'attribute vec3 ' + name + '2DLow;\n' ;
523
-
524
- computeFunctions +=
525
- functionName + '\n' +
526
- '{\n' +
527
- ' vec4 p;\n' +
528
- ' if (czm_morphTime == 1.0)\n' +
529
- ' {\n' +
530
- ' p = czm_translateRelativeToEye(' + name + '3DHigh, ' + name + '3DLow);\n' +
531
- ' }\n' +
532
- ' else if (czm_morphTime == 0.0)\n' +
533
- ' {\n' +
534
- ' p = czm_translateRelativeToEye(' + name + '2DHigh.zxy, ' + name + '2DLow.zxy);\n' +
535
- ' }\n' +
536
- ' else\n' +
537
- ' {\n' +
538
- ' p = czm_columbusViewMorph(\n' +
539
- ' czm_translateRelativeToEye(' + name + '2DHigh.zxy, ' + name + '2DLow.zxy),\n' +
540
- ' czm_translateRelativeToEye(' + name + '3DHigh, ' + name + '3DLow),\n' +
541
- ' czm_morphTime);\n' +
542
- ' }\n' +
543
- ' return p;\n' +
544
- '}\n\n' ;
533
+ if ( ! defined ( primitive . rtcCenter ) ) {
534
+ // Use GPU RTE
535
+ if ( ! scene3DOnly ) {
536
+ attributes +=
537
+ 'attribute vec3 ' + name + '2DHigh;\n' +
538
+ 'attribute vec3 ' + name + '2DLow;\n' ;
539
+
540
+ computeFunctions +=
541
+ functionName + '\n' +
542
+ '{\n' +
543
+ ' vec4 p;\n' +
544
+ ' if (czm_morphTime == 1.0)\n' +
545
+ ' {\n' +
546
+ ' p = czm_translateRelativeToEye(' + name + '3DHigh, ' + name + '3DLow);\n' +
547
+ ' }\n' +
548
+ ' else if (czm_morphTime == 0.0)\n' +
549
+ ' {\n' +
550
+ ' p = czm_translateRelativeToEye(' + name + '2DHigh.zxy, ' + name + '2DLow.zxy);\n' +
551
+ ' }\n' +
552
+ ' else\n' +
553
+ ' {\n' +
554
+ ' p = czm_columbusViewMorph(\n' +
555
+ ' czm_translateRelativeToEye(' + name + '2DHigh.zxy, ' + name + '2DLow.zxy),\n' +
556
+ ' czm_translateRelativeToEye(' + name + '3DHigh, ' + name + '3DLow),\n' +
557
+ ' czm_morphTime);\n' +
558
+ ' }\n' +
559
+ ' return p;\n' +
560
+ '}\n\n' ;
561
+ } else {
562
+ computeFunctions +=
563
+ functionName + '\n' +
564
+ '{\n' +
565
+ ' return czm_translateRelativeToEye(' + name + '3DHigh, ' + name + '3DLow);\n' +
566
+ '}\n\n' ;
567
+ }
545
568
} else {
569
+ // Use RTC
570
+ vertexShaderSource = vertexShaderSource . replace ( / a t t r i b u t e \s + v e c (?: 3 | 4 ) \s + p o s i t i o n 3 D H i g h ; / g, '' ) ;
571
+ vertexShaderSource = vertexShaderSource . replace ( / a t t r i b u t e \s + v e c (?: 3 | 4 ) \s + p o s i t i o n 3 D L o w ; / g, '' ) ;
572
+
573
+ forwardDecl += 'uniform mat4 u_modifiedModelView;\n' ;
574
+ attributes += 'attribute vec4 position;\n' ;
575
+
546
576
computeFunctions +=
547
577
functionName + '\n' +
548
578
'{\n' +
549
- ' return czm_translateRelativeToEye(' + name + '3DHigh, ' + name + '3DLow) ;\n' +
579
+ ' return u_modifiedModelView * position ;\n' +
550
580
'}\n\n' ;
581
+
582
+
583
+ vertexShaderSource = vertexShaderSource . replace ( / c z m _ m o d e l V i e w R e l a t i v e T o E y e \s + \* \s + / g, '' ) ;
584
+ vertexShaderSource = vertexShaderSource . replace ( / c z m _ m o d e l V i e w P r o j e c t i o n R e l a t i v e T o E y e / g, 'czm_projection' ) ;
551
585
}
552
586
}
553
587
@@ -1031,7 +1065,7 @@ define([
1031
1065
function createShaderProgram ( primitive , frameState , appearance ) {
1032
1066
var context = frameState . context ;
1033
1067
1034
- var vs = Primitive . _createColumbusViewShader ( appearance . vertexShaderSource , frameState . scene3DOnly ) ;
1068
+ var vs = Primitive . _modifyShaderPosition ( primitive , appearance . vertexShaderSource , frameState . scene3DOnly ) ;
1035
1069
vs = Primitive . _appendShowToShader ( primitive , vs ) ;
1036
1070
vs = modifyForEncodedNormals ( primitive , vs ) ;
1037
1071
var fs = appearance . getFragmentShaderSource ( ) ;
@@ -1090,6 +1124,12 @@ define([
1090
1124
}
1091
1125
var uniforms = combine ( appearanceUniformMap , materialUniformMap ) ;
1092
1126
1127
+ if ( defined ( primitive . rtcCenter ) ) {
1128
+ uniforms . u_modifiedModelView = function ( ) {
1129
+ return primitive . _modifiedModelView ;
1130
+ } ;
1131
+ }
1132
+
1093
1133
var pass = translucent ? Pass . TRANSLUCENT : Pass . OPAQUE ;
1094
1134
1095
1135
colorCommands . length = primitive . _va . length * ( twoPasses ? 2 : 1 ) ;
@@ -1184,6 +1224,8 @@ define([
1184
1224
attributes . length = 0 ;
1185
1225
}
1186
1226
1227
+ var rtcScratch = new Cartesian3 ( ) ;
1228
+
1187
1229
function updateAndQueueCommands ( primitive , frameState , colorCommands , pickCommands , modelMatrix , cull , debugShowBoundingVolume , twoPasses ) {
1188
1230
//>>includeStart('debug', pragmas.debug);
1189
1231
if ( frameState . mode !== SceneMode . SCENE3D && ! Matrix4 . equals ( modelMatrix , Matrix4 . IDENTITY ) ) {
@@ -1207,6 +1249,13 @@ define([
1207
1249
}
1208
1250
}
1209
1251
1252
+ if ( defined ( primitive . rtcCenter ) ) {
1253
+ var viewMatrix = frameState . camera . viewMatrix ;
1254
+ Matrix4 . multiply ( viewMatrix , primitive . _modelMatrix , primitive . _modifiedModelView ) ;
1255
+ Matrix4 . multiplyByPoint ( primitive . _modifiedModelView , primitive . rtcCenter , rtcScratch ) ;
1256
+ Matrix4 . setTranslation ( primitive . _modifiedModelView , rtcScratch , primitive . _modifiedModelView ) ;
1257
+ }
1258
+
1210
1259
var boundingSpheres ;
1211
1260
if ( frameState . mode === SceneMode . SCENE3D ) {
1212
1261
boundingSpheres = primitive . _boundingSphereWC ;
@@ -1270,6 +1319,10 @@ define([
1270
1319
throw this . _error ;
1271
1320
}
1272
1321
1322
+ if ( defined ( this . rtcCenter ) && ! frameState . scene3DOnly ) {
1323
+ throw new DeveloperError ( 'RTC rendering is only available for 3D only scenes.' ) ;
1324
+ }
1325
+
1273
1326
if ( this . _state === PrimitiveState . FAILED ) {
1274
1327
return ;
1275
1328
}
0 commit comments