‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
duplicaterenderbundle.csc
Go to the documentation of this file.
1 #using scripts\codescripts\struct;
2 
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\filter_shared;
5 #using scripts\shared\math_shared;
6 #using scripts\shared\system_shared;
7 #using scripts\shared\util_shared;
8 #using scripts\shared\gfx_shared;
9 
10 #insert scripts\shared\shared.gsh;
11 #insert scripts\shared\duplicaterender.gsh;
12 
13 #namespace duplicate_render_bundle;
14 
15 //-----------------------------------------------------------------------------
16 ‪REGISTER_SYSTEM( "duplicate_render_bundle", &‪__init__, undefined )
17 
18 function ‪__init__()
19 {
21 }
22 
24 {
26 }
27 
28 //-----------------------------------------------------------------------------
30 {
31  if ( isdefined( self.dupRenderBundelsInited ) )
32  return;
33 
34  self.dupRenderBundelsInited = true;
35  self.playingdupRenderBundle = "";
36  self.forceStopdupRenderBundle = false;
37  self.exitdupRenderBundle = false;
38 }
39 
40 
41 //-----------------------------------------------------------------------------
42 
43 function ‪playDupRenderBundle( playBundleName )
44 {
45  self endon("entityshutdown");
46 
48 
49  stopPlayingdupRenderBundle();
50 
51  bundle = ‪struct::get_script_bundle( "duprenderbundle", playBundleName );
52  if ( !isdefined( bundle ) )
53  {
54  /#
55  println( "ERROR: dupRender bundle '" + playBundleName + "' not found" );
56  #/
57  return;
58  }
59 
60  totalAccumTime = 0;
61 
63 
64  self.playingdupRenderBundle = playBundleName;
65 
66  localClientNum = self.localClientNum;
67 
68  looping = false;
69  enterStage = false;
70  exitStage = false;
71  finishLoopOnExit = false;
72 
73  ‪SET_IF_DEFINED( looping, bundle.looping );
74  ‪SET_IF_DEFINED( enterStage, bundle.enterStage );
75  ‪SET_IF_DEFINED( exitStage, bundle.exitStage );
76  ‪SET_IF_DEFINED( finishLoopOnExit, bundle.finishLoopOnExit );
77 
78  if ( looping )
79  {
80  num_stages = 1;
81  if ( enterStage )
82  num_stages++;
83  if ( exitStage )
84  num_stages++;
85  }
86  else
87  {
88  num_stages = bundle.num_stages;
89  }
90 
91  for ( stageIdx = 0 ; stageIdx < num_stages && !self.forceStopdupRenderBundle ; stageIdx++ )
92  {
93  stagePrefix = "s";
94  if ( stageIdx < 10 ) stagePrefix += "0";
95  stagePrefix += stageIdx + "_";
96 
97  stageLength = GetStructField( bundle, stagePrefix + "length" );
98  if ( !isdefined( stageLength ) )
99  {
100  finishPlayingdupRenderBundle( localClientNum, stagePrefix + " length not defined" );
101  return;
102  }
103  stageLength *= 1000;
104 
105  // Set the duplicate render:
106  ‪AddDupMaterial( localClientNum, bundle, stagePrefix + "fb_", ‪DR_TYPE_FRAMEBUFFER );
107  ‪AddDupMaterial( localClientNum, bundle, stagePrefix + "dupfb_", ‪DR_TYPE_FRAMEBUFFER_DUPLICATE );
108  ‪AddDupMaterial( localClientNum, bundle, stagePrefix + "sonar_", ‪DR_TYPE_OFFSCREEN );
109 
110  loopingStage = looping && ( !enterStage && stageIdx == 0 || enterStage && stageIdx == 1 );
111 
112  accumTime = 0;
113  prevTime = self GetClientTime();
114  while ( ( loopingStage || accumTime < stageLength ) && !self.forceStopdupRenderBundle )
115  {
116  ‪gfx::SetStage( localClientNum, bundle, undefined, stagePrefix, stageLength, accumTime, totalAccumTime, &‪SetShaderConstants );
117 
119 
120  currTime = self GetClientTime();
121  deltaTime = currTime - prevTime;
122  accumTime += deltaTime;
123  totalAccumTime += deltaTime;
124 
125  prevTime = currTime;
126 
127  if ( loopingStage )
128  {
129  while ( accumTime >= stageLength )
130  accumTime -= stageLength;
131 
132  if ( self.exitdupRenderBundle )
133  {
134  loopingStage = false;
135  if ( !finishLoopOnExit )
136  break;
137  }
138  }
139  }
140 
141  self disableduplicaterendering();
142  }
143 
144  finishPlayingdupRenderBundle( localClientNum, "Finished " + playBundleName );
145 }
146 
147 //-----------------------------------------------------------------------------------------------------------
148 function ‪AddDupMaterial( localClientNum, bundle, prefix, type )
149 {
150  method = ‪DR_METHOD_OFF;
151  methodStr = GetStructField( bundle, prefix + "method" );
152  if ( isDefined( methodStr ) )
153  {
154  switch( methodStr )
155  {
156  case "off":
157  method = ‪DR_METHOD_OFF;
158  break;
159  case "default material":
161  break;
162  case "custom material":
164  break;
165  case "force custom material":
167  break;
168  case "thermal":
170  break;
171  case "enemy material":
173  break;
174  }
175  }
176 
177  materialName = GetStructField( bundle, prefix + "mc_material" );
178 
179  materialId = -1;
180  if ( isDefined( materialName ) && materialName != "" )
181  {
182  materialName = "mc/" + materialName; // TODO: Don't hard code "mc"?
183  materialId = ‪filter::mapped_material_id( materialName );
184  if ( !isDefined( materialId ) )
185  {
186  ‪filter::map_material_helper_by_localclientnum( localClientNum, materialName );
187  materialId = ‪filter::mapped_material_id( );
188  if ( !isDefined( materialId ) )
189  materialId = -1;
190  }
191  }
192 
193  self AddDuplicateRenderOption( type, method, materialId );
194 }
195 
196 //-----------------------------------------------------------------------------------------------------------
197 function ‪SetShaderConstants( localClientNum, shaderConstantName, filterid, values )
198 {
199  self MapShaderConstant( localClientNum, 0, shaderConstantName, values[0], values[1], values[2], values[3] );
200 }
201 
202 //-----------------------------------------------------------------------------
203 
204 function ‪finishPlayingDupRenderBundle( localClientNum, msg )
205 {
206  /#
207  if ( isdefined( msg ) )
208  {
209  println( msg );
210  }
211  #/
212 
213  self.forceStopdupRenderBundle = false;
214  self.exitdupRenderBundle = false;
215  self.playingdupRenderBundle = "";
216 }
217 
218 //-----------------------------------------------------------------------------
219 
221 {
222  if ( self.playingdupRenderBundle != "" )
223  {
224  stopdupRenderBundle();
225  }
226 }
227 
229 {
230  if ( !‪IS_TRUE( self.forceStopdupRenderBundle ) && isdefined( self.playingdupRenderBundle ) && self.playingdupRenderBundle != "" )
231  {
232  self.forceStopdupRenderBundle = true;
233 
234  while ( self.playingdupRenderBundle != "" )
235  {
237 
238  if ( !isdefined( self ) )
239  {
240  return;
241  }
242  }
243  }
244 }
245 
247 {
248  if ( !‪IS_TRUE( self.exitdupRenderBundle ) && isdefined( self.playingdupRenderBundle ) && self.playingdupRenderBundle != "" )
249  {
250  self.exitdupRenderBundle = true;
251  }
252 }
‪finishPlayingDupRenderBundle
‪function finishPlayingDupRenderBundle(localClientNum, msg)
Definition: duplicaterenderbundle.csc:204
‪on_localplayer_spawned
‪function on_localplayer_spawned(local_client_num)
Definition: _perks.csc:109
‪DR_METHOD_ENEMY_MATERIAL
‪#define DR_METHOD_ENEMY_MATERIAL
Definition: duplicaterender.gsh:12
‪stopDupRenderBundle
‪function stopDupRenderBundle()
Definition: duplicaterenderbundle.csc:228
‪map_material_helper_by_localclientnum
‪function map_material_helper_by_localclientnum(localClientNum, materialname)
Definition: filter_shared.csc:12
‪DR_METHOD_THERMAL_MATERIAL
‪#define DR_METHOD_THERMAL_MATERIAL
Definition: duplicaterender.gsh:10
‪SetStage
‪function SetStage(localClientNum, bundle, filterid, stagePrefix, stageLength, accumTime, totalAccumTime, setConstants)
Definition: gfx_shared.csc:16
‪DR_TYPE_OFFSCREEN
‪#define DR_TYPE_OFFSCREEN
Definition: duplicaterender.gsh:6
‪SetShaderConstants
‪function SetShaderConstants(localClientNum, shaderConstantName, filterid, values)
Definition: duplicaterenderbundle.csc:197
‪DR_METHOD_CUSTOM_MATERIAL
‪#define DR_METHOD_CUSTOM_MATERIAL
Definition: duplicaterender.gsh:11
‪init_filter_indices
‪function init_filter_indices()
Definition: filter_shared.csc:7
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪DR_METHOD_OFF
‪#define DR_METHOD_OFF
Definition: duplicaterender.gsh:8
‪REGISTER_SYSTEM
‪#define REGISTER_SYSTEM(__sys, __func_init_preload, __reqs)
Definition: shared.gsh:204
‪SET_IF_DEFINED
‪#define SET_IF_DEFINED(__target, __src)
Definition: shared.gsh:442
‪__init__
‪function __init__()
Definition: duplicaterenderbundle.csc:18
‪stopPlayingDupRenderBundle
‪function stopPlayingDupRenderBundle()
Definition: duplicaterenderbundle.csc:220
‪DR_TYPE_FRAMEBUFFER
‪#define DR_TYPE_FRAMEBUFFER
Definition: duplicaterender.gsh:4
‪init_duplicate_render_bundles
‪function init_duplicate_render_bundles()
Definition: duplicaterenderbundle.csc:29
‪AddDupMaterial
‪function AddDupMaterial(localClientNum, bundle, prefix, type)
Definition: duplicaterenderbundle.csc:148
‪playDupRenderBundle
‪function playDupRenderBundle(playBundleName)
Definition: duplicaterenderbundle.csc:43
‪localplayer_duplicate_render_bundle_init
‪function localplayer_duplicate_render_bundle_init(localClientNum)
Definition: duplicaterenderbundle.csc:23
‪get_script_bundle
‪function get_script_bundle(str_type, str_name)
Definition: struct.csc:45
‪exitDupRenderBundle
‪function exitDupRenderBundle()
Definition: duplicaterenderbundle.csc:246
‪WAIT_CLIENT_FRAME
‪#define WAIT_CLIENT_FRAME
Definition: shared.gsh:266
‪mapped_material_id
‪function mapped_material_id(materialname)
Definition: filter_shared.csc:35
‪DR_METHOD_DEFAULT_MATERIAL
‪#define DR_METHOD_DEFAULT_MATERIAL
Definition: duplicaterender.gsh:9
‪DR_TYPE_FRAMEBUFFER_DUPLICATE
‪#define DR_TYPE_FRAMEBUFFER_DUPLICATE
Definition: duplicaterender.gsh:5