99static bool Ring_Array_Valid =
false;
117 void Generate(
float radius,
int slices);
176 Color (0.75F,0.75F,0.75F),
219 Color (0.75F,0.75F,0.75F),
270 Color (0.75F,0.75F,0.75F),
370 if (!Ring_Array_Valid) {
386 Ring_Array_Valid =
true;
399 float benefit_factor = 1 - (0.5f / (polycount * polycount));
400 values[lod] = (benefit_factor * screen_area *
LODBias) / polycount;
559 for (
int i=0; i<ring.Vertex_ct; i++)
561 vb->
x = ring.vtx[i].
X;
562 vb->
y = ring.vtx[i].
Y;
563 vb->
z = ring.vtx[i].
Z;
565 vb->
nx = ring.vtx_normal[i].
X;
566 vb->
ny = ring.vtx_normal[i].
Y;
567 vb->
nz = ring.vtx_normal[i].
Z;
572 vb->
u1 = ring.vtx_uv[i].
X;
573 vb->
v1 = ring.vtx_uv[i].
Y;
583 for (
int i=0; i<ring.face_ct; i++)
585 mem[3*i]=ring.tri_poly[i].
I;
586 mem[3*i+1]=ring.tri_poly[i].
J;
587 mem[3*i+2]=ring.tri_poly[i].
K;
723 Transform.Get_Translation(&obj_position);
726 temp.
Look_At(obj_position, obj_position + camera_z_vector, 0.0f);
1041 if (
scale == 1.0f)
return;
1050 for (i = 0; i < inner_count; i++) {
1055 for (i = 0; i < outer_count; i++) {
1085 for (i = 0; i < inner_count; i++) {
1088 key_val.
X *= scalex;
1089 key_val.
Y *= scaley;
1093 for (i = 0; i < outer_count; i++) {
1096 key_val.
X *= scalex;
1097 key_val.
Y *= scaley;
1197 prototype->
Load (cload);
1206 ::memset (&Definition, 0,
sizeof (Definition));
1212 ::memset (&Definition, 0,
sizeof (Definition));
1213 ::strcpy (Definition.Name, ring->
Get_Name ());
1216 Definition.Attributes = ring->
Get_Flags ();
1237 const char *filename = ::strrchr (name,
'\\');
1238 if (filename !=
NULL) {
1244 ::strcpy (Definition.TextureName, filename);
1264 return Definition.Name;
1283 ColorChannel.Reset ();
1284 AlphaChannel.Reset ();
1285 InnerScaleChannel.Reset ();
1286 OuterScaleChannel.Reset ();
1292 cload.
Read (&Definition,
sizeof (Definition));
1296 ColorChannel.Load (cload);
1300 AlphaChannel.Load (cload);
1304 InnerScaleChannel.Load (cload);
1308 OuterScaleChannel.Load (cload);
1323 csave.
Write (&Definition,
sizeof (Definition));
1326 if (ColorChannel.Get_Key_Count () > 0) {
1328 ColorChannel.Save (csave);
1332 if (AlphaChannel.Get_Key_Count () > 0) {
1334 AlphaChannel.Save (csave);
1338 if (InnerScaleChannel.Get_Key_Count () > 0) {
1340 InnerScaleChannel.Save (csave);
1344 if (OuterScaleChannel.Get_Key_Count () > 0) {
1346 OuterScaleChannel.Save (csave);
1370 ring->
InnerScale = Definition.DefaultInnerScale;
1371 ring->
OuterScale = Definition.DefaultOuterScale;
1373 ring->
Alpha = Definition.DefaultAlpha;
1374 ring->
Set_Flags (Definition.Attributes);
1422InnerScale (1.0F, 1.0F),
1423OuterScale (1.0F, 1.0F)
1451InnerScale (1.0F, 1.0F),
1452OuterScale (1.0F, 1.0F)
1459 if (TileCount != count) {
1465 float u_inc = ((float)TileCount) / ((
float)(Slices));
1466 float u_value = 0.0F;
1471 for (
int index = 0; index < Vertex_ct; index += 2) {
1472 vtx_uv[index].Set (u_value, 0.0F);
1473 vtx_uv[index + 1].Set (u_value, 1.0F);
1484 bool do_inner = (inner_scale != InnerScale);
1485 bool do_outer = (outer_scale != OuterScale);
1492 for (
int index = 0; index < Vertex_ct; index += 2) {
1493 vtx[index].X = orig_vtx[index].X * inner_scale.
X;
1494 vtx[index].Y = orig_vtx[index].Y * inner_scale.
Y;
1498 InnerScale = inner_scale;
1506 for (
int index = 1; index < Vertex_ct; index += 2) {
1507 vtx[index].X = orig_vtx[index].X * outer_scale.
X;
1508 vtx[index].Y = orig_vtx[index].Y * outer_scale.
Y;
1512 OuterScale = outer_scale;
1538 face_ct = (Slices * 2);
1539 Vertex_ct = (Slices * 2) + 2;
1550 float angle_inc =
DEG_TO_RADF (360) / ((float)Slices);
1551 float u_inc = ((float)TileCount) / ((
float)(Slices));
1552 float u_value = 0.0F;
1556 for (index = 0; index < Vertex_ct; index += 2) {
1564 vtx[index].X = orig_vtx[index].X = x_pos;
1565 vtx[index].Y = orig_vtx[index].Y = y_pos;
1571 vtx[index+1].X = orig_vtx[index+1].X = x_pos;
1572 vtx[index+1].Y = orig_vtx[index+1].Y = y_pos;
1578 vtx_normal[index].Set (0, 0, 1);
1579 vtx_normal[index + 1].Set (0, 0, 1);
1584 vtx_uv[index].Set (u_value, 0.0F);
1585 vtx_uv[index + 1].Set (u_value, 1.0F);
1594 for (index = 0; index < face_ct; index ++) {
1595 tri_poly[index].I = index;
1596 tri_poly[index].J = index+1;
1597 tri_poly[index].K = index+2;
1633void RingMeshClass::Free(
void)
1636 if (vtx)
delete vtx;
1637 if (orig_vtx)
delete orig_vtx;
1638 if (vtx_normal)
delete vtx_normal;
1639 if (vtx_uv)
delete vtx_uv;
1640 if (tri_poly)
delete tri_poly;
Color scale(const Color &a, const Color &b)
T Bound(T original, T minval, T maxval)
uint32 Read(void *buf, uint32 nbytes)
uint32 Write(const void *buf, uint32 nbytes)
bool Begin_Chunk(uint32 id)
static void Set_Vertex_Buffer(const VertexBufferClass *vb, unsigned stream=0)
static void Set_Texture(unsigned stage, TextureBaseClass *texture)
static void Set_Index_Buffer(const IndexBufferClass *ib, unsigned short index_base_offset)
static Vector4 Convert_Color(unsigned color)
static void Draw_Triangles(unsigned buffer_type, unsigned short start_index, unsigned short polygon_count, unsigned short min_vertex_index, unsigned short vertex_count)
static void Set_Material(const VertexMaterialClass *material)
static void Set_Shader(const ShaderClass &shader)
static void Set_Transform(D3DTRANSFORMSTATETYPE transform, const Matrix4x4 &m)
unsigned short * Get_Index_Array()
VertexFormatXYZNDUV2 * Get_Formatted_Vertex_Array()
WWINLINE Vector3 Get_Z_Vector() const
void Translate(float x, float y, float z)
void Look_At(const Vector3 &p, const Vector3 &t, float roll)
static void Add_Object(RenderObjClass *robj)
const T & Get_Value(void) const
virtual float Get_Screen_Size(CameraClass &camera)
virtual void Set_Transform(const Matrix3D &m)
virtual int Is_Not_Hidden_At_All(void)
virtual void Set_Position(const Vector3 &v)
virtual const SphereClass & Get_Bounding_Sphere(void) const
virtual void Update_Cached_Bounding_Volumes(void) const
RenderObjClass & operator=(const RenderObjClass &)
static const float AT_MAX_LOD
const Matrix3D & Get_Transform(void) const
static const float AT_MIN_LOD
virtual PrototypeClass * Load_W3D(ChunkLoadClass &cload)
void Scale(const Vector2 &inner_scale, const Vector2 &outer_scale)
friend class RingRenderObjClass
void Set_Tiling(int count)
void Generate(float radius, int slices)
bool Save(ChunkSaveClass &csave)
virtual const char * Get_Name(void) const
bool Load(ChunkLoadClass &cload)
virtual RenderObjClass * Create(void)
~RingPrototypeClass(void)
virtual int Get_Class_ID(void) const
void Update_On_Visibilty(void)
virtual float Get_Post_Increment_Value(void) const
virtual RenderObjClass * Clone(void) const
virtual const char * Get_Name(void) const
~RingRenderObjClass(void)
virtual int Calculate_Cost_Value_Arrays(float screen_area, float *values, float *costs) const
Vector2 Get_Default_Outer_Scale(void) const
virtual int Class_ID(void) const
const AABoxClass & Get_Box(void)
void Set_Texture_Tiling(int count)
void Set_Alpha_Channel(const RingAlphaChannelClass &data)
RingScaleChannelClass OuterScaleChannel
static void Generate_Shared_Mesh_Arrays(void)
virtual float Get_Value(void) const
virtual void Scale(float scale)
void Set_Texture(TextureClass *tf)
virtual float Get_Cost(void) const
void Set_Flags(unsigned int flags)
void Set_Inner_Extent(const Vector2 &extent)
virtual void Get_Obj_Space_Bounding_Sphere(SphereClass &sphere) const
void calculate_value_array(float screen_area, float *values) const
const RingScaleChannelClass & Peek_Outer_Scale_Channel(void)
virtual void Render(RenderInfoClass &rinfo)
virtual void Increment_LOD(void)
RingColorChannelClass ColorChannel
void Set_Outer_Extent(const Vector2 &extent)
Vector3 Get_Default_Color(void) const
TextureClass * RingTexture
const RingScaleChannelClass & Peek_Inner_Scale_Channel(void)
void Start_Animating(void)
void Stop_Animating(void)
char Name[2 *W3D_NAME_LEN]
const Vector2 & Get_Inner_Extent(void) const
virtual int Get_Num_Polys(void) const
virtual void Get_Obj_Space_Bounding_Box(AABoxClass &box) const
void Set_Local_Center_Extent(const Vector3 ¢er, const Vector3 &extent)
virtual int Get_LOD_Level(void) const
RingRenderObjClass & operator=(const RingRenderObjClass &)
const RingAlphaChannelClass & Peek_Alpha_Channel(void)
void Set_Outer_Scale_Channel(const RingScaleChannelClass &data)
virtual void Special_Render(SpecialRenderInfoClass &rinfo)
Vector2 Get_Default_Inner_Scale(void) const
virtual void Decrement_LOD(void)
float Get_Default_Alpha(void) const
void vis_render_ring(SpecialRenderInfoClass &rinfo, const Vector3 ¢er, const Vector3 &extent)
RingScaleChannelClass InnerScaleChannel
VertexMaterialClass * RingMaterial
RingAlphaChannelClass AlphaChannel
virtual void Set_Name(const char *name)
virtual void Set_Position(const Vector3 &v)
void Set_Animation_Duration(float time)
float Value[RING_NUM_LOD+2]
unsigned int Get_Flags(void)
virtual void Set_Transform(const Matrix3D &m)
const RingColorChannelClass & Peek_Color_Channel(void)
virtual void Set_LOD_Level(int lod)
virtual int Get_LOD_Count(void) const
virtual void Prepare_LOD(CameraClass &camera)
const Vector2 & Get_Outer_Extent(void) const
virtual void update_cached_box(void)
void Set_Inner_Scale_Channel(const RingScaleChannelClass &data)
int Get_Texture_Tiling(void) const
void Set_Color_Channel(const RingColorChannelClass &data)
void render_ring(RenderInfoClass &rinfo, const Vector3 ¢er, const Vector3 &extent)
void Set_Cull_Mode(CullModeType x)
static ShaderClass _PresetAlphaShader
void Enable_Fog(const char *source)
static void Insert_Triangles(const SphereClass &bounding_sphere, unsigned short start_index, unsigned short polygon_count, unsigned short min_vertex_index, unsigned short vertex_count)
VisRasterizerClass * VisRasterizer
const StringClass & Get_Full_Path(void) const
void Set_Model_Transform(const Matrix3D &model)
static void Convert_Vector(const W3dVectorStruct &v, Vector3 *set)
static void Convert_Shader(const W3dShaderStruct &shader, ShaderClass *set)
virtual TextureClass * Get_Texture(const char *filename, MipCountType mip_level_count=MIP_LEVELS_ALL, WW3DFormat texture_format=WW3D_FORMAT_UNKNOWN, bool allow_compression=true, TextureBaseClass::TexAssetType type=TextureBaseClass::TEX_REGULAR, bool allow_reduction=true)
static WW3DAssetManager * Get_Instance(void)
static unsigned int Get_Frame_Time(void)
static void Add_To_Static_Sort_List(RenderObjClass *robj, unsigned int sort_level)
static bool Are_Static_Sort_Lists_Enabled(void)
static bool Is_Sorting_Enabled(void)
static float Sin(float val)
static float Cos(float val)
const unsigned dynamic_fvf_type
@ BUFFER_TYPE_DYNAMIC_DX8
@ BUFFER_TYPE_DYNAMIC_SORTING
#define REF_PTR_RELEASE(x)
#define REF_PTR_SET(dst, src)
RingLoaderClass _RingLoader
RingMeshClass RingMeshArray[RING_NUM_LOD]
float RingLODCosts[RING_NUM_LOD+1]
@ CHUNKID_OUTER_SCALE_CHANNEL
@ CHUNKID_INNER_SCALE_CHANNEL
char Name[2 *W3D_NAME_LEN]
char TextureName[2 *W3D_NAME_LEN]