Jump to content

Rendering a line


drazuam

Recommended Posts

Okay guys.  I'm throwing in the towel.  I'm a bit nooby, and I want to make a HUD mod.  Basically, I just need a way to render a line to the screen.  This line also needs to exist in three-dimensional space.

 

I've figured out how to actually render the line.  Thats not a huge issue ->

 

My problem is that once it's rendered, it's incredibly shaky.  I mean, REALLY shaky.

 

Have some code.  As of right now, everything is in a really basic state.  Mostly, I'm just trying to get the fundamental mechanics of it to work, then I'm going to make it functional.  As of right now, it just renders it to (9,9,9).

 

base mod:

package dmp.Charles;

import net.minecraft.client.Minecraft;
import net.minecraft.src.BaseMod;
import net.minecraftforge.event.ForgeSubscribe;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.network.NetworkMod;
import dmp.utils.CommonProxy;
import dmp.utils.ClientProxy;

@Mod(modid="Charles", name="Charles map and logging system", version="0.1.0")
@NetworkMod(clientSideRequired=true, serverSideRequired=false)
public class Charles extends BaseMod {

	LineRenderer lineRenderer;

	public Charles ()
	{

	}

        // The instance of your mod that Forge uses.
        @Instance("Charles")
        public static Charles instance;
        
        // Says where the client and server 'proxy' code is loaded.
        @SidedProxy(clientSide="dmp.utils.ClientProxy", serverSide="dmp.utils.CommonProxy")
        public static CommonProxy proxy;

        
        @EventHandler
        public void preInit(FMLPreInitializationEvent event) {
                // Stub Method
        }
        
        @EventHandler
        public void load(FMLInitializationEvent event) {
                proxy.registerRenderers();
        }
        
        @EventHandler
        public void postInit(FMLPostInitializationEvent event) {
                // Stub Method
        }
        
        @ForgeSubscribe
        public void load()
        {}

	@Override
	public String getVersion() {
		// TODO Auto-generated method stub
		return null;
	}

}

 

 

Client Proxy:

 

package dmp.utils;

import cpw.mods.fml.common.registry.TickRegistry;
import net.minecraft.client.Minecraft;
import net.minecraftforge.client.MinecraftForgeClient;
import net.minecraftforge.common.MinecraftForge;
import dmp.utils.CommonProxy;
import dmp.Charles.LineRenderer;

public class ClientProxy extends CommonProxy {
        
        @Override
        public void registerRenderers() {
        	 MinecraftForge.EVENT_BUS.register(new LineRenderer(Minecraft.getMinecraft()));
        	 
        }
        

        
        
}

 

 

Line Renderer:

 

package dmp.Charles;

import net.minecraft.client.Minecraft;
import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.client.event.RenderWorldLastEvent;
import net.minecraftforge.event.ForgeSubscribe;

import org.lwjgl.opengl.GL11;

public class LineRenderer {


private Minecraft mc;

public LineRenderer(Minecraft mc)
{
	super();
	this.mc = mc;
}

@ForgeSubscribe
public void render(RenderWorldLastEvent event)
{
double doubleX = mc.thePlayer.posX - 0.5;
double doubleY = mc.thePlayer.posY + 0.12;
double doubleZ = mc.thePlayer.posZ - 0.5;

GL11.glPushMatrix();
GL11.glDisable(GL11.GL_LIGHTING);
GL11.glDisable(GL11.GL_TEXTURE_2D);
GL11.glDisable(GL11.GL_DEPTH_TEST);


GL11.glLineWidth(6);
GL11.glTranslated(-doubleX, -doubleY, -doubleZ);
GL11.glColor3ub((byte)253,(byte)0,(byte)0);
float mx = 9;
float my = 9;
float mz = 9;
GL11.glEnable(GL11.GL_LINE_SMOOTH);
GL11.glHint( GL11.GL_LINE_SMOOTH_HINT, GL11.GL_NICEST );
GL11.glBegin(GL11.GL_LINE_STRIP);

GL11.glVertex3f(mx+0.5f,my,mz+0.5f);
GL11.glVertex3f(mx-0.5f,my,mz+0.5f);
GL11.glEnd();
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glEnable(GL11.GL_DEPTH_TEST);
GL11.glPopMatrix();
}

}

Link to comment
Share on other sites

openGL isn't really good at rendering lines, do you think there could be another way to do that? what are you trying to do exactly ?, liek whats the goal behign drawing a line in the world

how to debug 101:http://www.minecraftforge.net/wiki/Debug_101

-hydroflame, author of the forge revolution-

Link to comment
Share on other sites

The problem you're having is that the update intervals of rendering and the player movement are different. The player position is changed each 1/20s, but your line rendering is updated every render frame (which is usually much faster than the 1/20s). Say you're doing a render at the half of a tick time passed. What you have to basically do is starting with the current position of the player at the current tick, and subtract the old position of the player from the previous (server) tick. if you then multiply this by how much you're 'in' the current tick  (0.5 in this case) you have the average of the two. Take a look at this code snippet to see what I mean:

 

double playerX = player.prevPosX + (player.posX - player.prevPosX) * event.partialTicks; 
double playerY = player.prevPosY + (player.posY - player.prevPosY) * event.partialTicks;
double playerZ = player.prevPosZ + (player.posZ - player.prevPosZ) * event.partialTicks;

Like you can see, the variable holding the value telling you how far you are in the current tick is called a 'partial tick', and can be retrieved from the RenderWorldLast event.

  • Like 1

Author of PneumaticCraft, MineChess, Minesweeper Mod and Sokoban Mod. Visit www.minemaarten.com to take a look at them.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.