dataTransform.cc revision f220fa62
1/*
2** License Applicability. Except to the extent portions of this file are
3** made subject to an alternative license as permitted in the SGI Free
4** Software License B, Version 1.1 (the "License"), the contents of this
5** file are subject only to the provisions of the License. You may not use
6** this file except in compliance with the License. You may obtain a copy
7** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600
8** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:
9**
10** http://oss.sgi.com/projects/FreeB
11**
12** Note that, as provided in the License, the Software is distributed on an
13** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS
14** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND
15** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A
16** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
17**
18** Original Code. The Original Code is: OpenGL Sample Implementation,
19** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,
20** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.
21** Copyright in any portions created by third parties is as indicated
22** elsewhere herein. All Rights Reserved.
23**
24** Additional Notice Provisions: The application programming interfaces
25** established by SGI in conjunction with the Original Code are The
26** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released
27** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version
28** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X
29** Window System(R) (Version 1.3), released October 19, 1998. This software
30** was created using the OpenGL(R) version 1.2.1 Sample Implementation
31** published by SGI, but has not been independently verified as being
32** compliant with the OpenGL(R) version 1.2.1 Specification.
33**
34*/
35/*
36*/
37
38#include <stdlib.h>
39#include <stdio.h>
40#include "glimports.h"
41#include "myassert.h"
42#include "nurbsconsts.h"
43#include "trimvertex.h"
44#include "dataTransform.h"
45
46extern directedLine* arcLoopToDLineLoop(Arc_ptr loop);
47
48#if 0 // UNUSED
49static directedLine* copy_loop(Arc_ptr loop, Real2* vertArray, int& index, directedLine dline_buf[], sampledLine sline_buf[], int& index_dline)
50{
51  directedLine *ret;
52  int old_index = index;
53  int i = index;
54  int j;
55  for(j=0; j<loop->pwlArc->npts-1; j++, i++)
56    {
57      vertArray[i][0] = loop->pwlArc->pts[j].param[0];
58      vertArray[i][1] = loop->pwlArc->pts[j].param[1];
59    }
60  loop->clearmark();
61
62  for(Arc_ptr jarc = loop->next; jarc != loop; jarc=jarc->next)
63    {
64      for(j=0; j<jarc->pwlArc->npts-1; j++, i++)
65	{
66	  vertArray[i][0] = jarc->pwlArc->pts[j].param[0];
67	  vertArray[i][1] = jarc->pwlArc->pts[j].param[1];
68	}
69      jarc->clearmark();
70    }
71  //copy the first vertex again
72  vertArray[i][0] = loop->pwlArc->pts[0].param[0];
73  vertArray[i][1] = loop->pwlArc->pts[0].param[1];
74  i++;
75  index=i;
76
77  directedLine* dline;
78  sampledLine* sline;
79  sline = &sline_buf[index_dline];
80  dline = &dline_buf[index_dline];
81  sline->init(2, &vertArray[old_index]);
82  dline->init(INCREASING, sline);
83  ret = dline;
84  index_dline++;
85
86  for(i=old_index+1; i<= index-2; i++)
87    {
88      sline = &sline_buf[index_dline];
89      dline = &dline_buf[index_dline];
90      sline->init(2, &vertArray[i]);
91      dline->init(INCREASING, sline);
92      ret->insert(dline);
93      index_dline++;
94    }
95  return ret;
96}
97#endif
98
99#if 0 // UNUSED
100static int num_edges(Bin& bin)
101{
102  int sum=0;
103  for(Arc_ptr jarc = bin.firstarc(); jarc; jarc=bin.nextarc())
104    sum += jarc->pwlArc->npts-1;
105  return sum;
106}
107#endif
108
109/*
110directedLine* bin_to_DLineLoops(Bin& bin)
111{
112  directedLine *ret=NULL;
113  directedLine *temp;
114
115  int numedges = num_edges(bin);
116  directedLine* dline_buf = new directedLine[numedges]; //not work for N32?
117  sampledLine* sline_buf=new sampledLine[numedges];
118
119  Real2* vertArray = new Real2[numedges*2];
120  int index = 0;
121  int index_dline = 0;
122  bin.markall();
123
124  for(Arc_ptr jarc = bin.firstarc(); jarc; jarc=bin.nextarc())
125    {
126      if(jarc->ismarked())
127	{
128	  assert(jarc->check() != 0);
129	  Arc_ptr jarchead = jarc;
130	  do {
131	    jarc->clearmark();
132	    jarc = jarc->next;
133	  } while(jarc != jarchead);
134	  temp=copy_loop(jarchead, vertArray, index, dline_buf, sline_buf, index_dline);
135	  ret = temp->insertPolygon(ret);
136	}
137    }
138
139  return ret;
140}
141*/
142
143
144directedLine* bin_to_DLineLoops(Bin& bin)
145{
146  directedLine *ret=NULL;
147  directedLine *temp;
148  bin.markall();
149  for(Arc_ptr jarc=bin.firstarc(); jarc; jarc=bin.nextarc()){
150    if(jarc->ismarked()) {
151      assert(jarc->check() != 0);
152      Arc_ptr jarchead = jarc;
153      do {
154	jarc->clearmark();
155	jarc = jarc->next;
156      } while(jarc != jarchead);
157      temp =  arcLoopToDLineLoop(jarc);
158      ret = temp->insertPolygon(ret);
159    }
160  }
161  return ret;
162}
163
164directedLine* o_pwlcurve_to_DLines(directedLine* original, O_pwlcurve* pwl)
165{
166  directedLine* ret = original;
167  for(Int i=0; i<pwl->npts-1; i++)
168    {
169      sampledLine* sline = new sampledLine(2);
170      sline->setPoint(0, pwl->pts[i].param);
171      sline->setPoint(1, pwl->pts[i+1].param);
172      directedLine* dline = new directedLine(INCREASING, sline);
173      if(ret == NULL)
174	ret = dline;
175      else
176	ret->insert(dline);
177    }
178  return ret;
179}
180
181directedLine* o_curve_to_DLineLoop(O_curve* cur)
182{
183  directedLine *ret;
184  if(cur == NULL)
185    return NULL;
186  assert(cur->curvetype == ct_pwlcurve);
187  ret = o_pwlcurve_to_DLines(NULL, cur->curve.o_pwlcurve);
188  for(O_curve* temp = cur->next; temp != NULL; temp = temp->next)
189    {
190      assert(temp->curvetype == ct_pwlcurve);
191      ret = o_pwlcurve_to_DLines(ret, temp->curve.o_pwlcurve);
192    }
193  return ret;
194}
195
196directedLine* o_trim_to_DLineLoops(O_trim* trim)
197{
198  O_trim* temp;
199  directedLine *ret;
200  if(trim == NULL)
201    return NULL;
202  ret = o_curve_to_DLineLoop(trim->o_curve);
203
204  for(temp=trim->next; temp != NULL; temp = temp->next)
205    {
206      ret = ret->insertPolygon(o_curve_to_DLineLoop(temp->o_curve));
207    }
208  return ret;
209}
210