Interface margins and axes bounds properties.
[scilab.git] / scilab / modules / renderer / src / cpp / subwinDrawing / Camera.cpp
1 /*------------------------------------------------------------------------*/
2 /* file: Camera.cpp                                                       */
3 /* Copyright INRIA 2007                                                   */
4 /* Authors : Jean-Baptiste Silvy                                          */
5 /* desc : File used to position viewpoint and rendering zone in the       */
6 /*        canvas.                                                         */
7 /*------------------------------------------------------------------------*/
8
9 #include "Camera.h"
10 #include "MALLOC.h"
11
12 namespace sciGraphics
13 {
14
15 /*-----------------------------------------------------------------------------------*/
16 Camera::Camera( void )
17 {
18   m_pImp = NULL;
19 }
20 /*-----------------------------------------------------------------------------------*/
21 Camera::~Camera( void )
22 {
23   if ( m_pImp != NULL )
24   {
25     delete m_pImp;
26   }
27   m_pImp = NULL;
28 }
29 /*-----------------------------------------------------------------------------------*/
30 void Camera::setViewingArea( double axesBounds[4], double margins[4] )
31 {
32   double translation[2] ;
33   // T = Taxes + SizeAxes * [marginLeft, marginTop}.
34   translation[0] = axesBounds[0] + axesBounds[2] * margins[0] ;
35   translation[1] = axesBounds[1] + axesBounds[3] * margins[2] ;
36
37   // S = Saxes - margin.Saxes
38   // where Saxes = [w,h] and margin = [margin_left+margin_right, margin_top+margin_bottom].
39   double scale[2] ;
40   scale[0] = (1.0 - margins[0] - margins[1]) * axesBounds[2] ;
41   scale[1] = (1.0 - margins[2] - margins[3]) * axesBounds[3] ;
42   m_pImp->setViewingArea(translation, scale);
43 }
44 /*-----------------------------------------------------------------------------------*/
45 void Camera::setRotationAngles( double alpha, double theta )
46 {
47   m_dAlpha = alpha ;
48   m_dTheta = theta ;
49 }
50 /*-----------------------------------------------------------------------------------*/
51 void Camera::setSubwinBox( double bounds[6] )
52 {
53   for ( int i = 0 ; i < 6 ; i++ )
54   {
55     m_aAxesBox[i] = bounds[i] ;
56   }
57   
58   double scale[3] ;
59   // 1.0 / ( Xmax - Xmin )
60   scale[0] = 1.0 / (bounds[1] - bounds[0]) ;
61   scale[1] = 1.0 / (bounds[3] - bounds[2]) ;
62   scale[2] = 1.0 / (bounds[5] - bounds[4]) ;
63   m_pImp->setAxesScale(scale) ;
64
65   double trans[3];
66   trans[0] = -bounds[0] ;
67   trans[1] = -bounds[2] ;
68   trans[2] = bounds[4] ;
69   m_pImp->setAxesTranslation(trans) ;
70 }
71 /*-----------------------------------------------------------------------------------*/
72 void Camera::setFarthestDistance( double maxDist )
73 {
74   m_pImp->setFarthestDistance(maxDist);
75 }
76 /*-----------------------------------------------------------------------------------*/
77 void Camera::renderPosition( void )
78 {
79   m_pImp->renderPosition();
80 }
81 /*-----------------------------------------------------------------------------------*/
82 void Camera::getSubwinCenter( double center[3] )
83 {
84   // middle of the box
85   center[0] = (m_aAxesBox[0] + m_aAxesBox[1]) / 2.0 ;
86   center[1] = (m_aAxesBox[2] + m_aAxesBox[3]) / 2.0 ;
87   center[2] = (m_aAxesBox[4] + m_aAxesBox[5]) / 2.0 ;
88 }
89 /*-----------------------------------------------------------------------------------*/
90
91
92 }