1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-26 10:19:45 +03:00
occt/src/Aspect/Aspect_MarkerStyle.cxx
kgv a577aaabf9 0024131: TKOpenGL redesign GPU memory management for markers presentation
Introduce Point Sprites usage.
Graphic3d_Group - drop Marker(),MarkerSet() methods - markers should be drawn using AddPrimitiveArray.
Added new Draw Harness commands vcaps, vmarkerstest.
2013-09-05 13:23:03 +04:00

557 lines
16 KiB
C++
Executable File

// Created on: 1995-01-14
// Created by: GG
// Copyright (c) 1995-1999 Matra Datavision
// Copyright (c) 1999-2012 OPEN CASCADE SAS
//
// The content of this file is subject to the Open CASCADE Technology Public
// License Version 6.5 (the "License"). You may not use the content of this file
// except in compliance with the License. Please obtain a copy of the License
// at http://www.opencascade.org and read it completely before using this file.
//
// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
//
// The Original Code and all software distributed under the License is
// distributed on an "AS IS" basis, without warranty of any kind, and the
// Initial Developer hereby disclaims all such warranties, including without
// limitation, any warranties of merchantability, fitness for a particular
// purpose or non-infringement. Please see the License for the specific terms
// and conditions governing the rights and limitations under the License.
// Modified 23/02/98 : FMN ; Remplacement PI par Standard_PI
// JR 02.01.100 : Implicit conversions
//-Version
//-Design Declaration des variables specifiques aux Type de markers
//-Warning Un style est definie, soit par son type predefini TOM_...
// soit par sa description dans l'espace -1,+1
//-References
//-Language C++ 2.0
//-Declarations
// for the class
#include <Aspect_MarkerStyle.ixx>
//-Aliases
//-Global data definitions
// MyMarkerType : TypeOfMarker from Aspect;
// MyXpoint : Array1OfShortReal from TShort;
// MyYpoint : Array1OfShortReal from TShort;
// MySpoint : Array1OfBoolean from TColStd;
//-Constructors
//-Destructors
//-Methods, in order
Aspect_MarkerStyle::Aspect_MarkerStyle () : MyMarkerType(Aspect_TOM_POINT) {
SetPredefinedStyle();
}
Aspect_MarkerStyle::Aspect_MarkerStyle (
const Aspect_TypeOfMarker aType) : MyMarkerType(aType) {
SetPredefinedStyle();
}
Aspect_MarkerStyle::Aspect_MarkerStyle (const TColStd_Array1OfReal& aXpoint,
const TColStd_Array1OfReal& aYpoint)
: MyMarkerType(Aspect_TOM_USERDEFINED) {
Standard_Integer i,j=1;
MyXpoint = new TShort_HArray1OfShortReal(1,aXpoint.Length());
MyYpoint = new TShort_HArray1OfShortReal(1,aXpoint.Length());
MySpoint = new TColStd_HArray1OfBoolean(1,aXpoint.Length());
if( aXpoint.Length() != aYpoint.Length() ) {
Aspect_MarkerStyleDefinitionError::Raise ("Bad Descriptor length") ;
}
for( i=aXpoint.Lower() ; i<=aXpoint.Upper() ; i++,j++ ) {
Standard_ShortReal X = (Standard_ShortReal ) aXpoint(i);
Standard_ShortReal Y = (Standard_ShortReal ) aYpoint(i);
if( X < -1. || X > 1. || Y < -1. || Y > 1. ) {
Aspect_MarkerStyleDefinitionError::Raise ("Bad Descriptor value") ;
}
MyXpoint->SetValue(j,X);
MyYpoint->SetValue(j,Y);
MySpoint->SetValue(j,(j > 1) ? Standard_True : Standard_False);
}
}
Aspect_MarkerStyle::Aspect_MarkerStyle (const TColStd_Array1OfReal& aXpoint,
const TColStd_Array1OfReal& aYpoint,
const TColStd_Array1OfBoolean& aSpoint)
: MyMarkerType(Aspect_TOM_USERDEFINED) {
Standard_Integer i,j=1;
MyXpoint = new TShort_HArray1OfShortReal(1,aXpoint.Length());
MyYpoint = new TShort_HArray1OfShortReal(1,aXpoint.Length());
MySpoint = new TColStd_HArray1OfBoolean(1,aXpoint.Length());
if( (aXpoint.Length() != aYpoint.Length()) ||
(aXpoint.Length() != aSpoint.Length()) ) {
Aspect_MarkerStyleDefinitionError::Raise ("Bad Descriptor length") ;
}
for( i=aXpoint.Lower() ; i<=aXpoint.Upper() ; i++,j++ ) {
Standard_ShortReal X = (Standard_ShortReal ) aXpoint(i);
Standard_ShortReal Y = (Standard_ShortReal ) aYpoint(i);
Standard_Boolean S = aSpoint(i);
if( X < -1. || X > 1. || Y < -1. || Y > 1. ) {
Aspect_MarkerStyleDefinitionError::Raise ("Bad Descriptor value") ;
}
MyXpoint->SetValue(j,X);
MyYpoint->SetValue(j,Y);
MySpoint->SetValue(j,S);
MySpoint->SetValue(j,(j > 1) ? S : Standard_False);
}
}
Aspect_MarkerStyle& Aspect_MarkerStyle::Assign (const Aspect_MarkerStyle& Other) {
MyMarkerType = Other.MyMarkerType ;
MyXpoint = Other.MyXpoint ;
MyYpoint = Other.MyYpoint ;
MySpoint = Other.MySpoint ;
return (*this);
}
Aspect_TypeOfMarker Aspect_MarkerStyle::Type () const {
return MyMarkerType;
}
Standard_Integer Aspect_MarkerStyle::Length () const {
return MyXpoint->Length();
}
Standard_Boolean Aspect_MarkerStyle::Values (const Standard_Integer aRank,
Standard_Real &X,Standard_Real &Y) const {
if( aRank < 1 || aRank > Length() ) {
Aspect_MarkerStyleDefinitionError::Raise ("Bad Descriptor rank") ;
}
X = MyXpoint->Value(aRank);
Y = MyYpoint->Value(aRank);
return MySpoint->Value(aRank);
}
const TShort_Array1OfShortReal& Aspect_MarkerStyle::XValues () const {
return MyXpoint->Array1();
}
const TShort_Array1OfShortReal& Aspect_MarkerStyle::YValues () const {
return MyYpoint->Array1();
}
const TColStd_Array1OfBoolean& Aspect_MarkerStyle::SValues () const {
return MySpoint->Array1();
}
#define MAX_O_POINT 12
#define MAX_BALL_LINE 12
#ifndef AIX
#define FALSE Standard_False
#define TRUE Standard_True
#endif
void Aspect_MarkerStyle::SetPredefinedStyle() {
switch ( MyMarkerType ) {
case Aspect_TOM_USERDEFINED :
Aspect_MarkerStyleDefinitionError::Raise
("Bad Marker Type Style");
break;
case Aspect_TOM_POINT :
MyXpoint = new TShort_HArray1OfShortReal(1,5) ;
MyYpoint = new TShort_HArray1OfShortReal(1,5) ;
MySpoint = new TColStd_HArray1OfBoolean(1,5) ;
MyXpoint->SetValue(1,-1.);
MyYpoint->SetValue(1,-1.);
MySpoint->SetValue(1,FALSE);
MyXpoint->SetValue(2,-1.);
MyYpoint->SetValue(2,1.);
MySpoint->SetValue(2,TRUE);
MyXpoint->SetValue(3,1.);
MyYpoint->SetValue(3,1.);
MySpoint->SetValue(3,TRUE);
MyXpoint->SetValue(4,1.);
MyYpoint->SetValue(4,-1.);
MySpoint->SetValue(4,TRUE);
MyXpoint->SetValue(5,-1.);
MyYpoint->SetValue(5,-1.);
MySpoint->SetValue(5,TRUE);
break ;
case Aspect_TOM_PLUS :
MyXpoint = new TShort_HArray1OfShortReal(1,4) ;
MyYpoint = new TShort_HArray1OfShortReal(1,4) ;
MySpoint = new TColStd_HArray1OfBoolean(1,4) ;
MyXpoint->SetValue(1, 0.);
MyYpoint->SetValue(1,-1.);
MySpoint->SetValue(1,FALSE);
MyXpoint->SetValue(2, 0.);
MyYpoint->SetValue(2, 1.);
MySpoint->SetValue(2,TRUE);
MyXpoint->SetValue(3,-1.);
MyYpoint->SetValue(3, 0.);
MySpoint->SetValue(3,FALSE);
MyXpoint->SetValue(4, 1.);
MyYpoint->SetValue(4, 0.);
MySpoint->SetValue(4,TRUE);
break ;
case Aspect_TOM_STAR :
MyXpoint = new TShort_HArray1OfShortReal(1,8) ;
MyYpoint = new TShort_HArray1OfShortReal(1,8) ;
MySpoint = new TColStd_HArray1OfBoolean(1,8) ;
MyXpoint->SetValue(1, 0.);
MyYpoint->SetValue(1,-1.);
MySpoint->SetValue(1,FALSE);
MyXpoint->SetValue(2, 0.);
MyYpoint->SetValue(2, 1.);
MySpoint->SetValue(2,TRUE);
MyXpoint->SetValue(3,-1.);
MyYpoint->SetValue(3, 0.);
MySpoint->SetValue(3,FALSE);
MyXpoint->SetValue(4, 1.);
MyYpoint->SetValue(4, 0.);
MySpoint->SetValue(4,TRUE);
MyXpoint->SetValue(5,(float ) -0.7);
MyYpoint->SetValue(5,(float ) -0.7);
MySpoint->SetValue(5,FALSE);
MyXpoint->SetValue(6,(float ) 0.7);
MyYpoint->SetValue(6,(float ) 0.7);
MySpoint->SetValue(6,TRUE);
MyXpoint->SetValue(7,(float ) 0.7);
MyYpoint->SetValue(7,(float ) -0.7);
MySpoint->SetValue(7,FALSE);
MyXpoint->SetValue(8,(float ) -0.7);
MyYpoint->SetValue(8,(float ) 0.7);
MySpoint->SetValue(8,TRUE);
break ;
case Aspect_TOM_O :
MyXpoint = new TShort_HArray1OfShortReal(1,MAX_O_POINT+1) ;
MyYpoint = new TShort_HArray1OfShortReal(1,MAX_O_POINT+1) ;
MySpoint = new TColStd_HArray1OfBoolean(1,MAX_O_POINT+1) ;
{ Standard_Integer i;
Standard_Real da = 2. * M_PI / MAX_O_POINT;
Standard_Real a = 0.;
for( i=1 ; i<= MAX_O_POINT+1 ; i++,a += da ) {
MyXpoint->SetValue(i,(float ) Cos(a));
MyYpoint->SetValue(i,(float ) Sin(a));
MySpoint->SetValue(i,(i > 1) ? TRUE : FALSE);
}
i = MAX_O_POINT+1;
MyXpoint->SetValue(i,1.);
MyYpoint->SetValue(i,0.);
}
break ;
case Aspect_TOM_X :
MyXpoint = new TShort_HArray1OfShortReal(1,4) ;
MyYpoint = new TShort_HArray1OfShortReal(1,4) ;
MySpoint = new TColStd_HArray1OfBoolean(1,4) ;
MyXpoint->SetValue(1,(float ) -0.7);
MyYpoint->SetValue(1,(float ) -0.7);
MySpoint->SetValue(1,FALSE);
MyXpoint->SetValue(2,(float ) 0.7);
MyYpoint->SetValue(2,(float ) 0.7);
MySpoint->SetValue(2,TRUE);
MyXpoint->SetValue(3,(float ) 0.7);
MyYpoint->SetValue(3,(float ) -0.7);
MySpoint->SetValue(3,FALSE);
MyXpoint->SetValue(4,(float ) -0.7);
MyYpoint->SetValue(4,(float ) 0.7);
MySpoint->SetValue(4,TRUE);
break ;
case Aspect_TOM_O_POINT :
MyXpoint = new TShort_HArray1OfShortReal(1,MAX_O_POINT+6) ;
MyYpoint = new TShort_HArray1OfShortReal(1,MAX_O_POINT+6) ;
MySpoint = new TColStd_HArray1OfBoolean(1,MAX_O_POINT+6) ;
{ Standard_Integer i;
Standard_Real da = 2. * M_PI / MAX_O_POINT;
Standard_Real a = 0.;
for( i=1 ; i<= MAX_O_POINT+1 ; i++,a += da ) {
MyXpoint->SetValue(i,(float ) Cos(a));
MyYpoint->SetValue(i,(float ) Sin(a));
MySpoint->SetValue(i,(i > 1) ? TRUE : FALSE);
}
i = MAX_O_POINT+1;
MyXpoint->SetValue(i,1.);
MyYpoint->SetValue(i,0.);
MyXpoint->SetValue(i+1,-0.25);
MyYpoint->SetValue(i+1,-0.25);
MySpoint->SetValue(i+1,FALSE);
MyXpoint->SetValue(i+2,-0.25);
MyYpoint->SetValue(i+2,0.25);
MySpoint->SetValue(i+2,TRUE);
MyXpoint->SetValue(i+3,0.25);
MyYpoint->SetValue(i+3,0.25);
MySpoint->SetValue(i+3,TRUE);
MyXpoint->SetValue(i+4,0.25);
MyYpoint->SetValue(i+4,-0.25);
MySpoint->SetValue(i+4,TRUE);
MyXpoint->SetValue(i+5,-0.25);
MyYpoint->SetValue(i+5,-0.25);
MySpoint->SetValue(i+5,TRUE);
}
break ;
case Aspect_TOM_O_PLUS :
MyXpoint = new TShort_HArray1OfShortReal(1,MAX_O_POINT+5) ;
MyYpoint = new TShort_HArray1OfShortReal(1,MAX_O_POINT+5) ;
MySpoint = new TColStd_HArray1OfBoolean(1,MAX_O_POINT+5) ;
{ Standard_Integer i;
Standard_Real da = 2. * M_PI / MAX_O_POINT;
Standard_Real a = 0.;
for( i=1 ; i<= MAX_O_POINT+1 ; i++,a += da ) {
MyXpoint->SetValue(i,(float ) Cos(a));
MyYpoint->SetValue(i,(float ) Sin(a));
MySpoint->SetValue(i,(i > 1) ? TRUE : FALSE);
}
i = MAX_O_POINT+1;
MyXpoint->SetValue(i,1.);
MyYpoint->SetValue(i,0.);
MyXpoint->SetValue(i+1,0.);
MyYpoint->SetValue(i+1,-0.5);
MySpoint->SetValue(i+1,FALSE);
MyXpoint->SetValue(i+2,0.);
MyYpoint->SetValue(i+2,0.5);
MySpoint->SetValue(i+2,TRUE);
MyXpoint->SetValue(i+3,-0.5);
MyYpoint->SetValue(i+3,0.);
MySpoint->SetValue(i+3,FALSE);
MyXpoint->SetValue(i+4,0.5);
MyYpoint->SetValue(i+4,0.);
MySpoint->SetValue(i+4,TRUE);
}
break ;
case Aspect_TOM_O_STAR :
MyXpoint = new TShort_HArray1OfShortReal(1,MAX_O_POINT+9) ;
MyYpoint = new TShort_HArray1OfShortReal(1,MAX_O_POINT+9) ;
MySpoint = new TColStd_HArray1OfBoolean(1,MAX_O_POINT+9) ;
{ Standard_Integer i;
Standard_Real da = 2. * M_PI / MAX_O_POINT;
Standard_Real a = 0.;
for( i=1 ; i<= MAX_O_POINT+1 ; i++,a += da ) {
MyXpoint->SetValue(i,(float ) Cos(a));
MyYpoint->SetValue(i,(float ) Sin(a));
MySpoint->SetValue(i,(i > 1) ? TRUE : FALSE);
}
i = MAX_O_POINT+1;
MyXpoint->SetValue(i,1.);
MyYpoint->SetValue(i,0.);
MyXpoint->SetValue(i+1, 0.);
MyYpoint->SetValue(i+1,-0.5);
MySpoint->SetValue(i+1,FALSE);
MyXpoint->SetValue(i+2, 0.);
MyYpoint->SetValue(i+2,0.5);
MySpoint->SetValue(i+2,TRUE);
MyXpoint->SetValue(i+3,-0.5);
MyYpoint->SetValue(i+3, 0.);
MySpoint->SetValue(i+3,FALSE);
MyXpoint->SetValue(i+4,0.5);
MyYpoint->SetValue(i+4, 0.);
MySpoint->SetValue(i+4,TRUE);
MyXpoint->SetValue(i+5,(float ) -0.35);
MyYpoint->SetValue(i+5,(float ) -0.35);
MySpoint->SetValue(i+5,FALSE);
MyXpoint->SetValue(i+6,(float ) 0.35);
MyYpoint->SetValue(i+6,(float ) 0.35);
MySpoint->SetValue(i+6,TRUE);
MyXpoint->SetValue(i+7,(float ) 0.35);
MyYpoint->SetValue(i+7,(float ) -0.35);
MySpoint->SetValue(i+7,FALSE);
MyXpoint->SetValue(i+8,(float ) -0.35);
MyYpoint->SetValue(i+8,(float ) 0.35);
MySpoint->SetValue(i+8,TRUE);
}
break ;
case Aspect_TOM_O_X :
MyXpoint = new TShort_HArray1OfShortReal(1,MAX_O_POINT+5) ;
MyYpoint = new TShort_HArray1OfShortReal(1,MAX_O_POINT+5) ;
MySpoint = new TColStd_HArray1OfBoolean(1,MAX_O_POINT+5) ;
{ Standard_Integer i;
Standard_Real da = 2. * M_PI / MAX_O_POINT;
Standard_Real a = 0.;
for( i=1 ; i<= MAX_O_POINT+1 ; i++,a += da ) {
MyXpoint->SetValue(i,(float ) Cos(a));
MyYpoint->SetValue(i,(float ) Sin(a));
MySpoint->SetValue(i,(i > 1) ? TRUE : FALSE);
}
i = MAX_O_POINT+1;
MyXpoint->SetValue(i,1.);
MyYpoint->SetValue(i,0.);
MyXpoint->SetValue(i+1,(float ) -0.35);
MyYpoint->SetValue(i+1,(float ) -0.35);
MySpoint->SetValue(i+1,FALSE);
MyXpoint->SetValue(i+2,(float ) 0.35);
MyYpoint->SetValue(i+2,(float ) 0.35);
MySpoint->SetValue(i+2,TRUE);
MyXpoint->SetValue(i+3,(float ) 0.35);
MyYpoint->SetValue(i+3,(float ) -0.35);
MySpoint->SetValue(i+3,FALSE);
MyXpoint->SetValue(i+4,(float ) -0.35);
MyYpoint->SetValue(i+4,(float ) 0.35);
MySpoint->SetValue(i+4,TRUE);
}
break ;
case Aspect_TOM_RING1 :
MyXpoint = new TShort_HArray1OfShortReal(1,
(MAX_BALL_LINE/4)*(MAX_O_POINT+1)) ;
MyYpoint = new TShort_HArray1OfShortReal(1,
(MAX_BALL_LINE/4)*(MAX_O_POINT+1)) ;
MySpoint = new TColStd_HArray1OfBoolean(1,
(MAX_BALL_LINE/4)*(MAX_O_POINT+1)) ;
{ Standard_Integer i,j,n = 0;
Standard_Real da = 2. * M_PI / MAX_O_POINT;
Standard_Real dr = 1./MAX_BALL_LINE;
Standard_Real a,r = 1.;
for( i=1 ; i<= MAX_BALL_LINE/4 ; i++ ) {
a = 0.;
for( j=1 ; j<= MAX_O_POINT+1 ; j++,a += da ) {
n++;
MyXpoint->SetValue(n,(float )( r*Cos(a)));
MyYpoint->SetValue(n,(float )( r*Sin(a)));
MySpoint->SetValue(n,(j > 1) ? TRUE : FALSE);
}
MyXpoint->SetValue(n,(float ) r);
MyYpoint->SetValue(n,0.);
r -= dr;
}
}
break ;
case Aspect_TOM_RING2 :
MyXpoint = new TShort_HArray1OfShortReal(1,
(MAX_BALL_LINE/3)*(MAX_O_POINT+1)) ;
MyYpoint = new TShort_HArray1OfShortReal(1,
(MAX_BALL_LINE/3)*(MAX_O_POINT+1)) ;
MySpoint = new TColStd_HArray1OfBoolean(1,
(MAX_BALL_LINE/3)*(MAX_O_POINT+1)) ;
{ Standard_Integer i,j,n = 0;
Standard_Real da = 2. * M_PI / MAX_O_POINT;
Standard_Real dr = 1./MAX_BALL_LINE;
Standard_Real a,r = 1.;
for( i=1 ; i<= MAX_BALL_LINE/3 ; i++ ) {
a = 0.;
for( j=1 ; j<= MAX_O_POINT+1 ; j++,a += da ) {
n++;
MyXpoint->SetValue(n,(float )( r*Cos(a)));
MyYpoint->SetValue(n,(float )( r*Sin(a)));
MySpoint->SetValue(n,(j > 1) ? TRUE : FALSE);
}
MyXpoint->SetValue(n,(float ) r);
MyYpoint->SetValue(n,0.);
r -= dr;
}
}
break ;
case Aspect_TOM_RING3 :
MyXpoint = new TShort_HArray1OfShortReal(1,
(MAX_BALL_LINE)/2*(MAX_O_POINT+1)) ;
MyYpoint = new TShort_HArray1OfShortReal(1,
(MAX_BALL_LINE)/2*(MAX_O_POINT+1)) ;
MySpoint = new TColStd_HArray1OfBoolean(1,
(MAX_BALL_LINE)/2*(MAX_O_POINT+1)) ;
{ Standard_Integer i,j,n = 0;
Standard_Real da = 2. * M_PI / MAX_O_POINT;
Standard_Real dr = 1./MAX_BALL_LINE;
Standard_Real a,r = 1.;
for( i=1 ; i<= MAX_BALL_LINE/2 ; i++ ) {
a = 0.;
for( j=1 ; j<= MAX_O_POINT+1 ; j++,a += da ) {
n++;
MyXpoint->SetValue(n,(float )( r*Cos(a)));
MyYpoint->SetValue(n,(float )( r*Sin(a)));
MySpoint->SetValue(n,(j > 1) ? TRUE : FALSE);
}
MyXpoint->SetValue(n,(float ) r);
MyYpoint->SetValue(n,0.);
r -= dr;
}
}
break ;
}
}
Standard_Boolean Aspect_MarkerStyle::IsEqual(const Aspect_MarkerStyle& Other) const
{
return (
(MyMarkerType == Other.MyMarkerType) &&
(MyXpoint == Other.MyXpoint) &&
(MyYpoint == Other.MyYpoint) &&
(MySpoint == Other.MySpoint));
}
Standard_Boolean Aspect_MarkerStyle::IsNotEqual(const Aspect_MarkerStyle& Other) const
{
return !IsEqual(Other);
}