2006-03-20 17:12:09 +00:00
/*
2014-06-01 17:55:23 +00:00
* Portions of this file are copyright Rebirth contributors and licensed as
* described in COPYING . txt .
* Portions of this file are copyright Parallax Software and licensed
* according to the Parallax license below .
* See COPYING . txt for license details .
2006-03-20 17:12:09 +00:00
THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
SOFTWARE CORPORATION ( " PARALLAX " ) . PARALLAX , IN DISTRIBUTING THE CODE TO
END - USERS , AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN , GRANTS A
ROYALTY - FREE , PERPETUAL LICENSE TO SUCH END - USERS FOR USE BY SUCH END - USERS
IN USING , DISPLAYING , AND CREATING DERIVATIVE WORKS THEREOF , SO LONG AS
SUCH USE , DISPLAY OR CREATION IS FOR NON - COMMERCIAL , ROYALTY OR REVENUE
FREE PURPOSES . IN NO EVENT SHALL THE END - USER USE THE COMPUTER CODE
CONTAINED HEREIN FOR REVENUE - BEARING PURPOSES . THE END - USER UNDERSTANDS
AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE .
COPYRIGHT 1993 - 1998 PARALLAX SOFTWARE CORPORATION . ALL RIGHTS RESERVED .
*/
/*
*
* curve generation stuff
*
*/
# include <time.h>
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <ctype.h>
# include <stdarg.h>
# include "vecmat.h"
# include "gr.h"
# include "editor.h"
2013-03-16 03:10:55 +00:00
# include "editor/esegment.h"
2006-03-20 17:12:09 +00:00
# include "gameseg.h"
2008-04-06 20:23:28 +00:00
# include "console.h"
2006-03-20 17:12:09 +00:00
# define ONE_OVER_SQRT2 F1_0 * 0.707106781
# define CURVE_RIGHT 1
# define CURVE_UP 2
2014-11-30 22:09:23 +00:00
# include "compiler-range_for.h"
# include "partial_range.h"
2017-06-10 03:31:02 +00:00
static imsegptridx_t OriginalSeg = segment_none ;
static imsegptridx_t OriginalMarkedSeg = segment_none ;
2022-01-09 15:25:42 +00:00
static sidenum_t OriginalSide ;
static sidenum_t OriginalMarkedSide ;
2020-05-02 21:18:42 +00:00
static std : : array < segment * , MAX_SEGMENTS > CurveSegs ;
2014-11-30 22:09:23 +00:00
static unsigned CurveNumSegs ;
2006-03-20 17:12:09 +00:00
2013-09-22 22:26:27 +00:00
static void generate_banked_curve ( fix maxscale , vms_equation coeffs ) ;
2006-03-20 17:12:09 +00:00
2014-10-26 22:08:58 +00:00
static void create_curve ( vms_vector & p1 , vms_vector & p4 , vms_vector & r1 , vms_vector & r4 , vms_equation & coeffs )
{
2006-03-20 17:12:09 +00:00
// Q(t) = (2t^3 - 3t^2 + 1) p1 + (-2t^3 + 3t^2) p4 + (t~3 - 2t^2 + t) r1 + (t^3 - t^2 ) r4
2014-10-26 22:08:58 +00:00
coeffs . n . x3 = fixmul ( 2 * F1_0 , p1 . x ) - fixmul ( 2 * F1_0 , p4 . x ) + r1 . x + r4 . x ;
coeffs . n . x2 = fixmul ( - 3 * F1_0 , p1 . x ) + fixmul ( 3 * F1_0 , p4 . x ) - fixmul ( 2 * F1_0 , r1 . x ) - fixmul ( 1 * F1_0 , r4 . x ) ;
coeffs . n . x1 = r1 . x ;
coeffs . n . x0 = p1 . x ;
coeffs . n . y3 = fixmul ( 2 * F1_0 , p1 . y ) - fixmul ( 2 * F1_0 , p4 . y ) + r1 . y + r4 . y ;
coeffs . n . y2 = fixmul ( - 3 * F1_0 , p1 . y ) + fixmul ( 3 * F1_0 , p4 . y ) - fixmul ( 2 * F1_0 , r1 . y ) - fixmul ( 1 * F1_0 , r4 . y ) ;
coeffs . n . y1 = r1 . y ;
coeffs . n . y0 = p1 . y ;
coeffs . n . z3 = fixmul ( 2 * F1_0 , p1 . z ) - fixmul ( 2 * F1_0 , p4 . z ) + r1 . z + r4 . z ;
coeffs . n . z2 = fixmul ( - 3 * F1_0 , p1 . z ) + fixmul ( 3 * F1_0 , p4 . z ) - fixmul ( 2 * F1_0 , r1 . z ) - fixmul ( 1 * F1_0 , r4 . z ) ;
coeffs . n . z1 = r1 . z ;
coeffs . n . z0 = p1 . z ;
2006-03-20 17:12:09 +00:00
}
vms_vector evaluate_curve ( vms_equation * coeffs , int degree , fix t ) {
fix t2 , t3 ;
vms_vector coord ;
2017-12-05 05:29:55 +00:00
if ( degree ! = 3 )
con_puts ( CON_CRITICAL , " for Hermite Curves degree must be 3 " ) ;
2006-03-20 17:12:09 +00:00
t2 = fixmul ( t , t ) ; t3 = fixmul ( t2 , t ) ;
coord . x = fixmul ( coeffs - > n . x3 , t3 ) + fixmul ( coeffs - > n . x2 , t2 ) + fixmul ( coeffs - > n . x1 , t ) + coeffs - > n . x0 ;
coord . y = fixmul ( coeffs - > n . y3 , t3 ) + fixmul ( coeffs - > n . y2 , t2 ) + fixmul ( coeffs - > n . y1 , t ) + coeffs - > n . y0 ;
coord . z = fixmul ( coeffs - > n . z3 , t3 ) + fixmul ( coeffs - > n . z2 , t2 ) + fixmul ( coeffs - > n . z1 , t ) + coeffs - > n . z0 ;
return coord ;
}
2014-10-02 03:02:36 +00:00
fix curve_dist ( vms_equation * coeffs , int degree , fix t0 , const vms_vector & p0 , fix dist )
{
2006-03-20 17:12:09 +00:00
vms_vector coord ;
fix t , diff ;
2017-12-05 05:29:55 +00:00
if ( degree ! = 3 )
con_puts ( CON_CRITICAL , " for Hermite Curves degree must be 3 " ) ;
2006-03-20 17:12:09 +00:00
for ( t = t0 ; t < 1 * F1_0 ; t + = 0.001 * F1_0 ) {
coord = evaluate_curve ( coeffs , 3 , t ) ;
2014-10-02 03:02:36 +00:00
diff = dist - vm_vec_dist ( coord , p0 ) ;
2006-03-20 17:12:09 +00:00
if ( diff < ACCURACY ) //&&(diff>-ACCURACY))
return t ;
}
return - 1 * F1_0 ;
}
void plot_parametric ( vms_equation * coeffs , fix min_t , fix max_t , fix del_t ) {
vms_vector coord , dcoord ;
fix t , dt ;
2016-02-12 04:02:28 +00:00
const uint8_t color = 15 ;
2017-01-01 00:45:44 +00:00
gr_box ( * grd_curcanv , 75 , 40 , 325 , 290 , color ) ;
gr_box ( * grd_curcanv , 75 , 310 , 325 , 560 , color ) ;
gr_box ( * grd_curcanv , 475 , 310 , 725 , 560 , color ) ;
2006-03-20 17:12:09 +00:00
//gr_pal_fade_in( grd_curscreen->pal );
for ( t = min_t ; t < max_t - del_t ; t + = del_t ) {
dt = t + del_t ;
coord = evaluate_curve ( coeffs , 3 , t ) ;
dcoord = evaluate_curve ( coeffs , 3 , dt ) ;
2016-12-29 03:27:10 +00:00
gr_line ( * grd_curcanv , 75 * F1_0 + coord . x , 290 * F1_0 - coord . z , 75 * F1_0 + dcoord . x , 290 * F1_0 - dcoord . z , 9 ) ;
gr_line ( * grd_curcanv , 75 * F1_0 + coord . x , 560 * F1_0 - coord . y , 75 * F1_0 + dcoord . x , 560 * F1_0 - dcoord . y , 10 ) ;
gr_line ( * grd_curcanv , 475 * F1_0 + coord . z , 560 * F1_0 - coord . y , 475 * F1_0 + dcoord . z , 560 * F1_0 - dcoord . y , 12 ) ;
2006-03-20 17:12:09 +00:00
}
}
2015-07-12 01:04:18 +00:00
static vms_vector p1 , p4 , r1 , r4 ;
static vms_vector r4t , r1save ;
2006-03-20 17:12:09 +00:00
2020-05-17 23:35:25 +00:00
int generate_curve ( const fix r1scale , const fix r4scale )
{
auto & LevelSharedVertexState = LevelSharedSegmentState . get_vertex_state ( ) ;
auto & Vertices = LevelSharedVertexState . get_vertices ( ) ;
2006-03-20 17:12:09 +00:00
vms_vector vec_dir , tvec ;
vms_vector coord , prev_point ;
vms_equation coeffs ;
fix enddist , nextdist ;
int firstsegflag ;
fix t , maxscale ;
fixang rangle , uangle ;
2020-08-24 01:31:28 +00:00
const shared_segment & cursegp = Cursegp ;
2018-12-30 00:43:57 +00:00
auto & vcvertptr = Vertices . vcptr ;
2018-03-12 03:43:47 +00:00
compute_center_point_on_side ( vcvertptr , p1 , cursegp , Curside ) ;
2006-03-20 17:12:09 +00:00
switch ( Curside ) {
2022-02-19 14:52:17 +00:00
case sidenum_t : : WLEFT :
2018-09-19 02:13:29 +00:00
extract_right_vector_from_segment ( vcvertptr , cursegp , r1 ) ;
2014-09-28 21:11:05 +00:00
vm_vec_scale ( r1 , - F1_0 ) ;
2006-03-20 17:12:09 +00:00
break ;
2022-02-19 14:52:17 +00:00
case sidenum_t : : WTOP :
2018-09-19 02:13:29 +00:00
extract_up_vector_from_segment ( vcvertptr , cursegp , r1 ) ;
2006-03-20 17:12:09 +00:00
break ;
2022-02-19 14:52:17 +00:00
case sidenum_t : : WRIGHT :
2018-09-19 02:13:29 +00:00
extract_right_vector_from_segment ( vcvertptr , cursegp , r1 ) ;
2006-03-20 17:12:09 +00:00
break ;
2022-02-19 14:52:17 +00:00
case sidenum_t : : WBOTTOM :
2018-09-19 02:13:29 +00:00
extract_up_vector_from_segment ( vcvertptr , cursegp , r1 ) ;
2014-09-28 21:11:05 +00:00
vm_vec_scale ( r1 , - F1_0 ) ;
2006-03-20 17:12:09 +00:00
break ;
2022-02-19 14:52:17 +00:00
case sidenum_t : : WBACK :
2018-09-19 02:13:29 +00:00
extract_forward_vector_from_segment ( vcvertptr , cursegp , r1 ) ;
2006-03-20 17:12:09 +00:00
break ;
2022-02-19 14:52:17 +00:00
case sidenum_t : : WFRONT :
2018-09-19 02:13:29 +00:00
extract_forward_vector_from_segment ( vcvertptr , cursegp , r1 ) ;
2014-09-28 21:11:05 +00:00
vm_vec_scale ( r1 , - F1_0 ) ;
2006-03-20 17:12:09 +00:00
break ;
}
2020-08-24 01:31:28 +00:00
const shared_segment & markedsegp = Markedsegp ;
2018-03-12 03:43:47 +00:00
compute_center_point_on_side ( vcvertptr , p4 , markedsegp , Markedside ) ;
2006-03-20 17:12:09 +00:00
switch ( Markedside ) {
2022-02-19 14:52:17 +00:00
case sidenum_t : : WLEFT :
2018-09-19 02:13:29 +00:00
extract_right_vector_from_segment ( vcvertptr , markedsegp , r4 ) ;
extract_up_vector_from_segment ( vcvertptr , markedsegp , r4t ) ;
2006-03-20 17:12:09 +00:00
break ;
2022-02-19 14:52:17 +00:00
case sidenum_t : : WTOP :
2018-09-19 02:13:29 +00:00
extract_up_vector_from_segment ( vcvertptr , markedsegp , r4 ) ;
2014-09-28 21:11:05 +00:00
vm_vec_scale ( r4 , - F1_0 ) ;
2018-09-19 02:13:29 +00:00
extract_forward_vector_from_segment ( vcvertptr , markedsegp , r4t ) ;
2014-09-28 21:11:05 +00:00
vm_vec_scale ( r4t , - F1_0 ) ;
2006-03-20 17:12:09 +00:00
break ;
2022-02-19 14:52:17 +00:00
case sidenum_t : : WRIGHT :
2018-09-19 02:13:29 +00:00
extract_right_vector_from_segment ( vcvertptr , markedsegp , r4 ) ;
2014-09-28 21:11:05 +00:00
vm_vec_scale ( r4 , - F1_0 ) ;
2018-09-19 02:13:29 +00:00
extract_up_vector_from_segment ( vcvertptr , markedsegp , r4t ) ;
2006-03-20 17:12:09 +00:00
break ;
2022-02-19 14:52:17 +00:00
case sidenum_t : : WBOTTOM :
2018-09-19 02:13:29 +00:00
extract_up_vector_from_segment ( vcvertptr , markedsegp , r4 ) ;
extract_forward_vector_from_segment ( vcvertptr , markedsegp , r4t ) ;
2006-03-20 17:12:09 +00:00
break ;
2022-02-19 14:52:17 +00:00
case sidenum_t : : WBACK :
2018-09-19 02:13:29 +00:00
extract_forward_vector_from_segment ( vcvertptr , markedsegp , r4 ) ;
2014-09-28 21:11:05 +00:00
vm_vec_scale ( r4 , - F1_0 ) ;
2018-09-19 02:13:29 +00:00
extract_up_vector_from_segment ( vcvertptr , markedsegp , r4t ) ;
2006-03-20 17:12:09 +00:00
break ;
2022-02-19 14:52:17 +00:00
case sidenum_t : : WFRONT :
2018-09-19 02:13:29 +00:00
extract_forward_vector_from_segment ( vcvertptr , markedsegp , r4 ) ;
extract_up_vector_from_segment ( vcvertptr , markedsegp , r4t ) ;
2006-03-20 17:12:09 +00:00
break ;
}
r1save = r1 ;
tvec = r1 ;
2014-09-28 21:11:05 +00:00
vm_vec_scale ( r1 , r1scale ) ;
vm_vec_scale ( r4 , r4scale ) ;
2006-03-20 17:12:09 +00:00
2014-10-26 22:08:58 +00:00
create_curve ( p1 , p4 , r1 , r4 , coeffs ) ;
2006-03-20 17:12:09 +00:00
OriginalSeg = Cursegp ;
OriginalMarkedSeg = Markedsegp ;
OriginalSide = Curside ;
OriginalMarkedSide = Markedside ;
CurveNumSegs = 0 ;
coord = prev_point = p1 ;
t = 0 ;
firstsegflag = 1 ;
enddist = F1_0 ; nextdist = 0 ;
while ( enddist > fixmul ( nextdist , 1.5 * F1_0 ) ) {
2014-11-04 01:27:55 +00:00
vms_matrix rotmat ;
2006-03-20 17:12:09 +00:00
if ( firstsegflag = = 1 )
firstsegflag = 0 ;
else
2018-09-19 02:13:29 +00:00
extract_forward_vector_from_segment ( vcvertptr , cursegp , tvec ) ;
2014-09-28 21:11:03 +00:00
nextdist = vm_vec_mag ( tvec ) ; // nextdist := distance to next point
2014-10-02 03:02:36 +00:00
t = curve_dist ( & coeffs , 3 , t , prev_point , nextdist ) ; // t = argument at which function is forward vector magnitude units away from prev_point (in 3-space, not along curve)
2006-03-20 17:12:09 +00:00
coord = evaluate_curve ( & coeffs , 3 , t ) ; // coord := point about forward vector magnitude units away from prev_point
2014-10-01 02:28:41 +00:00
enddist = vm_vec_dist ( coord , p4 ) ; // enddist := distance from current to end point, vec_dir used as a temporary variable
2006-03-20 17:12:09 +00:00
//vm_vec_normalize(vm_vec_sub(&vec_dir, &coord, &prev_point));
2014-10-01 02:28:41 +00:00
vm_vec_normalized_dir ( vec_dir , coord , prev_point ) ;
2017-06-10 03:31:02 +00:00
if ( ! med_attach_segment ( Cursegp , vmsegptr ( & New_segment ) , Curside , AttachSide ) )
2015-07-12 01:04:18 +00:00
{
2018-06-24 05:06:15 +00:00
med_extract_matrix_from_segment ( cursegp , rotmat ) ; // rotmat := matrix describing orientation of Cursegp
2014-11-04 01:31:22 +00:00
const auto tdest = vm_vec_rotate ( vec_dir , rotmat ) ; // tdest := vec_dir in reference frame of Cursegp
2006-03-20 17:12:09 +00:00
vec_dir = tdest ;
2014-11-04 01:27:55 +00:00
const auto rotmat2 = vm_vector_2_matrix ( vec_dir , nullptr , nullptr ) ;
2006-03-20 17:12:09 +00:00
2014-11-02 03:44:31 +00:00
med_rotate_segment ( Cursegp , rotmat2 ) ;
2006-03-20 17:12:09 +00:00
prev_point = coord ;
Curside = Side_opposite [ AttachSide ] ;
CurveSegs [ CurveNumSegs ] = Cursegp ;
CurveNumSegs + + ;
} else return 0 ;
}
2018-09-19 02:13:29 +00:00
extract_up_vector_from_segment ( vcvertptr , cursegp , tvec ) ;
2014-10-01 02:28:42 +00:00
uangle = vm_vec_delta_ang ( tvec , r4t , r4 ) ;
2006-03-20 17:12:09 +00:00
if ( uangle > = F1_0 * 1 / 8 ) uangle - = F1_0 * 1 / 4 ;
if ( uangle > = F1_0 * 1 / 8 ) uangle - = F1_0 * 1 / 4 ;
if ( uangle < = - F1_0 * 1 / 8 ) uangle + = F1_0 * 1 / 4 ;
if ( uangle < = - F1_0 * 1 / 8 ) uangle + = F1_0 * 1 / 4 ;
2018-09-19 02:13:29 +00:00
extract_right_vector_from_segment ( vcvertptr , cursegp , tvec ) ;
2014-10-01 02:28:42 +00:00
rangle = vm_vec_delta_ang ( tvec , r4t , r4 ) ;
2006-03-20 17:12:09 +00:00
if ( rangle > = F1_0 / 8 ) rangle - = F1_0 / 4 ;
if ( rangle > = F1_0 / 8 ) rangle - = F1_0 / 4 ;
if ( rangle < = - F1_0 / 8 ) rangle + = F1_0 / 4 ;
if ( rangle < = - F1_0 / 8 ) rangle + = F1_0 / 4 ;
if ( ( uangle ! = 0 ) & & ( rangle ! = 0 ) ) {
maxscale = CurveNumSegs * F1_0 ;
generate_banked_curve ( maxscale , coeffs ) ;
}
if ( CurveNumSegs ) {
med_form_bridge_segment ( Cursegp , Side_opposite [ AttachSide ] , Markedsegp , Markedside ) ;
2020-08-24 01:31:28 +00:00
CurveSegs [ CurveNumSegs ] = vmsegptr ( Markedsegp - > shared_segment : : children [ Markedside ] ) ;
2006-03-20 17:12:09 +00:00
CurveNumSegs + + ;
}
Cursegp = OriginalSeg ;
Curside = OriginalSide ;
med_create_new_segment_from_cursegp ( ) ;
//warn_if_concave_segments();
if ( CurveNumSegs ) return 1 ;
else return 0 ;
}
2021-06-28 03:37:51 +00:00
[[nodiscard]]
2014-11-04 01:26:50 +00:00
static inline vms_matrix vm_vec_ang_2_matrix ( const vms_vector & v , fixang a )
{
vms_matrix m ;
return vm_vec_ang_2_matrix ( m , v , a ) , m ;
}
2020-05-17 23:35:25 +00:00
void generate_banked_curve ( const fix maxscale , vms_equation coeffs )
{
auto & LevelSharedVertexState = LevelSharedSegmentState . get_vertex_state ( ) ;
auto & Vertices = LevelSharedVertexState . get_vertices ( ) ;
2006-03-20 17:12:09 +00:00
vms_vector vec_dir , tvec , b4r4t ;
vms_vector coord , prev_point ;
fix enddist , nextdist ;
int firstsegflag ;
fixang rangle , uangle , angle , scaled_ang = 0 ;
fix t ;
if ( CurveNumSegs ) {
2020-08-24 01:31:28 +00:00
const shared_segment & cursegp = Cursegp ;
2018-12-30 00:43:57 +00:00
auto & vcvertptr = Vertices . vcptr ;
2018-09-19 02:13:29 +00:00
extract_up_vector_from_segment ( vcvertptr , cursegp , b4r4t ) ;
2014-10-01 02:28:42 +00:00
uangle = vm_vec_delta_ang ( b4r4t , r4t , r4 ) ;
2006-03-20 17:12:09 +00:00
if ( uangle > = F1_0 * 1 / 8 ) uangle - = F1_0 * 1 / 4 ;
if ( uangle > = F1_0 * 1 / 8 ) uangle - = F1_0 * 1 / 4 ;
if ( uangle < = - F1_0 * 1 / 8 ) uangle + = F1_0 * 1 / 4 ;
if ( uangle < = - F1_0 * 1 / 8 ) uangle + = F1_0 * 1 / 4 ;
2018-09-19 02:13:29 +00:00
extract_right_vector_from_segment ( vcvertptr , cursegp , b4r4t ) ;
2014-10-01 02:28:42 +00:00
rangle = vm_vec_delta_ang ( b4r4t , r4t , r4 ) ;
2006-03-20 17:12:09 +00:00
if ( rangle > = F1_0 / 8 ) rangle - = F1_0 / 4 ;
if ( rangle > = F1_0 / 8 ) rangle - = F1_0 / 4 ;
if ( rangle < = - F1_0 / 8 ) rangle + = F1_0 / 4 ;
if ( rangle < = - F1_0 / 8 ) rangle + = F1_0 / 4 ;
angle = uangle ;
if ( abs ( rangle ) < abs ( uangle ) ) angle = rangle ;
delete_curve ( ) ;
coord = prev_point = p1 ;
# define MAGIC_NUM 0.707*F1_0
if ( maxscale )
scaled_ang = fixdiv ( angle , fixmul ( maxscale , MAGIC_NUM ) ) ;
t = 0 ;
tvec = r1save ;
firstsegflag = 1 ;
enddist = F1_0 ; nextdist = 0 ;
while ( enddist > fixmul ( nextdist , 1.5 * F1_0 ) ) {
2014-11-04 01:26:50 +00:00
vms_matrix rotmat ;
2006-03-20 17:12:09 +00:00
if ( firstsegflag = = 1 )
firstsegflag = 0 ;
else
2018-09-19 02:13:29 +00:00
extract_forward_vector_from_segment ( vcvertptr , cursegp , tvec ) ;
2014-09-28 21:11:03 +00:00
nextdist = vm_vec_mag ( tvec ) ; // nextdist := distance to next point
2014-10-02 03:02:36 +00:00
t = curve_dist ( & coeffs , 3 , t , prev_point , nextdist ) ; // t = argument at which function is forward vector magnitude units away from prev_point (in 3-space, not along curve)
2006-03-20 17:12:09 +00:00
coord = evaluate_curve ( & coeffs , 3 , t ) ; // coord := point about forward vector magnitude units away from prev_point
2014-10-01 02:28:41 +00:00
enddist = vm_vec_dist ( coord , p4 ) ; // enddist := distance from current to end point, vec_dir used as a temporary variable
2006-03-20 17:12:09 +00:00
//vm_vec_normalize(vm_vec_sub(&vec_dir, &coord, &prev_point));
2014-10-01 02:28:41 +00:00
vm_vec_normalized_dir ( vec_dir , coord , prev_point ) ;
2017-06-10 03:31:02 +00:00
if ( ! med_attach_segment ( Cursegp , vmsegptr ( & New_segment ) , Curside , AttachSide ) )
2015-07-12 01:04:18 +00:00
{
2018-06-24 05:06:15 +00:00
med_extract_matrix_from_segment ( cursegp , rotmat ) ; // rotmat := matrix describing orientation of Cursegp
2014-11-04 01:31:22 +00:00
const auto tdest = vm_vec_rotate ( vec_dir , rotmat ) ; // tdest := vec_dir in reference frame of Cursegp
2006-03-20 17:12:09 +00:00
vec_dir = tdest ;
2014-11-04 01:26:50 +00:00
const auto rotmat2 = vm_vec_ang_2_matrix ( vec_dir , scaled_ang ) ;
2006-03-20 17:12:09 +00:00
2014-11-02 03:44:31 +00:00
med_rotate_segment ( Cursegp , rotmat2 ) ;
2006-03-20 17:12:09 +00:00
prev_point = coord ;
Curside = Side_opposite [ AttachSide ] ;
CurveSegs [ CurveNumSegs ] = Cursegp ;
CurveNumSegs + + ;
}
}
}
}
void delete_curve ( ) {
2016-02-12 04:02:28 +00:00
range_for ( auto & i , partial_const_range ( CurveSegs , CurveNumSegs ) )
2014-11-30 22:09:23 +00:00
{
2020-08-24 01:31:28 +00:00
if ( i - > shared_segment : : segnum ! = segment_none )
2017-06-10 03:31:02 +00:00
med_delete_segment ( vmsegptridx ( i ) ) ;
2006-03-20 17:12:09 +00:00
}
Markedsegp = OriginalMarkedSeg ;
Markedside = OriginalMarkedSide ;
Cursegp = OriginalSeg ;
Curside = OriginalSide ;
med_create_new_segment_from_cursegp ( ) ;
CurveNumSegs = 0 ;
//editor_status("");
//warn_if_concave_segments();
}