Hey!

draw_line, etc functions are using particles, and since particles are 2d they aren't affected by light or fog.
FillMode = Wireframe is something related to the HLSL, you can google that in Microsoft directx documentation.

I played around a little bit and got these results:
[Linked Image]

It supports:
Quote
- hard edges
- edge darken on angle
- no dynamic lights (can be added)
- alpha control for wireframe
- fog

To my taste, it lacks the ability to control the thickness of the wireframes...
Maybe some other more experienced users may tweak it or provide their own solution.

Code:
main.c
Code
#define PRAGMA_POINTER

MATERIAL *mtl_wireframe =
{
	effect = "wireframe.fx";
	flags = AUTORELOAD;
}

void main()
{
	warn_level = 6;
	fps_max = 60;
	
	level_load("");
	
	ENTITY *ent = ent_create("ball.mdl", vector(64, 0, 0), NULL);
	ent->material = mtl_wireframe;
	vec_set(&ent->blue, COLOR_GREY); // you can change color for each model by hand
	
	// material settings with range (0..1)
	ent->skill41 = floatv(1); // red
	ent->skill42 = floatv(1); // green
	ent->skill43 = floatv(1); // blue
	ent->skill44 = floatv(0.1); // alpha
}

wireframe.fx
Code
// set to zero to disable effect
#define ANGLE_SURFACE_DARKEN 0.25 // less number - less darken

float4x4 matWorldViewProj;
float4x4 matWorld;

float4 vecViewPos;
float4 vecFog;
float4 vecFogColor;
float4 vecLight;
float4 vecColor;

float4 vecSkill41; // used to controll wireframe color

texture entSkin1;

sampler ColorSampler = sampler_state
{
	Texture = <entSkin1>;
	Mipfilter = None;
	Minfilter = None;
	Magfilter = None;
};

void VS(
in float4 inposition : POSITION,
in float3 innormal : NORMAL,
in float4 intex1 : TEXCOORD0,
in float4 intex2 : TEXCOORD1,
out float4 outposition : POSITION,
out float4 outcolor : COLOR0,
out float3 outnormal : TEXCOORD0,
out float4 outtex : TEXCOORD1,
out float4 outworldPos : TEXCOORD2)
{
	inposition.w = 1.0f;
	outposition = mul(inposition, matWorldViewProj);
	
	outnormal = normalize(mul(innormal, (float3x3)matWorld));
	outtex.xy = intex1.xy;
	outtex.zw = intex2.xy;
	outworldPos = mul(inposition, matWorld);
	
	// no lightning
	outcolor = float4(vecColor.xyz, vecLight.w);
}

float4 PS(
float4 color : COLOR0,
float3 normal : TEXCOORD0,
float4 tex : TEXCOORD1,
float4 worldPos : TEXCOORD2) : COLOR0
{
	// hard edges (if needed)
	float3 dpdx = ddx(worldPos);
	float3 dpdy = ddy(worldPos);
	normal.xyz = normalize(cross(dpdy, dpdx));
	
	float4 textureColor = tex2D(ColorSampler, tex.xy);
	
	// darken surface on angle
	if(ANGLE_SURFACE_DARKEN > 0)
	{
		float3 vPixelToViewDir = normalize(vecViewPos.xyz - worldPos.xyz); // *** direction vector from the surface to the camera
		float dot_result = dot(vPixelToViewDir, normal.xyz); // *** get the angle ( cos(angle) ) between these vectors; both vectors in the dot product have to be normalized (length = 1)
		color.rgb *= saturate(1.0 - (1.0 - dot_result) * ANGLE_SURFACE_DARKEN); // *** apply the darkening factor with adjustable intensity; saturate() to prevent negative numbers (and numbers > 1)
	}
	
	// add texture to the color
	color.rgb *= textureColor.rgb;
	
	// fog part
	// just remove this 3 lines to remove the fog
	float fDepth = distance ( vecViewPos.xyz, worldPos.xyz );
	float Fog = saturate ( ( fDepth - vecFog.x ) * vecFog.z );
	color.rgb = lerp ( color.rgb, vecFogColor, Fog );
	color.a = 1;
	
	return color;
}

void WR_VS(
in float4 inposition : POSITION,
out float4 outposition : POSITION)
{
	// dirty trick to draw wiraframes 
	// above the actual solid polygons
	inposition.w = 0.998f;
	outposition = mul(inposition, matWorldViewProj);
}

float4 WR_PS(
float4 color : COLOR0,
float4 worldPos : TEXCOORD2) : COLOR0
{
	// change wireframe color with vecSkill41...43
	color.rgb = vecSkill41.xyz;
	
	// fog for wireframes
	// just remove this 3 lines to remove the fog
	float fDepth = distance ( vecViewPos.xyz, worldPos.xyz );
	float Fog = saturate ( ( fDepth - vecFog.x ) * vecFog.z );
	color.rgb = lerp ( color.rgb, vecFogColor, Fog );
	color.a = vecSkill41.w; // alpha value of the wireframe
	
	return color;
}

technique
{
	pass pass0 // first draw the solid model with hard edges
	{
		ZWriteEnable = True;
		AlphaBlendEnable = False;
		AlphaTestEnable = False;
		AlphaFunc = ALWAYS;
		Fillmode = SOLID;
		
		VertexShader = compile vs_3_0 VS(); 
		PixelShader  = compile ps_3_0 PS(); 
	}
	
	pass pass1 // then draw wireframes
	{
		ZWriteEnable = True;
		AlphaBlendEnable = True;
		AlphaTestEnable = False;
		AlphaFunc = Greater;
		Fillmode = Wireframe;
		
		VertexShader = compile vs_2_0 WR_VS(); 
		PixelShader = compile ps_2_0 WR_PS();
	}
}

technique fallback { pass one { } }

ball.mdl is the one from "GStudio8\templates\models" folder.
Model's color is controller directly by ent->blue, green, red values. Wireframe color is controlled by ent->skill41, 42, 43 (red, green, blue)

Greets.

Last edited by 3run; 11/10/20 15:54. Reason: added alpha support for wireframes

Looking for free stuff?? Take a look here: http://badcom.at.ua
Support me on: https://boosty.to/3rung