Files
Hoops_Exchange/exchange/exchangesource/CreatePRCCubes/modules/CreateViews.cpp
2025-12-15 23:22:33 +08:00

276 lines
12 KiB
C++

/***********************************************************************************************************************
*
* Copyright (c) 2010 - 2025 by Tech Soft 3D, Inc.
* The information contained herein is confidential and proprietary to Tech Soft 3D, Inc., and considered a trade secret
* as defined under civil and criminal statutes. Tech Soft 3D shall pursue its civil and criminal remedies in the event
* of unauthorized use or misappropriation of its trade secrets. Use of this information by anyone other than authorized
* employees of Tech Soft 3D, Inc. is granted only under a written non-disclosure agreement, expressly prescribing the
* scope and manner of such use.
*
***********************************************************************************************************************/
/**
* Sample CreatePRCCubes
* file CreateViews.cpp
* This file is containing the function allowing to create views.
*
* The function createView contains a lot of optionnal elements that function as so:
*
* If pCameraPos and pCameraLookAt are defined: function stiA3DGraphSceneDisplayParametersDataAddCamera
* is used to create a camera placement.
*
* If inGraphicsData is defined: linked item will be created in order to, at view activation,
* apply the graphic behavior on the POs defined by ppLinkedPOs.
*
* If ppAnnotations are defined: the designated annotation will not be hidden at view activation.
*
*
***********************************************************************************************************************/
#include "CreateViews.h"
#include <vector>
//######################################################################################################################
// Camera creation
static int stiA3DGraphSceneDisplayParametersDataAddCamera(A3DGraphSceneDisplayParametersData& sGraphSceneDisplayParametersData,
A3DVector3dData& sCameraPos,
A3DVector3dData& sCameraLookAt,
A3DDouble dXFovy, A3DDouble dYFovy)
{
A3DGraphCameraData sData;
A3DGraphCamera* pCamera = NULL;
A3D_INITIALIZE_DATA(A3DGraphCameraData, sData);
sData.m_bOrthographic = true;
sData.m_dAspectRatio = 1;
sData.m_dZNear = 0.;
sData.m_dZFar = 2. * INFINITE_COORD;
sData.m_dXFovy = (dXFovy == -1.) ? stCameraFovX : dXFovy;
sData.m_dYFovy = (dYFovy == -1.) ? stCameraFovY : dYFovy;
sData.m_sLookAt.m_dX = sCameraLookAt.m_dX;
sData.m_sLookAt.m_dY = sCameraLookAt.m_dY;
sData.m_sLookAt.m_dZ = sCameraLookAt.m_dZ;
sData.m_sLocation.m_dX = sCameraPos.m_dX;
sData.m_sLocation.m_dY = sCameraPos.m_dY;
sData.m_sLocation.m_dZ = sCameraPos.m_dZ;
sData.m_sUp.m_dX = 0.;
sData.m_sUp.m_dY = 1.;
sData.m_sUp.m_dZ = 0.;
if (A3DGraphCameraCreate(&sData, &pCamera) != A3D_SUCCESS)
return A3D_ERROR;
sGraphSceneDisplayParametersData.m_pCamera = pCamera;
return A3D_SUCCESS;
}
//######################################################################################################################
//######################################################################################################################
A3DStatus setViewCameraPlacement(A3DMkpViewData* pMkpViewData,
A3DVector3dData* pCameraPos,
A3DVector3dData* pCameraLookAt,
A3DDouble dXFovy, A3DDouble dYFovy)
{
A3DStatus iRet = A3D_SUCCESS;
if (pCameraPos && pCameraLookAt)
{
A3DGraphSceneDisplayParametersData sGraphSceneDisplayParametersData;
A3D_INITIALIZE_DATA(A3DGraphSceneDisplayParametersData, sGraphSceneDisplayParametersData);
sGraphSceneDisplayParametersData.m_uiBackgroundStyleIndex = A3D_DEFAULT_STYLE_INDEX;
stiA3DGraphSceneDisplayParametersDataAddCamera(sGraphSceneDisplayParametersData, *pCameraPos, *pCameraLookAt, dXFovy, dYFovy);
CHECK_RET(A3DGraphSceneDisplayParametersCreate(&sGraphSceneDisplayParametersData, &pMkpViewData->m_pSceneDisplayParameters));
}
return iRet;
}
//######################################################################################################################
A3DStatus addViewLinkedItem(A3DMkpViewData* pMkpViewData,
A3DUns32 uiLinkedItemsSize,
A3DMiscMarkupLinkedItem** ppLinkedItems)
{
A3DStatus iRet = A3D_SUCCESS;
std::vector<A3DMiscMarkupLinkedItem*> vpMarkupLinkedItems;
// copy previous linked item of view.
for (A3DUns32 i = 0; i < pMkpViewData->m_uiLinkedItemsSize; ++i)
{
vpMarkupLinkedItems.push_back(pMkpViewData->m_ppLinkedItems);
}
// add the new ones
for (A3DUns32 i = 0; i < uiLinkedItemsSize; ++i)
{
vpMarkupLinkedItems.push_back(ppLinkedItems[i]);
}
// replace the data
pMkpViewData->m_uiLinkedItemsSize = (A3DUns32)vpMarkupLinkedItems.size();
pMkpViewData->m_ppLinkedItems = (A3DMiscMarkupLinkedItem**) malloc(pMkpViewData->m_uiLinkedItemsSize * A3DUns32(sizeof(A3DMiscMarkupLinkedItem*)));
for (A3DUns32 i = 0; i < pMkpViewData->m_uiLinkedItemsSize; ++i)
{
pMkpViewData->m_ppLinkedItems[i] = vpMarkupLinkedItems[i];
}
return iRet;
}
//######################################################################################################################
A3DStatus setIsDefaultView(A3DMkpViewData* pMkpViewData,
A3DBool bIsDefaultView)
{
A3DStatus iRet = A3D_SUCCESS;
pMkpViewData->m_bIsDefaultView = bIsDefaultView;
return iRet;
}
//######################################################################################################################
A3DStatus setViewEntitiesOffsetPosition(A3DMkpViewData* pMkpViewData,
A3DUns32 uiLinkedPOsSize,
A3DAsmProductOccurrence** ppLinkedPOs,
A3DMiscCartesianTransformation** ppOffsetTransformation)
{
A3DStatus iRet = A3D_SUCCESS;
std::vector<A3DMiscMarkupLinkedItem*> vpMarkupLinkedItems;
// create new Linked items pointing to entity with new coordinates systems
for (A3DUns32 i = 0; i < uiLinkedPOsSize; ++i)
{
// create a linked item pointing to the entity
A3DMiscMarkupLinkedItem* pLinkedItem = 0;
CHECK_RET(createMarkupLinkedItemOnProduct(ppLinkedPOs[i], NULL, &pLinkedItem));
// create the new coordinate system
// add the offset to every PO current position
A3DAsmProductOccurrenceData sPOData;
A3D_INITIALIZE_DATA(A3DAsmProductOccurrenceData, sPOData);
CHECK_RET(A3DAsmProductOccurrenceGet(ppLinkedPOs[i], &sPOData));
A3DMiscCartesianTransformationData sPOTransformationData;
A3D_INITIALIZE_DATA(A3DMiscCartesianTransformationData, sPOTransformationData);
CHECK_RET(A3DMiscCartesianTransformationGet(sPOData.m_pLocation, &sPOTransformationData));
A3DMiscCartesianTransformation* pOffsetTransformation = 0;
A3DMiscCartesianTransformationData sOffsetTransformationData;
A3D_INITIALIZE_DATA(A3DMiscCartesianTransformationData, sOffsetTransformationData);
CHECK_RET(A3DMiscCartesianTransformationGet(ppOffsetTransformation[i], &sOffsetTransformationData));
sOffsetTransformationData.m_sOrigin.m_dX += sPOTransformationData.m_sOrigin.m_dX;
sOffsetTransformationData.m_sOrigin.m_dY += sPOTransformationData.m_sOrigin.m_dY;
sOffsetTransformationData.m_sOrigin.m_dZ += sPOTransformationData.m_sOrigin.m_dZ;
CHECK_RET(A3DMiscCartesianTransformationCreate(&sOffsetTransformationData, &pOffsetTransformation));
//create a CoordSystem
A3DRiCoordinateSystem* pCoordinateSystem = 0;
A3DRiCoordinateSystemData sCoordinateSystemData;
A3D_INITIALIZE_DATA(A3DRiCoordinateSystemData, sCoordinateSystemData);
sCoordinateSystemData.m_pTransformation = pOffsetTransformation;
CHECK_RET(A3DRiCoordinateSystemCreate(&sCoordinateSystemData, &pCoordinateSystem));
//Create a A3DMiscEntityReference with the coordinates
A3DMiscEntityReferenceData sMiscEntityRefData;
A3D_INITIALIZE_DATA(A3DMiscEntityReferenceData, sMiscEntityRefData);
sMiscEntityRefData.m_pEntity = ppLinkedPOs[i];
sMiscEntityRefData.m_pCoordinateSystem = pCoordinateSystem;
//Attach A3DMiscEntityReference to the MkpLinkedItem previously created, pointing to entity
CHECK_RET(A3DMiscEntityReferenceSet(pLinkedItem, &sMiscEntityRefData));
vpMarkupLinkedItems.push_back(pLinkedItem);
}
CHECK_RET(addViewLinkedItem(pMkpViewData, (A3DUns32)vpMarkupLinkedItems.size(), &vpMarkupLinkedItems[0]));
return iRet;
}
//######################################################################################################################
A3DStatus setViewEntitiesGraphics(A3DMkpViewData* pMkpViewData,
A3DUns32 uiLinkedPOsSize,
A3DAsmProductOccurrence** ppLinkedPOs,
A3DRootBaseWithGraphicsData* inGraphicsData)
{
A3DStatus iRet = A3D_SUCCESS;
std::vector<A3DMiscMarkupLinkedItem*> vpMarkupLinkedItems;
// create new Linked items pointing to entity with graphics
for (A3DUns32 i = 0; i < uiLinkedPOsSize; ++i)
{
// create a linked item pointing to the entity
A3DMiscMarkupLinkedItem* pLinkedItem = 0;
CHECK_RET(createMarkupLinkedItemOnProduct(ppLinkedPOs[i], NULL, &pLinkedItem));
// add the graphic to the linked item
CHECK_RET(A3DRootBaseWithGraphicsSet(pLinkedItem, inGraphicsData));
vpMarkupLinkedItems.push_back(pLinkedItem);
}
CHECK_RET(addViewLinkedItem(pMkpViewData, (A3DUns32)vpMarkupLinkedItems.size(), &vpMarkupLinkedItems[0]));
return iRet;
}
//######################################################################################################################
// The following function is only to be used when the annotations are owned by the same PO as the view will be.
A3DStatus setViewAnnotations(A3DMkpViewData* pMkpViewData,
A3DUns32 uiAnnotationsSize,
A3DMkpAnnotationEntity ** ppAnnotations)
{
A3DStatus iRet = A3D_SUCCESS;
pMkpViewData->m_uiAnnotationsSize = uiAnnotationsSize;
pMkpViewData->m_ppAnnotations = ppAnnotations;
return iRet;
}
// The following function is to be used when the annotations are owned by the PO that is a child of the PO that own the view.
A3DStatus setViewAnnotations(A3DMkpViewData* pMkpViewData,
A3DUns32 uiAnnotationsSize,
A3DMkpAnnotationEntity ** ppAnnotations,
A3DAsmProductOccurrence** ppPOOwners)
{
A3DStatus iRet = A3D_SUCCESS;
std::vector<A3DMiscMarkupLinkedItem*> vpMarkupLinkedItems;
// create new Linked items pointing to annotation
for (A3DUns32 i = 0; i < uiAnnotationsSize; ++i)
{
// create a linked item pointing to the annotation
// note that the PO owner of the annotation should be set.
A3DMiscMarkupLinkedItem* pLinkedItem = 0;
CHECK_RET(createMarkupLinkedItemOnEntity(ppAnnotations[i], ppPOOwners[i], &pLinkedItem));
vpMarkupLinkedItems.push_back(pLinkedItem);
}
CHECK_RET(addViewLinkedItem(pMkpViewData, (A3DUns32)vpMarkupLinkedItems.size(), &vpMarkupLinkedItems[0]));
return iRet;
}
//######################################################################################################################
A3DStatus createView(A3DMkpView** ppOutMkupView,
A3DMkpViewData* pMkpViewData,
const A3DUTF8Char* inName)
{
A3DStatus iRet = A3D_SUCCESS;
CHECK_RET(A3DMkpViewCreate(pMkpViewData, ppOutMkupView));
setEntityName(*ppOutMkupView, inName);
return iRet;
}