///////////////////////////////////////////////////// ///////////////////////////////////////////////////// // // SwitchIfSquare // ///////////////////////////////////////////////////// ///////////////////////////////////////////////////// //#include "precomp.h" #include "CKAll.h" CKObjectDeclaration *FillBehaviorSwitchIfSquareDecl(); CKERROR CreateSwitchIfSquareProto(CKBehaviorPrototype **); int SwitchIfSquare(const CKBehaviorContext& behcontext); CKERROR SwitchIfSquareCallBack(const CKBehaviorContext& behcontext); // CallBack Function CKObjectDeclaration *FillBehaviorSwitchIfSquareDecl() { CKObjectDeclaration *od = CreateCKObjectDeclaration("Switch If Square"); od->SetDescription("Switch streaming if the value on the specified layer on the specified position isn't NULL."); /* rem: In : triggers the process.

None : is activated when the process is completed.
Layer1 : is activated when a none null value is detected on first layer, at the specific position.
Layer2 : is activated when a none null value is detected on second layer, at the specific position.
...

Pos3d : 3d position to be converted into a 2d position in the affected grid.
Ref : basis in which the 3d position is expressed.
Layer1 : First layer to be considered.
Layer2 : Second layer to be considered.
...

Value1 : Value of square from first Layer.
Value2 : Value of square from second Layer.
...


Remember, if you want to express an object position just set the referential as your object, and let 3dpos to (0,0,0).
*/ /* warning: - by now the only possible values are bound to a 0-255 range.
*/ od->SetType( CKDLL_BEHAVIORPROTOTYPE ); od->SetCategory("Grids/Basic"); od->SetGuid(CKGUID(0x254074c1,0x22c0397e)); od->SetAuthorGuid(VIRTOOLS_GUID); od->SetAuthorName("Virtools"); od->SetVersion(0x00010000); od->SetCreationFunction(CreateSwitchIfSquareProto); od->SetCompatibleClassId(CKCID_BEOBJECT); return od; } CKERROR CreateSwitchIfSquareProto(CKBehaviorPrototype **pproto) { CKBehaviorPrototype *proto = CreateCKBehaviorPrototype("Switch If Square"); if(!proto) return CKERR_OUTOFMEMORY; proto->DeclareInput("In"); proto->DeclareOutput("None"); proto->DeclareOutput("Layer1"); proto->DeclareInParameter("Pos 3D", CKPGUID_VECTOR, "0,0,0" ); proto->DeclareInParameter("Ref", CKPGUID_3DENTITY ); proto->DeclareInParameter("Layer1", CKPGUID_LAYERTYPE, DEFAULT_LAYER_NAME ); proto->DeclareOutParameter("Value1", CKPGUID_INT ); proto->SetFlags(CK_BEHAVIORPROTOTYPE_NORMAL); proto->SetFunction(SwitchIfSquare); proto->SetBehaviorFlags((CK_BEHAVIOR_FLAGS)(CKBEHAVIOR_VARIABLEPARAMETERINPUTS|CKBEHAVIOR_INTERNALLYCREATEDOUTPUTS|CKBEHAVIOR_INTERNALLYCREATEDOUTPUTPARAMS|CKBEHAVIOR_INTERNALLYCREATEDINPUTPARAMS)); proto->SetBehaviorCallbackFct( SwitchIfSquareCallBack, CKCB_BEHAVIORALL ); *pproto = proto; return CK_OK; } int SwitchIfSquare(const CKBehaviorContext& behcontext) { CKBehavior* beh = behcontext.Behavior; CKContext* ctx = behcontext.Context; beh->ActivateInput(0, FALSE); //_________________________________/ Retrieve Inputs VxVector pos(0,0,0); beh->GetInputParameterValue(0, &pos); CK3dEntity *ref = (CK3dEntity *)beh->GetInputParameterObject(1); //_________________________________/ Get Preferred Grid CKGridManager *gm = (CKGridManager *) ctx->GetManagerByGuid(GRID_MANAGER_GUID); CKGrid *grid = gm->GetPreferredGrid( &pos, ref); BOOL none=TRUE; if( grid ){ VxVector tmp; grid->InverseTransform(&tmp, &pos, ref); int x = (int)tmp.x; int y = (int)tmp.z; int value, layer_type; CKLayer *layer; int count = beh->GetInputParameterCount() - 2; while( count ){ --count; layer_type=1; beh->GetInputParameterValue(count+2, &layer_type); if( layer = grid->GetLayer( layer_type ) ){ value=0; layer->GetValue(x, y, &value); beh->SetOutputParameterValue(count, &value); if( value ){ beh->ActivateOutput(count+1); none=FALSE; } } } } if(none) beh->ActivateOutput(0); return CKBR_OK; } /*******************************************************/ /* CALLBACK */ /*******************************************************/ CKERROR SwitchIfSquareCallBack(const CKBehaviorContext& behcontext) { CKBehavior* beh = behcontext.Behavior; switch( behcontext.CallbackMessage ){ case CKM_BEHAVIOREDITED: { int c_out = beh->GetOutputCount()-1; int c_pin = beh->GetInputParameterCount()-2; int c_pout = beh->GetOutputParameterCount(); char out_str[15]; while( c_out < c_pin ){ // we must add 'Outputs' sprintf( out_str, "Layer%d", c_out+1 ); beh->AddOutput( out_str ); c_out++; } while( c_out > c_pin ){ // we must remove 'Outputs' beh->DeleteOutput(c_out); c_out--; } CKParameter*pout; while( c_pout < c_pin ){ // we must add 'Output Params' sprintf( out_str, "Value%d", c_pout+1 ); beh->CreateOutputParameter(out_str, CKPGUID_INT); c_pout++; } while( c_pout > c_pin ){ // we must remove 'Output Params' pout = beh->GetOutputParameter(c_pout-1); CKDestroyObject(pout); c_pout--; } CKParameterIn *pin1; if( pin1 = beh->GetInputParameter(0) ){ CKParameterIn *pin; int type_1 = pin1->GetType(); while( c_pin ){ // we check the type of each 'Input Parameter' c_pin--; pin = beh->GetInputParameter( c_pin+2 ); if( pin->GetGUID() != CKPGUID_LAYERTYPE ){ pin->SetGUID( CKPGUID_LAYERTYPE ); if( pout = pin->GetRealSource() ){ pout->SetGUID( CKPGUID_LAYERTYPE ); } } } } } break; } return CKBR_OK; }