| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495 |
- /*
- ** 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 <http://www.gnu.org/licenses/>.
- */
- /***************************************************************************
- *** 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;
- }
|