summaryrefslogtreecommitdiff
path: root/goodies/source/base3d/b3dcommn.hxx
blob: c3d3f97e9ae84c322fef5a91d52ea014d3022c5c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/*************************************************************************
 *
 *  OpenOffice.org - a multi-platform office productivity suite
 *
 *  $RCSfile: b3dcommn.hxx,v $
 *
 *  $Revision: 1.3 $
 *
 *  last change: $Author: rt $ $Date: 2005-09-09 02:24:44 $
 *
 *  The Contents of this file are made available subject to
 *  the terms of GNU Lesser General Public License Version 2.1.
 *
 *
 *    GNU Lesser General Public License Version 2.1
 *    =============================================
 *    Copyright 2005 by Sun Microsystems, Inc.
 *    901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *    This library is free software; you can redistribute it and/or
 *    modify it under the terms of the GNU Lesser General Public
 *    License version 2.1, as published by the Free Software Foundation.
 *
 *    This library is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *    Lesser General Public License for more details.
 *
 *    You should have received a copy of the GNU Lesser General Public
 *    License along with this library; if not, write to the Free Software
 *    Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *    MA  02111-1307  USA
 *
 ************************************************************************/

#ifndef _B3D_B3DCOMMN_HXX
#define _B3D_B3DCOMMN_HXX

#ifndef _B3D_BASE3D_HXX
#include "base3d.hxx"
#endif

#ifndef _B3D_B3DGEOM_HXX
#include "b3dgeom.hxx"
#endif

// Defines fuer clipping flags (nFlag0,1)
#define CLIPFLAG_LEFT           0x0001
#define CLIPFLAG_RIGHT          0x0002
#define CLIPFLAG_BOTTOM         0x0004
#define CLIPFLAG_TOP            0x0008
#define CLIPFLAG_FRONT          0x0010
#define CLIPFLAG_BACK           0x0020
#define CLIPFLAG_ALL            (CLIPFLAG_LEFT|CLIPFLAG_RIGHT| \
                                CLIPFLAG_BOTTOM|CLIPFLAG_TOP| \
                                CLIPFLAG_FRONT|CLIPFLAG_BACK)

/*************************************************************************
|*
|* Bucket fuer Indices
|*
\************************************************************************/

BASE3D_DECL_BUCKET(UINT32, Bucket)

/*************************************************************************
|*
|* Die Basisklasse fuer Standard 3D Ausgaben auf StarView Basis
|*
\************************************************************************/

#define BUFFER_OVERHEAD             (20)

class Base3DCommon : public Base3D
{
protected:
    // Buffers fuer temporaere geometrische Daten
    B3dEntityBucket         aBuffers;

    // Remember if last primitive was rejected
    BOOL                    bLastPrimitiveRejected  : 1;

    // #93184# flag for polygon normal direction
    BOOL                    bNormalPointsAway       : 1;

public:
    Base3DCommon(OutputDevice* pOutDev);
    virtual ~Base3DCommon();

    // Beleuchtung setzen/lesen
    virtual void SetLightGroup(B3dLightGroup* pSet, BOOL bSetGlobal=TRUE);

    // Info if last primitive was rejected
    BOOL WasLastPrimitiveRejected()
        { return bLastPrimitiveRejected; }

    // Szenenverwaltung
    virtual void StartScene();
    virtual void EndScene();

protected:
    // Geometrische Daten uebergeben
    virtual B3dEntity& ImplGetFreeEntity();

    virtual void ImplStartPrimitive();
    virtual void ImplEndPrimitive();
    virtual void ImplPostAddVertex(B3dEntity& rEnt);

    void Create3DPoint(UINT32 nInd);
    void Create3DPointClipped(UINT32 nInd);
    void Create3DLine(UINT32 nInd1, UINT32 nInd2);
    void Create3DLineClipped(UINT32 nInd1, UINT32 nInd2);
    void Create3DTriangle(UINT32 nInd1, UINT32 nInd2, UINT32 nInd3);

    virtual void Clipped3DPoint(UINT32 nInd) = 0;
    virtual void Clipped3DLine(UINT32 nInd1,UINT32 nInd2) = 0;
    virtual void Clipped3DTriangle(UINT32 nInd1,UINT32 nInd2, UINT32 nInd3) = 0;

    // clipping functions
    BOOL AreEqual(UINT32 nInd1, UINT32 nInd2);
    BOOL Clip3DPoint(UINT32 nInd);
    BOOL Clip3DLine(UINT32& nInd1,UINT32& nInd2);
    BOOL Clip3DPolygon(UINT32Bucket& rEdgeIndex);
    UINT16 GetClipFlags(UINT32 nInd);
    BOOL IsInside(UINT32 nInd, UINT32 nDim, BOOL bLow);
    void ClipPoly(UINT32Bucket& rEdgeIndex, UINT16 nDim,BOOL bLow);
    void CalcNewPoint(UINT32 nNew,UINT32 nHigh,UINT32 nLow,
        UINT16 nDim, double fBound);

    // Beleuchtungsmodell (ColorModel) in einem Punkt loesen
    // Punkt MUSS in ClipCoordinates vorliegen !
    void SolveColorModel(B3dColor&, Vector3D&, const Vector3D&);
    B3dColor SolveColorModel(B3dMaterial& rMat, Vector3D& rVec,
        const Vector3D& rPnt);

    // Beleuchtungsmodell (ColorModel) fuer eine Lichtquelle loesen
    B3dColor SolveColorModel(B3dLight& rLight, B3dMaterial& rMat,
        Vector3D& rVec, const Vector3D& rPnt);
};


#endif          // _B3D_B3DCOMMN_HXX