///////////////////////////////////////////////////// ///////////////////////////////////////////////////// // // CameraView // ///////////////////////////////////////////////////// ///////////////////////////////////////////////////// #include "CKAll.h" CKObjectDeclaration *FillBehaviorCameraViewDecl(); CKERROR CreateCameraViewProto(CKBehaviorPrototype **); int CameraView(const CKBehaviorContext& context); void CameraViewRender(CKRenderContext *dev, void *arg); CKObjectDeclaration *FillBehaviorCameraViewDecl() { CKObjectDeclaration *od = CreateCKObjectDeclaration("Additional View"); od->SetDescription("Allows additional views to be displayed on screen simultaneously."); /* rem: On: activates the process.
Off: deactivates the process.

Exit On: is activated when the behavior's process is started.
Exit Off: is activated when the behavior's process is stopped.

View Region: the screen region defined by a rectangle in which the render will be done.
Render Options: options of rendering.
Overwrite 2D: if TRUE, renders the view above every 2d content.

*/ od->SetCategory("Interface/Screen"); od->SetType( CKDLL_BEHAVIORPROTOTYPE); od->SetGuid(CKGUID(0x00cd159b, 0x164d010b)); od->SetAuthorGuid(VIRTOOLS_GUID); od->SetAuthorName("Virtools"); od->SetVersion(0x00020000); od->SetCreationFunction(CreateCameraViewProto); od->SetCompatibleClassId(CKCID_CAMERA); return od; } CKERROR CreateCameraViewProto(CKBehaviorPrototype **pproto) { CKBehaviorPrototype *proto = CreateCKBehaviorPrototype("Additional View"); if(!proto) return CKERR_OUTOFMEMORY; proto->DeclareInput("On"); proto->DeclareInput("Off"); proto->DeclareOutput("Exit On"); proto->DeclareOutput("Exit Off"); proto->DeclareInParameter("View Region", CKPGUID_RECT, "(0,0),(100,60)" ); proto->DeclareInParameter("Render Options", CKPGUID_RENDEROPTIONS, "Background Sprites,Clear ZBuffer,Clear Back Buffer" ); proto->DeclareInParameter("Overwrite 2D", CKPGUID_BOOL, "TRUE" ); proto->SetFlags(CK_BEHAVIORPROTOTYPE_NORMAL); proto->SetFunction(CameraView); proto->SetBehaviorFlags(CKBEHAVIOR_TARGETABLE); *pproto = proto; return CK_OK; } int CameraView(const CKBehaviorContext& behcontext) { CKBehavior* beh = behcontext.Behavior; CKContext* ctx = behcontext.Context; if(!beh) return CKBR_BEHAVIORERROR; if( beh->IsInputActive(1) ){ // we enter by 'OFF' beh->ActivateInput(1, FALSE); beh->ActivateOutput(1); return CKBR_OK; } if (beh->IsInputActive(0) ){ // we enter by 'ON' beh->ActivateInput(0, FALSE); beh->ActivateOutput(0); } CKRenderContext *rcontext = ctx->GetPlayerRenderContext(); if( rcontext ) { CKBOOL o2D = TRUE; beh->GetInputParameterValue(2,&o2D); if (o2D) rcontext->AddPostSpriteRenderCallBack(CameraViewRender,(void *)beh->GetID(),TRUE); else rcontext->AddPostRenderCallBack(CameraViewRender,(void *)beh->GetID(),TRUE); } return CKBR_ACTIVATENEXTFRAME; } void CameraViewRender(CKRenderContext *dev, void *arg) { CKContext* ctx = dev->GetCKContext(); CKBehavior* beh = (CKBehavior*)CKGetObject(dev->GetCKContext(),(CK_ID)arg); if (!beh) return; //CKBehavior* beh = (CKBehavior*)arg; // Prevent Infinite loop CKBOOL infunction = (CKBOOL)beh->GetAppData(); if (infunction) return; beh->SetAppData((void*)TRUE); // we get the input parameters CKCamera* camera = (CKCamera*)beh->GetTarget(); // Inputs VxRect rect; beh->GetInputParameterValue(0,&rect); CKDWORD rop = 0; beh->GetInputParameterValue(1,&rop); CKRenderContext *rcontext = ctx->GetPlayerRenderContext(); // Save Options CKCamera* oldcam = rcontext->GetAttachedCamera(); VxRect oldrect; rcontext->GetViewRect(oldrect); VxMatrix oldViewMat = rcontext->GetViewTransformationMatrix(); // Prepare Rendering rcontext->AttachViewpointToCamera(camera); rcontext->SetViewRect(rect); rop &= ~CK_RENDER_DOBACKTOFRONT; rop |= CK_RENDER_CLEARVIEWPORT|CK_RENDER_DONOTUPDATEEXTENTS; /// // Rendering rcontext->Render((CK_RENDER_FLAGS)rop); // Bool for prevent from recursivity beh->SetAppData(FALSE); // Restore Options rcontext->AttachViewpointToCamera(oldcam); rcontext->ForceCameraSettingsUpdate(); rcontext->SetViewRect(oldrect); CKDWORD version = beh->GetVersion(); if (version >= 0x00020000) rcontext->SetViewTransformationMatrix(oldViewMat); }