/* * 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. 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. */ /* * * Functions for sizing segments * */ #include #include "inferno.h" #include "editor.h" #include "editor/esegment.h" #include "dxxerror.h" #include "gameseg.h" #include "kdefs.h" #include "compiler-range_for.h" #include "d_range.h" #define XDIM 0 #define YDIM 1 #define ZDIM 2 #define MAX_MODIFIED_VERTICES 32 namespace { static std::array Modified_vertices; int Modified_vertex_index = 0; } namespace dsx { namespace { // ------------------------------------------------------------------------------------------ static void validate_modified_segments(void) { auto &LevelSharedVertexState = LevelSharedSegmentState.get_vertex_state(); auto &Vertices = LevelSharedVertexState.get_vertices(); visited_segment_bitarray_t modified_segments; auto &vcvertptr = Vertices.vcptr; for (int v=0; vsegnum != segment_none) { if (modified_segments[segp]) continue; range_for (const auto w, segp->verts) if (w == v0) { modified_segments[segp] = true; validate_segment(vcvertptr, segp); for (unsigned s=0; s propagated = {}; for (int i=0; ichildren[i]; if (IS_CHILD(c)) { range_for (auto &s, propagated) ++s; propagated[static_cast(Side_opposite[i])]--; med_propagate_tmaps_to_segments(vmsegptridx(c), Cursegp, 1); } } // Now, for all sides that were not adjacent to another side, and therefore did not get tmaps // propagated to them, treat as a back side. for (int i=0; i SEGSIZEMODE_MAX) SegSizeMode = SEGSIZEMODE_MIN; return 1; } namespace { // --------------------------------------------------------------------------- static int PerturbCursideCommon(fix amount) { auto &LevelSharedVertexState = LevelSharedSegmentState.get_vertex_state(); auto &Vertices = LevelSharedVertexState.get_vertices(); int saveSegSizeMode = SegSizeMode; vms_vector fvec, rvec, uvec; fix fmag, rmag, umag; SegSizeMode = SEGSIZEMODE_CURSIDE; Modified_vertex_index = 0; auto &vcvertptr = Vertices.vcptr; extract_forward_vector_from_segment(vcvertptr, Cursegp, fvec); extract_right_vector_from_segment(vcvertptr, Cursegp, rvec); extract_up_vector_from_segment(vcvertptr, Cursegp, uvec); fmag = vm_vec_mag(fvec); rmag = vm_vec_mag(rvec); umag = vm_vec_mag(uvec); range_for (const auto v, Side_to_verts[Curside]) { vms_vector perturb_vec; perturb_vec.x = fixmul(rmag, d_rand()*2 - 32767); perturb_vec.y = fixmul(umag, d_rand()*2 - 32767); perturb_vec.z = fixmul(fmag, d_rand()*2 - 32767); scale_vert(Cursegp, Cursegp->verts[v], perturb_vec, amount); } // validate_segment(Cursegp); // if (SegSizeMode) { // for (i=0; ichildren[i] != -1) // validate_segment(&Segments[Cursegp->children[i]]); // } validate_modified_segments(); SegSizeMode = saveSegSizeMode; Update_flags |= UF_WORLD_CHANGED; mine_changed = 1; return 1; } } // --------------------------------------------------------------------------- int PerturbCurside(void) { PerturbCursideCommon(F1_0/10); return 1; } // --------------------------------------------------------------------------- int PerturbCursideBig(void) { PerturbCursideCommon(F1_0/2); return 1; } }