/* ** Command & Conquer Renegade(tm) ** Copyright 2025 Electronic Arts Inc. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This program 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 General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . */ /*************************************************************************** *** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S *** *************************************************************************** * * * Project Name : G * * * * $Archive:: /Commando/Code/ww3d2/line3d.cpp $* * * * $Author:: Jani_p $* * * * $Modtime:: 7/05/01 4:15p $* * * * $Revision:: 11 $* * * *-------------------------------------------------------------------------* * Functions: * * Line3DClass::Line3DClass -- Constructor * * Line3DClass::Line3DClass -- Copy constructor. * * Line3DClass::operator = -- assignment operator * * Line3DClass::~Line3DClass -- Destructor. * * Line3DClass::Clone -- Creates a clone of this Line3D * * Line3DClass::Scale -- Scale object * * Line3DClass::Scale -- Scale object * * Line3DClass::Update_Cached_Bounding_Volumes -- update bounding vols * * Line3DClass::Reset -- Reset line start and end points. * * Line3DClass::Reset -- Reset line start and end points, and line width.* * Re_Color -- Reset the line color. * * Set_Opacity -- Reset the line opacity. * * Line3DClass::Render -- render the 3d line * * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #include "line3d.h" #include "vertmaterial.h" #include "shader.h" #include "wwdebug.h" #include "ww3d.h" #include "rinfo.h" #include "dx8wrapper.h" #include "dx8vertexbuffer.h" #include "dx8indexbuffer.h" #include "dx8fvf.h" // 12 Triangles for index buffer const unsigned short Indices[]= { 3,5,1, 7,5,3, 1,5,0, 5,4,0, 4,2,0, 4,6,2, 7,3,2, 6,7,2, 7,6,5, 5,6,4, 2,3,1, 2,1,0 }; /************************************************************************** * Line3DClass::Line3DClass -- Constructor * * * * INPUT: Vector3 start, end - start, end points of line (world coords).* * float width - width of line (in world units). * * float r, g, b - R, G, B components of line color. * * float opacity - opacity of line. * * * * OUTPUT: none. * * * * WARNINGS: * * * * HISTORY: * * 01/15/1998 NH : Created. * * 04/21/1998 NH : Ported to SR 1.3. * * 02/16/2001 HY : Ported to DX8 * *========================================================================*/ Line3DClass::Line3DClass (const Vector3 & start, const Vector3 & end, float width, float r, float g, float b, float opacity) { Length = (end - start).Length(); Width = width; // Create box model with origin at start point (X is major axis). // 8 Vertices float halfw = Width * 0.5f; vert[0].X = 0.0f; vert[0].Y = -halfw; vert[0].Z = -halfw; vert[1].X = 0.0f; vert[1].Y = halfw; vert[1].Z = -halfw; vert[2].X = 0.0f; vert[2].Y = -halfw; vert[2].Z = halfw; vert[3].X = 0.0f; vert[3].Y = halfw; vert[3].Z = halfw; vert[4].X = Length; vert[4].Y = -halfw; vert[4].Z = -halfw; vert[5].X = Length; vert[5].Y = halfw; vert[5].Z = -halfw; vert[6].X = Length; vert[6].Y = -halfw; vert[6].Z = halfw; vert[7].X = Length; vert[7].Y = halfw; vert[7].Z = halfw; Color.X=r; Color.Y=g; Color.Z=b; Set_Opacity(opacity); // Set box transform so that the origin is at the start point and it // 'looks towards' the endpoint. Matrix3D transform(true); transform.Obj_Look_At(start, end, 0.0); Set_Transform(transform); } /************************************************************************** * Line3DClass::Line3DClass -- Copy constructor. * * * * INPUT: const Line3DClass & src - source to copy from. * * * * OUTPUT: none. * * * * WARNINGS: * * * * HISTORY: * * 01/15/1998 NH : Created. * * 04/21/1998 NH : Ported to SR 1.3. * * 02/16/2001 HY : Ported to DX8 * *========================================================================*/ Line3DClass::Line3DClass(const Line3DClass & src) : RenderObjClass(src), Length(src.Length), Width(src.Width), Shader(src.Shader), Color(src.Color) { for (int i=0; i<8; i++) vert[i]=src.vert[i]; } /************************************************************************** * Line3DClass::operator = -- assignment operator * * * * INPUT: const Line3DClass & that - source to copy from. * * * * OUTPUT: Line3DClass & - result of assignment. * * * * WARNINGS: * * * * HISTORY: * * 01/15/1998 NH : Created. * * 04/21/1998 NH : Ported to SR 1.3. * * 02/16/2001 HY : Ported to DX8 * *========================================================================*/ Line3DClass & Line3DClass::operator = (const Line3DClass & that) { // Naty: need to add MatInfo and remapper to do this Byon WWASSERT(0); RenderObjClass::operator = (that); if (this != &that) { Length = that.Length; Width = that.Width; Shader=that.Shader; Color=that.Color; for (int i=0; i<8; i++) vert[i]=that.vert[i]; } return * this; } /************************************************************************** * Line3DClass::~Line3DClass -- Destructor. * * * * INPUT: none. * * * * OUTPUT: none. * * * * WARNINGS: * * * * HISTORY: * * 01/15/1998 NH : Created. * * 04/21/1998 NH : Ported to SR 1.3. * * 02/16/2001 HY : Ported to DX8 * *========================================================================*/ Line3DClass::~Line3DClass(void) { } /************************************************************************** * Line3DClass::Clone -- Creates a clone of this Line3D * * * * INPUT: none. * * * * OUTPUT: RenderObjClass * - pointer to cloned object. * * * * WARNINGS: * * * * HISTORY: * * 01/15/1998 NH : Created. * *========================================================================*/ RenderObjClass * Line3DClass::Clone(void) const { return NEW_REF( Line3DClass, (*this)); } /*********************************************************************************************** * Line3DClass::Render -- render the 3d line * * * * INPUT: * * * * OUTPUT: * * * * WARNINGS: * * * * HISTORY: * * 12/8/98 GTH : Created. * * 02/16/2001 HY : Ported to DX8 * *=============================================================================================*/ void Line3DClass::Render(RenderInfoClass & rinfo) { if (Is_Not_Hidden_At_All() == false) { return; } DX8Wrapper::Set_Shader(Shader); DX8Wrapper::Set_Texture(0,NULL); VertexMaterialClass *vm=VertexMaterialClass::Get_Preset(VertexMaterialClass::PRELIT_DIFFUSE); DX8Wrapper::Set_Material(vm); REF_PTR_RELEASE(vm); DX8Wrapper::Set_Transform(D3DTS_WORLD,Transform); DynamicVBAccessClass vb(BUFFER_TYPE_DYNAMIC_DX8,dynamic_fvf_type,8); { DynamicVBAccessClass::WriteLockClass Lock(&vb); const FVFInfoClass &fi=vb.FVF_Info(); unsigned char *vb=(unsigned char*)Lock.Get_Formatted_Vertex_Array(); int i; unsigned int color=DX8Wrapper::Convert_Color(Color); for (i=0; i<8; i++) { *(Vector3*)(vb+fi.Get_Location_Offset())=vert[i]; *(unsigned int*)(vb+fi.Get_Diffuse_Offset())=color; vb+=fi.Get_FVF_Size(); } } DynamicIBAccessClass ib(BUFFER_TYPE_DYNAMIC_DX8,36); { DynamicIBAccessClass::WriteLockClass Lock(&ib); unsigned short *mem=Lock.Get_Index_Array(); for (int i=0; i<36; i++) mem[i]=Indices[i]; } DX8Wrapper::Set_Vertex_Buffer(vb); DX8Wrapper::Set_Index_Buffer(ib,0); DX8Wrapper::Draw_Triangles(0,36/3,0,8); } /************************************************************************** * Line3DClass::Scale -- Scale object * * * * INPUT: float scale - uniform scale factor. * * * * OUTPUT: none. * * * * WARNINGS: * * * * HISTORY: * * 01/27/1998 NH : Created. * * 04/21/1998 NH : Ported to SR 1.3. * * 02/16/2001 HY : Ported to DX8 * *========================================================================*/ void Line3DClass::Scale(float scale) { for (int i=0; i<8; i++) vert[i]*=scale; Length *= scale; Width *= scale; Invalidate_Cached_Bounding_Volumes(); // Now update the object space bounding volumes of this object's container: RenderObjClass *container = Get_Container(); if (container) container->Update_Obj_Space_Bounding_Volumes(); } /************************************************************************** * Line3DClass::Scale -- Scale object * * * * INPUT: float scalex, scaley, scalez - axis scale factors. * * * * OUTPUT: none. * * * * WARNINGS: * * * * HISTORY: * * 01/27/1998 NH : Created. * * 04/21/1998 NH : Ported to SR 1.3. * * 02/16/2001 HY : Ported to DX8 * *========================================================================*/ void Line3DClass::Scale(float scalex, float scaley, float scalez) { // The line width is always the same in the y and z axes (the line // approximates a cylinder). Vector3 scale(scalex,scaley,scalez); for (int i=0; i<8; i++) vert[i].Scale(scale); Length *= scalex; Width *= scaley; Invalidate_Cached_Bounding_Volumes(); // Now update the object space bounding volumes of this object's container: RenderObjClass *container = Get_Container(); if (container) container->Update_Obj_Space_Bounding_Volumes(); } void Line3DClass::Get_Obj_Space_Bounding_Sphere(SphereClass & sphere) const { float half_l = Length * 0.5f; sphere.Center.Set(half_l, 0.0f, 0.0f); sphere.Radius = half_l; } void Line3DClass::Get_Obj_Space_Bounding_Box(AABoxClass & box) const { float half_l = Length * 0.5f; box.Center.Set(half_l, 0.0f, 0.0f); box.Extent.Set(half_l, 0.0f, 0.0f); } /************************************************************************** * Line3DClass::Reset -- Reset line start and end points. * * * * INPUT: * * * * OUTPUT: * * * * WARNINGS: * * * * HISTORY: * * 01/19/1998 NH : Created. * * 04/21/1998 NH : Ported to SR 1.3. * *========================================================================*/ void Line3DClass::Reset(const Vector3 & new_start, const Vector3 & new_end) { // Adjust length of line: float new_length = (new_end - new_start).Length(); if (new_length == 0) { new_length = 0.001f; // make sure we don't have a zero length BMG } Scale((new_length / Length), 1.0f, 1.0f); Length = new_length; // Adjust transform of line: Matrix3D transform(true); transform.Obj_Look_At(new_start, new_end, 0.0); Set_Transform(transform); Invalidate_Cached_Bounding_Volumes(); // Now update the object space bounding volumes of this object's container: RenderObjClass *container = Get_Container(); if (container) container->Update_Obj_Space_Bounding_Volumes(); } /************************************************************************** * Line3DClass::Reset -- Reset line start and end points, and line width. * * * * INPUT: * * * * OUTPUT: * * * * WARNINGS: * * * * HISTORY: * * 01/19/1998 NH : Created. * * 04/21/1998 NH : Ported to SR 1.3. * *========================================================================*/ void Line3DClass::Reset(const Vector3 & new_start, const Vector3 & new_end, float new_width) { // Adjust length and width of line: float new_length = (new_end - new_start).Length(); if (new_length == 0) { new_length = 0.001f; // make sure we don't have a zero length BMG } float width_scale = new_width / Width; Scale((new_length / Length), width_scale, width_scale); Length = new_length; Width = new_width; // Adjust transform of line: Matrix3D transform(true); transform.Obj_Look_At(new_start, new_end, 0.0); Set_Transform(transform); Matrix3D inv; transform.Get_Orthogonal_Inverse(inv); Vector3 test = inv * Vector3(new_end); Invalidate_Cached_Bounding_Volumes(); // Now update the object space bounding volumes of this object's container: RenderObjClass *container = Get_Container(); if (container) container->Update_Obj_Space_Bounding_Volumes(); } /************************************************************************** * Re_Color -- Reset the line color. * * * * INPUT: float r, g, b - components of the new color. * * * * OUTPUT: none. * * * * WARNINGS: * * * * HISTORY: * * 01/26/1998 NH : Created. * * 04/21/1998 NH : Ported to SR 1.3. * *========================================================================*/ void Line3DClass::Re_Color(float r, float g, float b) { Color=Vector4(r,g,b,Color.W); } /************************************************************************** * Set_Opacity -- Reset the line opacity. * * * * INPUT: float opacity - new opacity. * * * * OUTPUT: none. * * * * WARNINGS: * * * * HISTORY: * * 11/03/1998 NH : Created. * *========================================================================*/ void Line3DClass::Set_Opacity(float opacity) { if (opacity < 1.0f) Shader=ShaderClass::_PresetAlphaSolidShader; else Shader=ShaderClass::_PresetOpaqueSolidShader; Color.W=opacity; } /* ** */ int Line3DClass::Get_Num_Polys(void) const { return 12; }